Como usar o Python para acessar uma página da Web e recuperar cookies para uso posterior?


146

Quero baixar e analisar a página da Web usando python, mas para acessá-la, preciso de um conjunto de cookies. Portanto, preciso fazer login através de https na página da web primeiro. O momento do login envolve o envio de dois parâmetros POST (nome de usuário, senha) para /login.php. Durante a solicitação de login, desejo recuperar os cookies do cabeçalho da resposta e armazená-los para que eu possa usá-los na solicitação para baixar a página da Web /data.php.

Como eu faria isso em python (de preferência 2,6)? Se possível, eu quero apenas usar módulos internos.

Respostas:


147
import urllib, urllib2, cookielib

username = 'myuser'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
opener.open('http://www.example.com/login.php', login_data)
resp = opener.open('http://www.example.com/hiddenpage.php')
print resp.read()

resp.read()é o html direto da página que você deseja abrir e pode ser usado openerpara exibir qualquer página usando o cookie de sessão.


1
Isso é seguro? Isso não permitirá que os farejadores de pacotes vejam senhas em texto sem formatação? Usar Https seria mais seguro?
Heartinpiece

2
@ Heartinpiece Sim, se o servidor oferecer, você deve usar HTTPS.
Harley Holcombe

Obrigado ... mas imaginamos que fizemos o login e queremos postar sth ... como definir coockie neste tópico para publicar dados?
MLSC

É altamente recomendável usar a biblioteca de solicitações se você estiver escrevendo um código grande. (experiência pessoal)
swapnil jariwala

157

Aqui está uma versão usando a excelente biblioteca de solicitações :

from requests import session

payload = {
    'action': 'login',
    'username': USERNAME,
    'password': PASSWORD
}

with session() as c:
    c.post('http://example.com/login.php', data=payload)
    response = c.get('http://example.com/protected_page.php')
    print(response.headers)
    print(response.text)

3
É 'action': 'login'realmente necessário neste exemplo ou é apenas um parâmetro extra enviado com a solicitação?
Ted

1
@Ted Essa parte é totalmente necessária.
Sanghyun Lee 16/03/2015

@Ted Talvez seja necessário neste exemplo em particular. Não era necessário no meu programa.
Highstaker

É o melhor que eu conheço. Você pode precisar de dados conforme o site.
Jithin Pavithran
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.