写爬虫这件事,十次有八次卡在同一个地方——不是解析逻辑写错了,也不是请求头忘加了,而是辛辛苦苦发出去的请求,换来一张验证码。
那种感觉挺微妙的。你明明只是想拿点数据,对面服务器却像是在说:"你是机器人吧?露馅了。"
这篇文章就聊聊这件事:Python爬虫里验证码到底是怎么回事,常见的几种验证码类型要怎么应对,什么时候该自己写识别代码,什么时候该承认"这事儿不值得自己折腾",直接用现成的服务解决。
很多人写爬虫第一反应是"破解"验证码,但其实搞懂对方为什么放验证码,比急着写识别代码更重要。
验证码的本质是一道"图灵测试"——网站想知道,发请求过来的,到底是人还是程序。触发条件通常是这么几种:
- 同一个 IP 短时间内请求次数太多,明显超出正常人的浏览速度
- 请求头(User-Agent、Referer、Cookie 等)缺胳膊少腿,或者跟真实浏览器对不上
- 没有携带正常浏览器才会有的 JS 执行结果、Cookie 链路
- 行为模式不像人——比如鼠标轨迹是直线、点击间隔毫秒级精准、从不滚动页面
也就是说,验证码往往只是"果",真正的"因"是你的请求在某个环节露出了机器特征。这也是为什么很多文章会强调一个反直觉的思路:与其死磕怎么识别验证码,不如先想办法别触发它。把请求频率降下来、把 IP 和指纹伪装得更像真人、把 Cookie 和会话维护好,很多时候验证码根本不会出现。
当然,完全避免是理想状态,现实中总会撞上验证码。那接下来就具体看几种常见类型。
最经典的那种,扭曲的字母数字混在一起,有干扰线、有噪点。Python 处理这类验证码的传统思路是 OCR(光学字符识别):
python import pytesseract from PIL import Image
img = Image.open('captcha.png')
text = pytesseract.image_to_string(img) print(text)
但说实话,现在这条路越走越窄。早些年验证码干扰项简单,tesseract 配合一些图像预处理(灰度化、二值化、中值滤波去噪、字符分割)还能凑合识别。但在爬取需要验证码的网站时,降低请求频率、使用代理IP、伪装请求头、识别验证码以及模拟正常用户行为这几种策略往往需要组合使用,单靠识别本身效果有限。现在不少网站的验证码已经刻意做得连人眼都要看半天,纯 OCR 的成功率会很惨。
这种验证码常见于电商和社交类网站,需要拖动滑块对齐缺口。思路通常是:
- 抓取"完整图"和"缺口图"两张图片
- 通过图像对比算法(边缘检测、像素差异比对)找到缺口位置
- 用 Selenium 等工具模拟真实的拖动轨迹(注意,是模拟"轨迹"而不是瞬间移动到位,匀速直线拖动反而容易被识别为机器行为)
这类验证码对"行为真实度"要求更高,光找到缺口位置还不够,拖动的加速度曲线、停顿、微调动作都会被纳入风控判断。
这是目前最难啃的一类,谷歌的 reCAPTCHA v2(选图)、v3(无感评分)以及 hCaptcha 已经不是单纯的"图像识别"问题了,背后是一整套行为评分系统。常见的应对方式有三种:
- 打码平台:把验证码图片或 sitekey 提交给第三方平台(如 2Captcha、Anti-Captcha),由真人或 AI 模型解出后返回 token,再把 token 注入页面继续请求
- 重型方案:用 Selenium / Playwright 等工具跑真实浏览器环境,让指纹、Cookie、JS 执行链路尽量接近真人
- 第三方爬虫 API:把整个"绕过反爬+拿数据"的环节外包出去,自己只管发请求收数据
前两种思路网上教程很多,但都有一个共同的麻烦:维护成本会随着目标网站升级反爬策略而持续上升。今天调好的滑块轨迹算法,过两周对方升级了风控模型,可能又要重新调;今天能用的代理 IP 池,可能没多久就被对方拉黑大半。
如果你是出于学习目的,想搞懂验证码识别背后的图像处理、机器学习原理,那自己动手写 OCR、训练分类模型,这个过程本身价值很大,值得投入时间。
但如果你的目标很纯粹——就是想稳定地拿到数据,那不妨想一下这笔账:自己维护一套代理池+指纹伪装+验证码识别的系统,需要持续投入时间盯着对方反爬策略的变化;而这部分基础设施,其实已经有专门做这件事的服务在长期运营和迭代。
像 ScraperAPI 这类爬虫 API 服务,做的事情本质上就是把"IP 轮换、请求头伪装、JS 渲染、验证码与反爬绕过"这一整套又脏又累的活儿封装成一个 API 调用,团队在搭建过自己的爬虫之后,反复经历寻找代理、配置无头浏览器、处理验证码这些繁琐流程,所以决定做一个服务把这些都包办掉,让用户只需一次简单的 API 调用就能完成抓取。具体到验证码这块,如果目标页面返回了验证码挑战,服务会自动更换 IP 地址和请求头组合,重新发起请求,循环直到成功或达到设定的最长执行时间。
用 Python 接入的话,代码大概长这样(以请求转发模式为例):
python import requests
payload = { 'api_key': 'YOUR_API_KEY', 'url': 'https://example.com/target-page', 'render': 'true' # 需要 JS 渲染时开启 }
response = requests.get('https://api.scraperapi.com/', params=payload) print(response.text)
不用自己管代理池,不用自己写滑块轨迹,不用接打码平台的 API,验证码这层基本是透明的——这也是为什么很多 Python 爬虫教程在讲到验证码这一节时,最终都会绕到"用爬虫 API"这条路上来。
如果你正被某个具体网站的验证码折腾得够呛,与其继续手搓识别代码,不如先 👉 试试 ScraperAPI 的免费额度,看看你要爬的目标站点是不是能直接绕过去——免费额度本身就够做一次完整的可行性验证。
官网目前在售的套餐如下(按月计费价格,年付享 9 折优惠):
| 套餐 | 月费 | API 额度 | 并发线程 | 地理定位 | 适用场景 | 购买链接 |
|---|---|---|---|---|---|---|
| Free | $0 | 1,000 credits | 5 | — | 测试与学习,免费体验 | 免费注册试用 |
| Hobby | $49/月(年付 $44.10/月) | 100,000 credits | 20 | 美国 & 欧盟 | 个人项目、小规模采集 | 查看 Hobby 套餐 |
| Startup | $149/月(年付 $134.10/月) | 1,000,000 credits | 50 | 美国 & 欧盟 | 低频但持续的采集任务 | 查看 Startup 套餐 |
| Business | $299/月(年付 $269.10/月) | 3,000,000 credits | 100 | 全球(国家级) | 生产环境中等规模采集 | 查看 Business 套餐 |
| Scaling(最受欢迎) | $475/月(年付 $427.50/月) | 5,000,000 credits | 200 | 全球(国家级) | 规模化采集,支持按量付费 | 查看 Scaling 套餐 |
| Professional | $975/月(年付 $877.50/月) | 10,500,000 credits | 300 | 全球(国家级) | 高频持续型大规模采集 | 查看 Professional 套餐 |
| Advanced | $1,975/月(年付 $1,777.50/月) | 21,500,000 credits | 500 | 全球(国家级) | 多数据源持续采集管道 | 查看 Advanced 套餐 |
| Enterprise | 按需定制 | 22,000,000+ credits | 500+ | 全球(国家级) | 大型企业,专属支持团队 | 联系销售获取报价 |
几点说明,免得踩坑:
- 所有套餐都已包含 JS 渲染、高级代理(住宅与移动 IP)、验证码与反爬检测绕过、结构化数据解析、DataPipeline、完整爬虫访问权限,并不是说低价套餐就阉割了验证码处理能力——这一点是所有付费层级统一具备的核心功能。
- 消耗机制是"credits"制,不同目标网站、不同功能(比如开启 JS 渲染、使用高级代理)消耗的 credits 数量不一样,越难爬的网站、消耗的额度通常越多。预算有限的话,建议先拿免费额度跑几次目标页面,心里有个数再决定套餐。
- Free / Hobby / Startup / Business 这几档,额度用完需要升级套餐或联系支持;而 Scaling 及以上的套餐支持按量付费(Pay as you go),额度用超了不会直接断量,按固定费率继续计费。
- 官方提供 7 天免费试用,7 天无理由退款,主流信用卡、PayPal、电汇都支持。
如果你决定用爬虫 API 这条路,有几个小经验值得提前知道:
- 善用
render参数:很多验证码其实是 JS 动态触发的,开启 JS 渲染能让请求更接近真实浏览器行为,间接降低触发概率。 - 结合
session维持会话:需要登录态或多步操作的页面,保持同一个会话比每次换新 IP 更稳,因为频繁切换身份本身也是一种"机器特征"。 - 设置合理的超时和重试:验证码绕过偶尔需要服务端多尝试几次 IP/请求头组合,给足超时时间,避免你的脚本提前判定失败。
- 目标网站结构化数据可以省去解析步骤:像 Amazon、Google、沃尔玛这类高频目标,官网通常直接提供结构化 JSON 输出,不用自己写 XPath/CSS 解析逻辑。
验证码这事儿,说到底就是网站和爬虫之间的一场拉锯战。你这边升级一点,对面也跟着升级一点,没有一劳永逸的"终极方案"。
自己动手研究 OCR、滑块轨迹、reCAPTCHA token 生成,是很好的学习路径,能让你真正理解反爬虫的底层逻辑。但如果你只是想稳定拿到数据,把时间花在业务逻辑而不是和验证码死磕,那 👉 用 ScraperAPI 的免费额度先测一下你的目标网站,是个成本很低的验证方式——免费的 1,000 credits 通常足够你判断这条路是否走得通。
不管选哪条路,记得爬虫这件事还是要在合规的前提下做:遵守目标网站的服务条款,控制请求频率,不要给对方服务器添不必要的负担。这不仅是法律和道德层面的考量,也是让你的爬虫能长期稳定运行下去的前提。