• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

David Pintassilgo

urllib2, como é que isto se usa?

35 mensagens neste tópico

Boas.

Ando a ver se precebo alguma coisa sobre o assunto:

Indicaram-me este pequeno exemplo

import urllib2
page = urllib2.urlopen(http://google.com).read()
titulo = re.findall('<TITLE>(.*?)</TITLE>',page)

Isso deu uns erros e eu lá meti isto assim:

import urllib2, re
page = urllib2.urlopen('http://google.com').read()
titulo = re.findall('<TITLE>(.*?)</TITLE>',page)
print titulo

Supostamente havia de me devolver o titulo da pagina,certo? Mas a unica coisa que 'ele' me 'diz' é

[]

O que é que está mal?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se olhares para o source da página, vês que o <TITLE> está em minúsculas. Por isso,

titulo = re.findall('<title>(.*?)</title>', page)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:-[ :) Obrigado.

Já agora ajuda-me a ler/interpretar esta parte:

'<title>(.*?)</title>'

Significa que vai procurar onde está    <title>    e      </title>        e o    (.*?) significa propriamente o que? é uma forma de 'o gajo' saber que "é isto aqui que é para vir buscar",.. é isso?

Não sei se me fiz entender...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(.*?) é "matchar tudo até ao primeiro". :D

Mas não te posso ajudar mt mais, não sei regex. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Soubes-te mais que suficiente para terminar a minha aflição! :D

Estava a começar e já estava a desmoralizar! :D

vou continuar a investigar,... já cá venho chatear mais...

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é que está mal?

O facto de estares a usar expressões regulares. ;)

Em relação ao (.*?)

O . significa qualquer coisa

O * significa zero ou mais vezes

Portanto .* significa qualquer coisa zero ou mais vezes, basicamente qualquer texto.

O problema é que o .* (como o .+, etc) são greedys e comem tudo o que lhes aparece. Portanto no teu caso se tivesses apenas o (.*) nunca iria fazer match, porque o (.*) ia comer tudo e depois a parte do "</title>" não ia fazer match porque já não sobrava nada da string. A parte do "</title>" tinha sido feito match com o (.*)

E é para isso que usas o '?'. Torna o (.*) que é greedy em lazy e só come o mínimo que é preciso.

Deu para perceber? Não me parece que a explicação esteja muito clara, mas prontos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Percebi mais ou menos.

as  aspas é para dizer que lá dentro vai estar a ordem do que 'o gajo' vai fazer. e o .* ou .*? é isso que explicas-te.

Agora tenho outro problema, é que a informação que eu quero está numa área restrita do site, ou seja, preciso de fazer login para lá chegar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Betovsky, explicaste bem excepto na parte do ponto de interrogação.

O ponto de interrogação modifica o caracter de forma a que este não seja greedy. Mas a definição de greedy não é bem essa.

Por exemplo, neste caso '<title>(.*)</title>' ia funcionar tambem. No caso dele não funcionou foi porque ele tinha posto maiusculas e a pagina que ele estava a testar tinha minusculas.

Greedy significa que tenta apanhar o máximo possivel. Neste caso o máximo possivel é o mesmo que o mínimo.

Mas se o texto fosse qq coisa como

<title>blablablasmdlasbdkjba</title>xpto</title>...

então aí já fazia diferença.

a expressão regular: '<title>(.*?)<title>' ia apanhar:

blablablasmdlasbdkjba

enquanto que a expressão '<title>(.*)<title>' ia apanhar:

blablablasmdlasbdkjba</title>xpto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"enquanto que a expressão '<title>(.*?)<title>' ia apanhar:" <- tens aí um ? a mais ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

yaps, obrigado, corrigido.

E já está o pessoal a aprender regex ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

yaps, obrigado, corrigido.

E já está o pessoal a aprender regex :D

Algum dia havia de ser. ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não. Estuda o sistema de login e obtem os dados dessa maneira. Acho que pus na secção de PHP algo parecido para o deviantART.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não. Estuda o sistema de login e obtem os dados dessa maneira. Acho que pus na secção de PHP algo parecido para o deviantART.

Djthyrax, uma vez que já experimentaste, como é que estas bibliotecas tratam da sessão?

Tipo... se fizeres dois pedidos, são uas sessões diferentes?

Se for a mesma sessão então basta-lhe fazer o pedido post com o user e a pass,e depois sacar o header para ver para onde é redirecionado.

Ou é preciso escrever algum código por causa da sessão?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não. Estuda o sistema de login e obtem os dados dessa maneira. Acho que pus na secção de PHP algo parecido para o deviantART.

Djthyrax, uma vez que já experimentaste, como é que estas bibliotecas tratam da sessão?

Tipo... se fizeres dois pedidos, são uas sessões diferentes?

Se for a mesma sessão então basta-lhe fazer o pedido post com o user e a pass,e depois sacar o header para ver para onde é redirecionado.

Ou é preciso escrever algum código por causa da sessão?

