我的 requests.Session for python 爬虫有什么问题?

What's wrong with my requests.Session for python crawler?

我正在为 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每次都跳转到登录页面?

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

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

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

要完成这项工作,需要初始 GET 才能获得 request_token,您需要以某种方式提取它 - 例如BeautifulSoup。如果您使用 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

感谢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