python-3.x - Pythons requests.session cookie 检索问题
问题描述
我正在尝试从网站上抓取数据,并且在使用 requests.session 时似乎无法从网站上获取 cookie。下面的代码更好地解释了
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
url = "https://www.nseindia.com"
r_without_headers = requests.get(url)
print("response code",r_without_headers.status_code)
print("Resp no header cookies ",r_without_headers.cookies.get_dict())
r_with_headers = requests.get(url,headers = headers)
print("response code",r_with_headers.status_code)
print("Resp with header cookies ",r_with_headers.cookies.get_dict())
s1 = requests.session()
s1_req = s1.get(url)
print("response code",s1_req.status_code)
print("Session no header Cookies ", s1.cookies.get_dict())
print("Session no header Response Cookies", s1_req.cookies.get_dict())
s2 = requests.session()
s2.headers = headers
s2_req = s2.get(url)
print("response code",s2_req.status_code)
print("Session with header Cookies ", s2.cookies.get_dict())
print("Session with header Response Cookies", s2_req.cookies.get_dict())
输出
response code 200
Req no header cookies {}
response code 200
Req with header cookies {'ak_bmsc': 'F4040D045001A7CD57BBC58C09C9117F174C9D8E21750000240B665BDDE23467~plhUo272BWU9CTPiQAEJgiZ07qX/BOE0n6iOU8y9pewbmXipo8de1YROpMw6AEtjQDgdt3x+M/2QDATjSAtaRiDVlsDGZfohfsymElg0Xpq0Uta3OYSOSe2B48eg2lJD0CMios+0eqatEro6XvEkYAy+4D14EUHAE/eRp5oVUOpVL6JR8WMNNFoE6Xo7xYQtfLFu8hS1sUNABrYkr6XNFGY3YnkZmawa7imZswMI4tICc='}
response code 200
Session no header Cookies {}
Session no header Request Cookies {}
response code 200
Session with header Cookies {}
Session with header Request Cookies {}
问题_
该网站显然需要用户代理集来提供 cookie,因此当我使用用户代理集发出获取请求时,我得到了预期的 cookie,而没有用户代理集我没有。
当我尝试对 requests.session 进行相同操作时,无论有无标题,我都没有得到响应 cookie?
问题_
为什么会这样?我是在错误地使用会话还是网站损坏了?(如果是这种情况,我不会感到惊讶)
如何使用会话获取 cookie?
我目前的解决方法是发送一个简单的获取请求,检索 cookie 并手动在会话中设置 cookie。但这似乎不正确,如果 cookie 在后续请求中被修改,则无法保证会话将更新 cookie,因为原始会话首先无法检索 cookie。我宁愿不使用裸请求编写我的整个代码并手动将 cookie 传输到后续请求。
解决方案
问题是你正在用headers
你自己的 dict 覆盖会话的对象(实际上它不是真正的 dict)。
相反,只需更新它:
s2.headers.update(headers)
例如
import requests
url = "https://www.nseindia.com"
s2 = requests.session()
s2.headers.update({'User-Agent': 'Mozilla/5.0'})
s2_req = s2.get(url)
print("Session with header Cookies ", s2.cookies.keys())
愉快地输出
Session with header Cookies ['ak_bmsc']
推荐阅读
- javascript - 使用Javascript获取提交按钮的父表单
- django - 查询数据库并为每个结果返回复选框
- node.js - 如何在页面刷新时存储和检索复选框状态?Mongoose/EJS/Nodejs/Express
- css - 在 Nebular 聊天 UI 中隐藏发件人姓名
- android - Android避免在圆角上绘图
- macos - 在 MacOS 上是否有替代 usermod 的方法?
- spring-boot - Spring JPA:如何在多对多关系中将父子对象作为嵌套对象
- python - 获取特定格式的数据框
- android - 材料芯片文字大小被忽略
- python - 如何在 Flask 中调用另一个函数