Ir para o conteúdo
David Pintassilgo

urllib2, como é que isto se usa?

Mensagens Recomendadas

David Pintassilgo    5
David Pintassilgo

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
David Pintassilgo    5
David Pintassilgo

:-[ :) 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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
David Pintassilgo    5
David Pintassilgo

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...

;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
David Pintassilgo    5
David Pintassilgo

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djthyrax    11
djthyrax

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().

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
David Pintassilgo    5
David Pintassilgo

É 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 ?

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade