Python requests访问Instagram时RequestsCookieJar为空的原因咨询
这其实是Instagram的反爬机制在搞鬼!我之前也碰到过类似的情况,给你拆解下原因和解决办法:
主要原因
- 默认请求头被识别为爬虫:
requests库默认的User-Agent是类似python-requests/2.31.0这种标识,Instagram的服务器会直接识别出这不是真实浏览器的请求,所以不会返回任何Cookie(或者返回的响应里不带Cookie)。而Facebook对这类默认UA的限制没那么严格,所以能正常拿到Cookie。 - 依赖JavaScript生成Cookie:部分网站的Cookie是通过前端JavaScript动态设置的,
requests是纯HTTP客户端,不会执行页面的JS代码,自然拿不到这类Cookie。Instagram可能就有这类需要JS生成的Cookie,而Facebook的基础Cookie可以通过纯HTTP请求获取。 - 反爬策略的拦截:Instagram的反爬系统会检查请求的完整性(比如是否有正确的Referer、Accept等请求头),不符合真实浏览器请求特征的话,就会拒绝返回Cookie,防止爬虫批量抓取数据。
解决办法
1. 伪装真实浏览器的请求头
最简单的办法就是给请求加上真实的User-Agent,模拟浏览器请求:
import requests s2 = requests.Session() # 这里用Chrome的UA,你也可以换成其他浏览器的 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } r2 = s2.get("https://www.instagram.com/", headers=headers) print(r2.cookies)
这样执行后,你应该能看到RequestsCookieJar里有内容了。
2. 使用浏览器自动化工具(如果需要JS生成的Cookie)
如果Instagram的某些Cookie必须通过JS生成,那requests就无能为力了,这时候可以用selenium或者playwright这类工具,它们会模拟真实浏览器的行为,执行页面JS,从而获取到完整的Cookie。
举个playwright的简单例子:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://www.instagram.com/") cookies = page.context.cookies() print(cookies) browser.close()
总结
本质就是Instagram的反爬机制比Facebook更严格,只要你把请求伪装得更像真实浏览器,就能拿到正常的Cookie啦!
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

