Python Requests及Scrapy无法访问浏览器可正常打开的站点该如何处理
访问该类受反爬保护站点的注意事项
核心原因是这类电商站点部署了完善的反爬虫防护机制,浏览器的访问特征符合其校验规则,而默认配置的requests/Scrapy请求特征会被识别拦截,访问时需要注意以下事项:
完整模拟浏览器请求头
默认requests/Scrapy会携带特征明显的默认UA(比如python-requests/2.31.0、Scrapy/2.11.0),会被反爬系统直接识别拦截,需要替换为真实浏览器的User-Agent,同时补全Accept、Accept-Language、Referer、sec-ch-ua系列等所有浏览器实际发送的请求头。
示例请求头参考:headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1" }处理TLS指纹校验
目前多数电商站点会通过JA3/JA4指纹识别请求客户端类型,默认requests/Scrapy的TLS握手特征和浏览器差异极大,即使修改了请求头也会被拦截,出现无响应、超时的情况。
解决方案:requests侧可以使用curl_cffi、tls-client等支持模拟浏览器TLS指纹的库替代原生requests;Scrapy侧可以接入scrapy-impersonate下载中间件,直接模拟Chrome、Edge等主流浏览器的完整指纹。配置Cookie管理
站点首次访问通常会下发校验Cookie,后续请求需要携带该Cookie才能正常访问,requests可以使用Session()对象自动管理Cookie,Scrapy开启配置项COOKIES_ENABLED = True即可。配置合理的超时和请求频率
原生requests默认不设置超时时间会导致请求被拦截后永久挂起,必须手动添加timeout参数,示例:requests.get(url, headers=headers, timeout=15);Scrapy可以通过DOWNLOAD_TIMEOUT = 15配置全局超时时间。
站点通常有请求频率限制,短时间高频请求会触发IP封禁,需要添加请求间隔:requests侧加time.sleep()设置等待时长,Scrapy侧配置DOWNLOAD_DELAY = 2(单位为秒,可按需调整),高频访问建议搭配代理IP池轮换IP。处理JS类校验
部分站点首次访问会弹出人机验证,需要执行JS生成验证参数或Cookie才能正常访问,简单的请求模拟无法通过,可根据需求选择无头浏览器模拟完整浏览器行为,或者逆向JS校验逻辑自行生成对应参数。
内容的提问来源于stack exchange,提问作者Ibtsam Ahmad
相关产品推荐
相关产品推荐

