【问题标题】:What's wrong with my requests.Session for python crawler?python 爬虫的 requests.Session 有什么问题?
【发布时间】:2016-04-12 13:20:32
【问题描述】:

我正在为 www.researchgate.net 编写爬虫程序,但似乎我会永远卡在登录页面中。

这是我的代码:

import requests
from bs4 import BeautifulSoup

session = requests.Session()

params = {'login': 'my_email', 'password': 'my_password'}
session.post("https://www.researchgate.net/application.Login.html", data = params)
s = session.get("https://www.researchgate.net/search.Search.html?type=researcher&query=zhang")
print BeautifulSoup(s.text).title

有人能发现我的代码有什么问题吗?为什么s每次都重定向到登录页面?

【问题讨论】:

  • 您没有为认证提供所有信用。在您的浏览器中检查您发送到网络以进行连接的内容

标签: python web-crawler python-requests


【解决方案1】:

可能需要提供登录表单中的隐藏字段(我无法测试 - 我没有登录)。

一个是request_token,它设置为一个长的base64编码字符串。其他是 invalidPasswordCountloginCookie,这可能也是必需的。

此外,还有一个会话 cookie,您可能需要将其与登录凭据一起发送。

要完成这项工作,需要一个初始的GET 来获取request_token,您需要以某种方式提取它 - 例如用美丽的汤。如果您使用 requests 会话,则 cookie 将显示在以下 POST 中,因此您无需担心。

import requests
from bs4 import BeautifulSoup

session = requests.Session()

# initial GET to retrieve token and set cookies
r = session.get('https://www.researchgate.net/application.Login.html')
soup = r.BeautifulSoup(r.text)
request_token = soup.find('input', attrs={'name':'request_token'})['value']

params = {'login': 'my_email', 'password': 'my_password', 'request_token': request_token, 'invalidPasswordCount': 0, 'loginCookie': 'yes'}
session.post("https://www.researchgate.net/application.Login.html", data=params)
s = session.get("https://www.researchgate.net/search.Search.html?type=researcher&query=zhang")
print BeautifulSoup(s.text).title

【讨论】:

  • 哇!谢谢!我终于成功登录了!
【解决方案2】:

感谢mhawke,我按照他的建议修改了我原来的代码,终于登录成功了。

这是我的新代码:

import requests
from bs4 import BeautifulSoup

session = requests.Session()
loginpage = session.get("https://www.researchgate.net/application.Login.html")
request_token = BeautifulSoup(loginpage.text).form.find("input",{"name":"request_token"}).attrs["value"]
print request_token
params = {"request_token":request_token,
          "invalidPasswordCount":"0",
          'login': 'my_email', 
          'password': 'my_password',
          "setLoginCookie":"yes"
          }
session.post("https://www.researchgate.net/application.Login.html", data = params)
#print s.cookies.get_dict()
s = session.get("https://www.researchgate.net/search.Search.html?type=researcher&query=zhang")
print BeautifulSoup(s.text).title

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多