我正在尝试处理请求(python 3.4)来创建一个会话,我登录gamefaqs.com并导航到一个棋盘页面,以便我可以删除内容以获取我正在尝试的相关信息去完成。我直接从firefox中的开发者控制台复制了头和有效负载信息。
import requests
import urllib3
url = 'http://www.gamefaqs.com/user/login'
url2 = 'http://www.gamefaqs.com/user/Leight_Weight/boards'
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.5',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
'Referer': 'http://www.gamefaqs.com/',
'Connection': 'keep-alive',
'Host': 'www.gamefaqs.com',
}
payload = {
'path': "http://www.gamefaqs.com/",
'key': "71548de4",
'EMAILADDR': "username",
'PASSWORD': "password",
}
with requests.Session() as s:
p = s.get(url, headers=header)
p = s.post(url, headers=header, data=payload, cookies = s.cookies)
我遇到的问题是我没有收到从网站传递到我的会话的身份验证cookie。我正在使用fiddler来跟踪来自Python的帖子请求。尽管请求头信息与firefox中的请求头信息相同,但响应头信息却大不相同。
来自firefox的响应头(由Fiddler看到): Firefox Response Header
来自Python的响应头(由Fiddler看到): Python Response Header
此时我有点失落。据我所知,我的代码是合理的,请求标头是正确的,但是没有收到验证cookie证明有问题。如果查看响应头,则代码不同(302 vs 200)。我不确定错误是什么。
答案 0 :(得分:0)
事实证明 - 有效负载项'键'根据您的会话而变化。我最初没有抓住这个,因为我没有想到浏览器通过打开/关闭使用持久性cookie的事实,这个解决方案没有使用。
我使用BeautifulSoup做了一些严谨的方法来找到正确的键值,但结果保持不变。一旦我获得了适当的密钥值,我就会在执行post命令和中提点之前将其添加到有效负载中 - 成功登录。
为了后人,代码如下。
import requests
from bs4 import BeautifulSoup as bs
url = 'http://www.gamefaqs.com/user/login'
url2 = 'http://www.gamefaqs.com/user/Leight_Weight/boards'
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.5',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
'Referer': 'http://www.gamefaqs.com/',
'Connection': 'keep-alive',
'Host': 'www.gamefaqs.com',
}
payload = {
'PASSWORD': "password",
'path': "http://www.gamefaqs.com/",
'EMAILADDR': "username",
}
with requests.Session() as s:
resp = s.get(url, headers=header)
parse = bs(resp.text)
keyval = parse.find_all('form')[1].contents[1]['value']
payload['key'] = keyval
p = s.post(url, headers=header, data=payload)