如何使用Scrapy抓取受Cloudflare保护的craft.co/tesla站点
Scrapy爬取触发Cloudflare验证的解决方法
Cloudflare会通过请求头特征、TLS指纹、JavaScript运行环境等维度识别爬虫,默认Scrapy请求不符合浏览器特征就会触发验证,可按以下方案逐步排查解决:
方案1:修改基础请求参数匹配浏览器
- 替换默认Scrapy的User-Agent为你本地浏览器的真实UA,可在浏览器控制台「网络」标签任意请求的请求头中获取,在
settings.py中配置:
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
- 开启Cookie自动管理,在
settings.py设置COOKIES_ENABLED = True - 补充和浏览器一致的常规请求头,包括Accept、Accept-Language、Accept-Encoding等,避免特征差异过大
方案2:替换下载器解决TLS指纹识别问题
默认Scrapy使用的网络库TLS JA3指纹和真实浏览器差异极大,很容易被Cloudflare识别,推荐使用scrapy-playwright插件调用真实Chrome发起请求:
- 安装依赖:
pip install scrapy-playwright playwright install chromium
- 在
settings.py中添加下载器配置:
DOWNLOAD_HANDLERS = { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", } PLAYWRIGHT_LAUNCH_OPTIONS = { "headless": False, # 调试阶段使用有头模式,稳定后可改为True使用无头模式 "channel": "chrome", }
- 发起请求时添加playwright标记即可:
yield scrapy.Request( url="https://craft.co/tesla", meta={"playwright": True} )
该方案完全模拟真实Chrome的请求特征、支持JavaScript执行,可绕过绝大多数Cloudflare基础验证。
方案3:处理主动人机验证
如果触发了点击、滑块类的主动验证,可通过复用本地浏览器会话的方式跳过重复验证:
- 先手动在本地Chrome打开目标站点,完成一次Cloudflare验证
- 在playwright启动配置中添加本地浏览器用户数据目录参数:
PLAYWRIGHT_LAUNCH_OPTIONS = { "headless": False, "channel": "chrome", "args": [ "--user-data-dir=你的本地Chrome用户数据目录路径", # Windows路径一般为C:\Users\用户名\AppData\Local\Google\Chrome\User Data,Mac为/Users/用户名/Library/Application Support/Google/Chrome ] }
配置完成后Scrapy调用Chrome时会复用已经通过验证的Cookie和会话,无需重复验证。
内容的提问来源于stack exchange,提问作者nfon jeannoel
相关产品推荐
相关产品推荐

