爬取忽略自定义请求头网站:crimegrade.org Cookie报错解决
问题原因
你遇到的Please enable cookies提示不是站点本身的常规cookie校验,是站点前置的Cloudflare(CDN/反爬服务)拦截返回的内容。你代码里硬编码的_ga、_gid是谷歌统计的用户标识cookie,完全不是Cloudflare校验需要的核心凭证;同时裸requests.get不会自动维护跨请求的cookie,也无法执行Cloudflare挑战要求的JS逻辑,自然拿不到合法的校验cookie,被判定为异常爬虫请求。
可行解决方案
- 优先使用
requests.Session()会话对象自动维护cookie链路:不要手动写死固定cookie值,先访问站点根域名拿到Cloudflare自动下发的合法cookie,再发起目标页请求,参考实现如下:
import requests test_url = 'https://crimegrade.org/safest-places-in-60629/' # 初始化会话,自动存储、携带全流程产生的cookie session = requests.Session() # 配置基础请求头,移除硬编码的无效cookie字段 session.headers.update({ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'en-US,en;q=0.9', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36' }) # 先访问站点首页,触发Cloudflare校验,自动留存合法cookie session.get('https://crimegrade.org/', timeout=15) # 携带合法cookie请求目标页面 resp = session.get(test_url, timeout=15) print(resp.status_code, resp.text)
- 如果上述方案仍被拦截,说明站点开启了Cloudflare的JS挑战等级:裸requests不具备JS执行能力,无法计算出挑战要求的动态cookie值,需要替换为支持自动执行JS、绕过Cloudflare校验的请求工具,模拟真实浏览器的JS运行环境完成挑战后再抓取内容。
- 调整请求头配置逻辑:不要一次性堆砌所有你从浏览器里复制的请求头,比如
sec-fetch-*、referer、cache-control这类字段如果和请求链路不匹配,反而会被判定为爬虫特征,首次请求只保留最基础的accept、accept-language、user-agent即可,等拿到合法cookie后再按需补充头信息。
注意:不要复用过期或者从其他环境复制的固定cookie值,Cloudflare的校验cookie和请求IP、客户端指纹强绑定,跨环境复制的cookie100%无法通过校验。
内容的提问来源于stack exchange,提问作者Sean McGrady
相关产品推荐
相关产品推荐

