)
摘要做爬虫最搞心态的不是IP被封而是明明IP没问题请求发出去却永远卡在Cloudflare的“Checking your browser…”页面。市面上付费代理动辄几块/G对于个人开发者和小规模采集来说成本太高。本文不讲虚的理论直接分享我近期在抓取小红书、知乎时验证过的3种低成本甚至零成本过盾方案从浏览器指纹到TLS指纹总有一款适合你。⚠️ 免责声明本文仅供技术交流与安全研究请严格遵守目标网站的robots.txt协议及相关法律法规切勿用于非法用途。一、 为什么你的Requests总是被Cloudflare秒杀很多兄弟上来就用requests.get()或者简单的Selenium去爬结果发现连首页都进不去。其实Cloudflare的5秒盾JS Challenge早就不是简单的执行JS了它现在是一套组合拳TLS指纹检测这是90%的人忽略的点。Python的requests库底层是OpenSSL其TLS握手特征Cipher Suites、Extensions顺序和真实Chrome浏览器完全不同。CF看一眼握手包就知道你是脚本。HTTP/2 指纹真实浏览器的H2帧顺序、窗口大小更新策略是有特定规律的脚本很难模拟。Canvas/WebGL指纹无头浏览器Headless的渲染结果和真实显卡有差异。行为分析鼠标轨迹、滚动事件、Cookie生成耗时等。所以单纯换IP没用你得让你的脚本“看起来像人”。下面进入正题。二、 核心过盾思路流程图在选择方案前先看这张决策图避免走弯路低/中高否是YesNo遇到Cloudflare 5秒盾目标站点防护等级?方案1: DrissionPage/CurlCFFI是否需要渲染JS?方案2: TLS指纹伪装curl_cffi / tls-client方案3: 浏览器自动化DrissionPage接管优点: 轻量/免费/速度快优点: 纯协议层/并发高优点: 通杀/可见即可得是否通过?开始采集数据检查IP质量/切换策略三、 方案详解与实战代码方案1curl_cffi —— 解决TLS指纹的神器推荐首选如果你不需要渲染JS只是想拿API接口数据千万别用requests。curl_cffi是一个能完美模拟Chrome/Firefox TLS指纹的Python库它底层绑定了修改版的libcurl。适用场景知乎API、小红书Web端接口、大多数REST API。fromcurl_cffiimportrequestsascffi_requests# 关键参数impersonate 指定要模拟的浏览器版本# 这一步直接解决了TLS指纹不一致的问题sessioncffi_requests.Session(impersonatechrome124)urlhttps://www.zhihu.com/api/v4/search_v3?tgeneralqPython爬虫try:respsession.get(url)print(f状态码:{resp.status_code})# 如果返回200且内容是JSON说明过盾成功ifresp.status_code200:dataresp.json()print(f获取到{len(data.get(data,[]))}条结果)else:print(响应内容:,resp.text[:200])exceptExceptionase:print(f请求失败:{e}) 避坑指南impersonate的值不要写死建议维护一个列表随机切换如chrome120,chrome124,safari_ios。Cloudflare会定期封禁过旧的指纹版本。另外这个库对Windows环境依赖较多Linux部署时注意安装对应的so文件。方案2DrissionPage —— 国产之光干掉Selenium如果你必须渲染JS比如小红书的瀑布流加载Selenium/Puppeteer不仅慢还容易被检测为自动化工具。DrissionPage是目前国内最强的浏览器控制库它支持“收发包模式”和“浏览器模式”无缝切换且内置了大量反检测补丁。核心优势不依赖WebDriver协议直接从底层控制浏览器绕过navigator.webdriver检测。自带智能等待比Selenium的sleep优雅得多。可以复用已登录的浏览器Session省去扫码登录的麻烦。实战小红书笔记列表采集fromDrissionPageimportChromiumPage,ChromiumOptions# 配置反检测选项coChromiumOptions()co.set_argument(--disable-blink-featuresAutomationControlled)co.auto_port()# 自动分配端口防止多开冲突pageChromiumPage(co)# 访问目标页page.get(https://www.xiaohongshu.com/explore)# 智能等待直到搜索结果容器出现最多等10秒# 这比 time.sleep(5) 靠谱一万倍ifpage.ele(.feeds-container,timeout10):print(✅ 页面加载完成已过盾)# 滚动加载更多内容for_inrange(3):page.scroll.down(800)page.wait.load_start()# 等待新内容加载# 提取数据...notespage.eles(.note-item)print(f当前页获取笔记数:{len(notes)})else:print(❌ 可能触发了验证码或网络异常)print(page.title) 高阶技巧先用浏览器手动登录小红书然后使用co.set_local_port(9222)接管该浏览器实例。这样你的爬虫直接拥有真实用户的Cookie和指纹过盾率提升至99%。方案3本地自建FlareSolverr兜底方案当以上两种方案都失效或者你需要大规模并发过盾时可以在本地Docker部署一个FlareSolverr。它是一个开源的代理服务内部集成了Puppeteer/Undetected-Chromedriver专门用来解CF Challenge。# 一行命令启动dockerrun-d--nameflaresolverr-p8191:8191 ghcr.io/flaresolverr/flaresolverr:latest调用方式就像用普通代理一样importrequests solver_urlhttp://localhost:8191/v1payload{cmd:request.get,url:https://target-site.com,maxTimeout:60000}resprequests.post(solver_url,jsonpayload)resultresp.json()ifresult[status]ok:htmlresult[solution][response]cookiesresult[solution][cookies]# 拿到cookies后可以转给curl_cffi继续高效请求缺点吃内存每个请求都要起浏览器不适合高频采集。正确用法是用它过盾拿Cookie然后把Cookie喂给方案1或2去跑数据。四、 关于IP的实话免费不代表不能用题目说了“不用付费代理”但不代表你可以用本机IP无限请求。以下是我的免费IP策略IP来源稳定性过盾成功率适用场景本机家庭宽带⭐⭐⭐⭐⭐高低频采集/调试/接管浏览器GitHub Actions⭐⭐⭐中定时任务/每日少量数据同步免费代理池⭐极低❌ 不推荐浪费时间云厂商按量付费⭐⭐⭐⭐高生产环境成本可控重点对于小红书/知乎这类站点IP的纯净度远比数量重要。一个干净的家庭宽带IP 正确的TLS指纹比100个被标记的数据中心代理IP管用得多。如果你是个人学习研究直接用本机IP方案2接管浏览器是最优解。五、 总结与建议先试API再试网页能用curl_cffi调接口解决的绝不开浏览器。TLS指纹是第一道门槛把requests换成curl_cffi或tls-client你会发现新世界。浏览器自动化选DrissionPageSelenium时代过去了拥抱新工具。尊重规则控制频率做好缓存别把人家服务打挂了。过盾本质上是一场猫鼠游戏没有一劳永逸的方案。Cloudflare在升级我们的技术栈也要跟着迭代。希望这篇文章能帮你省下买代理的钱把精力花在真正有价值的数据分析上。 评论区交流你在过CF盾时还遇到过哪些奇葩问题或者有更好的免费工具推荐欢迎在评论区留言我会逐一回复