Python中写爬虫使用cookie时,有哪些关键知识点需要掌握?

RT,urllib 库, 在爬一个论坛的帖子详情的时候,只得到一堆加密的 JS 代码。忍着没问,捣鼓了几天,解密 js,发现是实现重定向的,并生成两个 cookie。并且发现是否要求重定向是和 cookie 有关,浏览器正常访问,保存了 cookie 就不会要求重定向,删除 COOKIE,关闭 js,就卡在了重定向页面。
因此先使用 selenium 获取了 cookie,按照 MozillaCookieJar 的格式保存。这时候有 11 个 cookie,应该都是 js 生成的。然后 urllib 加载。单次测试成功了,没有重定向。但是加代理,多开了几个线程,使用同一个 cookie,就各种失败。
因此问题来了:
1、还要分析 cookie 到底是干嘛的,如何入门 cookie 的相关知识。
2、本来用 selenium +chrome 也可以,但是加上 IP 代理后,好像网页从来没有打开过,全部失败。代理也验证过,虽然不能 100%使用,70%以上都可以用。甚至同样的代理,用 urllib 库就能正常获取数据。
Python中写爬虫使用cookie时,有哪些关键知识点需要掌握?


11 回复

要看你这个 js 的情况吧,1,先用代码请求,得到 js 用 requests_html 执行 js 看看 cookie 能不能生成(有的不行),2,和你说的类似,puppeteer 访问获取 cookie,再加到代码中执行 ,3,看 js 生成 cookie 逻辑,是否方便用 py 或 node 代码进行模拟,这个可以解决你那个代理问题,避免使用同一个 cookie,4,方便说下哪个论坛的 js 吗,想研究下


用Python写爬虫处理Cookie,关键就这几点:

  1. Cookie的本质:就是服务器发来的一小段文本,浏览器存着,下次请求自动带上。爬虫要模拟这个过程。

  2. requests库处理Cookie

    • 自动管理:用requests.Session(),像浏览器一样自动保存和发送Cookie。
      import requests
      s = requests.Session()
      s.get('http://example.com/login')  # 这里可能会设置Cookie
      r = s.get('http://example.com/dashboard')  # 自动带上Cookie
      
    • 手动设置:直接把Cookie字符串放到headers里。
      headers = {'Cookie': 'sessionid=abc123; csrftoken=xyz456'}
      requests.get(url, headers=headers)
      
    • 字典形式:用cookies参数更清晰。
      cookies = {'session_id': 'abc123'}
      requests.get(url, cookies=cookies)
      
  3. 从响应中获取Cookieresponse.cookies是个RequestsCookieJar对象,用起来像字典。

    r = requests.get(url)
    print(r.cookies.get('sessionid'))
    
  4. 处理复杂情况

    • 登录维持:一定要用Session对象,别每次请求都新建。
    • 动态Cookie:有些Cookie是JS生成的,这时候得用Selenium或Pyppeteer这类浏览器自动化工具。
  5. 注意点

    • 检查网站是否用HttpOnly的Cookie(这种不能用JS/document.cookie获取)。
    • 有些反爬虫会验证Cookie完整性,别乱改。
    • 记得设置合理的超时和错误处理。

总结:Session对象是主力,特殊场景上Selenium。

www.19lou.com 是否有办法定位 cookie 是哪段 js 生成的?

找到生成逻辑了,我尝试写下,一会告诉你

每个代理使用不用的 cookie 试试。

import requests
import re


headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36’,
‘Host’: ‘www.19lou.com
}
s = requests.session()
s.headers = headers
res = s.get(‘https://www.19lou.com/forum-269-thread-41401535624978493-1-1.html’)
redirect_url = res.url
result_cookie = re.search(r’substr|(.*?)|365’, res.text).group(1)
result_cookie = result_cookie.split(’|’)
s.cookies.update({result_cookie[0]: result_cookie[1]})
url = redirect_url.replace(‘https://www.19lou.com/safeRedirect.htm?’, ‘’)
res = s.get(url)
print(res.text)

你看看可以满足你要的要求了吗,本来我想用 execjs 执行返回的 js 的代码,但预期结果总是不符,我发现用 node 去执行,却总是正确的,后来我发现这个 cookie 的键值就存在于返回的 js 中,所以最后就直接提取了,我访问了两个链接,cookie 的键值总是不变,感觉这个 cookie 存在的意义不大啊,也可能还存在潜在的反爬

我也遇到这类的问题了,在爬大众点评商铺详细信息的时候,如果直接访问商铺信息详情页访问不到,必须先访问一次首页,在访问详情页就可以访问到,其中好像就是 COOkie 值被加密了,大佬可有解决方案,js 加密搞 2 天了,始终没有找到怎么生成的

用 requests 模块呀,用 session 来 get 和 post,根本不用考虑 cookies 的问题

我也是菜鸡呀,你把关键步骤或主要代码贴下,我试试,不然我找着麻烦,还有别的事

非常感谢。可以使用。

为什么不需要考虑?如果没有 cookie 的话就会要求到重定向页面,获取不到内容。

requests 库会自动处理重定向的,比自带的好用,反正用楼上那段就对了

回到顶部