No devianART? Basta fazer um POST ao URI /users/login (acho que é este) no host www.deviantart.com e guardar o cookie userinfo, algo assim. Este cookie é um serialize() em PHP. Depois, é só mandar o header do cookie em todos os requests. ;)

Aqui vai um script que, se a memória não me falha, faz isso: http://botdom.com/wiki/DANote

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mmm... ok... tou a ver o esquema.

E para páginas que não usem cookies, alguem sabe se a sessão é mantida?

Bem, mas se o sysemp usar cookies aí tens david.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mmm... ok... tou a ver o esquema.

E para páginas que não usem cookies, alguem sabe se a sessão é mantida?

Bem, mas se o sysemp usar cookies aí tens david.

Raw HTTP authentication?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mmm... ok... tou a ver o esquema.

E para páginas que não usem cookies, alguem sabe se a sessão é mantida?

Bem, mas se o sysemp usar cookies aí tens david.

Raw HTTP authentication?

Acho que te estas a referir a paginas que utilizam por exemplo o .htaccess certo?

Mas pore exemplo, o system empires tem o seu sistema proprio de autenticação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mmm... ok... tou a ver o esquema.

E para páginas que não usem cookies, alguem sabe se a sessão é mantida?

Bem, mas se o sysemp usar cookies aí tens david.

Raw HTTP authentication?

Acho que te estas a referir a paginas que utilizam por exemplo o .htaccess certo?

Mas pore exemplo, o system empires tem o seu sistema proprio de autenticação.

Tens dois tipos de autenticação mais utilizados:

-> "Raw HTTP authentication", mais conhecido na forma de http://utilizador:password@hostname/uri ou então usando o exemplo do htaccess que referiste

-> Sessões, o caso do deviantART e do System Empires. Há diversos sistemas de autenticação deste tipo, mas TODOS assentam em cookies ou parâmetros de GET para te identificar.

Para o segundo tipo, a diferença é apenas o que tens de enviar e o que tens de guardar em específico porque a forma como funcionam é sempre o mesmo.

EDIT: Typo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é preciso usares cookies ou parametros GET. Na verdade nunca entendi qual é a ideia de passar a SID por get como alguns foruns fazem, se alguem me souber explicar a finalidade disso agradeço.

Eu não gosto de usar cookies, ate agora sempre que fiz um sistema de autenticação simplesmente guardo os dados na sessão e uso uma variavel para indicar o estado do utilizador, se não estiver autenticado, mando-o à fava.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é preciso usares cookies ou parametros GET. Na verdade nunca entendi qual é a ideia de passar a SID por get como alguns foruns fazem, se alguem me souber explicar a finalidade disso agradeço.

Eu não gosto de usar cookies, ate agora sempre que fiz um sistema de autenticação simplesmente guardo os dados na sessão e uso uma variavel para indicar o estado do utilizador, se não estiver autenticado, mando-o à fava.

O uso de sessões do PHP assenta em cookies OU em parâmetros de GET caso o cliente não suporte/aceite cookies. A passagem do SID por GET é exactamente por motivos de compatibilidade. :D

O uso de cookies não implica espetares lá com user IDs, passwords e afins. Se não usares parâmetros GET/POST ou cookies, como vais guardar um identificador de uma sessão para outra? Vais assentar em cima de referers, IPs, User-Agents e teres o dobro do trabalho?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para que é que precisas de guardar um identificador de uma sessão para a outra?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para que é que precisas de guardar um identificador de uma sessão para a outra?

Alguma vez estudaste o sistema de sessões do PHP? O que aquilo faz é:

Se o cliente aceita cookies, envia um cookie com o nome ini_get("sess.cookie") (algo assim) com o valor session_id(). Caso contrário, redirecciona para o mesmo URI mas com o parâmetro de nome ini_get("sess.cookie") com o valor session_id().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mmm...

não sabia que isso funcionava assim. Nunca me preocupei com isso, mas realmente tinha que ser qualquer coisa assim.

Então basicamente ele tem que sacar o SID do cookie ou dos headers.

Então... uma hipotese é ele definir a user agent como um cliente sem cookies e sacar a SID do url de redirecionamento que está definido nos headers :D

Aqui está uma coisa que eu devia ter aprendido há muito tempo.

Já agora aproveito e satisfaço a minha curiosidade em pleno. Como é que o cookie é enviado? no mesmo pacote http? noutro? através de otro protocolo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É pá,.. tenho andado a vasculhar umas cenas e fiz isto assim:

import mechanize
br = mechanize.Browser()
br.open("http://www.portugal-a-programar.org/forum/index.php?action=login")
br.select_form(nr=0)
br["user"] = "d_pintassilgo"
br["passwrd"] = "xxxxxx"
response1 = br.submit()
fc = response1.read()
print fc

E 'o gajo' devolveu-me o que julgo ser o código da pagina no fim de o login efectuado. Entrei no fórum sem ser como d_pintassilgo pelo FF normalmente e realmente o user d_pintassilgo logou-se por intermédio do python.

Não será por aqui o caminho ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora