如何在 Python 请求中使用 cookie?
- 2025-02-28 08:22:00
- admin 原创
- 74
问题描述:
我正在尝试登录一个页面并访问该页面中的另一个链接。
我在这次尝试中收到“405 不允许”错误:
payload={'username'=<username>,'password'=<password>}
with session() as s:
r = c.post(<URL>, data=payload)
print(r)
print(r.content)
我使用 Chrome 开发者工具检查了发布方法的详细信息,发现一个 URL 似乎是 API 端点。我使用有效负载向该 URL 发送了消息,它似乎有效;我得到的响应与我在开发者工具中看到的类似。
不幸的是,登录后尝试“获取”另一个 URL 时,我仍然会获取登录页面的内容。为什么登录不成功?我应该使用 cookie 吗?如何使用?
解决方案 1:
您可以使用会话对象。它存储 cookie,以便您可以发出请求,并为您处理 cookie
s = requests.Session()
# all cookies received will be stored in the session object
s.post('http://www...',data=payload)
s.get('http://www...')
文档:https://requests.readthedocs.io/en/master/user/advanced/#session-objects
您还可以将 cookie 数据保存到外部文件,然后在每次运行脚本时重新加载它们以保持会话持久,而不必登录:
如何将请求(python)cookie保存到文件?
解决方案 2:
来自文档:
从响应中获取 cookie
url = 'http://example.com/some/cookie/setting/url'
r = requests.get(url)
r.cookies
{'example_cookie_name': 'example_cookie_value'}
在后续请求时将 cookie 返回给服务器
url = 'http://httpbin.org/cookies'
cookies = {'cookies_are': 'working'}
r = requests.get(url, cookies=cookies)`
解决方案 3:
摘要(@Freek Wiekmeijer,@gtalarico)其他人的回答:
登录逻辑
许多资源(页面、api)需要
authentication
,才可以访问,否则401
=Unauthorized
常见的
authentication
方法grant access
有:cookie
auth header
Basic xxx
Authorization xxx
如何使用cookie
进行requests
身份验证
首先获取/生成 cookie
发送 cookie 以进行后续请求
手动
cookie
设置headers
cookie
自动处理requests
session
自动管理 Cookieresponse.cookies
手动设置 Cookie
使用requests
自动session
管理 cookies
curSession = requests.Session()
# all cookies received will be stored in the session object
payload={'username': "yourName",'password': "yourPassword"}
curSession.post(firstUrl, data=payload)
# internally return your expected cookies, can use for following auth
# internally use previously generated cookies, can access the resources
curSession.get(secondUrl)
curSession.get(thirdUrl)
手动requests
控制response.cookies
payload={'username': "yourName",'password': "yourPassword"}
resp1 = requests.post(firstUrl, data=payload)
# manually pass previously returned cookies into following request
resp2 = requests.get(secondUrl, cookies= resp1.cookies)
resp3 = requests.get(thirdUrl, cookies= resp2.cookies)
解决方案 4:
正如其他人指出的那样,这里有一个如何将 cookies 作为字符串变量添加到 headers 参数的示例 -
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...",
"cookie": "_fbp=fb.1.1654447470850.2143140577; _ga=GA1.2.1...",
}
response = requests.get(url, headers=headers)
解决方案 5:
不幸的是,requests
不允许cookies
在中传递headers
,所以这种方法不起作用。Cookies 应该作为单独的参数传递r = requests.get(url, cookies=cookies)
扫码咨询,免费领取项目管理大礼包!