Python爬虫反爬策略实战指南|IP代理池搭建与验证码识别技巧全解析

Python爬虫反爬策略实战指南|IP代理池搭建与验证码识别技巧全解析 一

文章目录CloseOpen

IP代理池从0到1搭建:解决90%的IP封锁问题

其实大部分网站封爬虫,第一步都是检测IP访问频率——同一个IP短时间内访问太频繁,就会被标记为“可疑爬虫”。我早期写爬虫时也踩过这个坑,当时直接用本机IP爬某电商平台,结果半小时就被封了,连正常浏览都不行。后来才发现,搭建个代理池就能解决这个问题,就像给爬虫办了一堆“身份证”,网站查不过来就没法封你。

代理IP的获取与筛选:免费和付费该怎么选?

代理IP的获取渠道主要有三种:免费代理网站、付费代理服务、自建代理服务器。我之前帮朋友试过纯免费代理池,结果踩了大雷——从某代理网站爬了200个IP,能用的不到10个,而且存活时间平均只有5分钟,爬虫跑着跑着就断了。后来改成“付费+免费”混合模式,稳定性一下子上来了。

你可以参考下面这个表格,根据自己的需求选代理类型:

代理类型 成本 可用性 适用场景
免费代理 0元 低(<10%) 测试、低频率爬取
付费短效代理 0.1-0.5元/IP 中(60%-80%) 中等频率爬取(如每日10万次请求)
付费长效代理 50-200元/月 高(>95%) 高频率爬取(如实时数据监控)

实操技巧

:不管用哪种代理,都要先验证可用性。我通常用Python写个简单的验证脚本,让代理去访问http://httpbin.org/get,能返回正确IP的才加入代理池。代码大概长这样:

import requests

def check_proxy(proxy):

try:

res = requests.get("http://httpbin.org/get", proxies={"http": proxy}, timeout=5)

return res.json()["origin"] == proxy.split(":")[0] # 验证返回IP是否与代理一致

except:

return False

代理池的动态维护:让爬虫自动“换身份证”

光有代理IP还不够,你得建个“仓库”来管理它们——这就是代理池。我给朋友搭的代理池用了Redis做存储,分三个队列:待验证队列、可用队列、失效队列。每隔10分钟,程序会自动从待验证队列取IP检测,可用的移到可用队列,失效的丢进失效队列,这样爬虫每次请求时,直接从可用队列里随机取一个IP,用完再放回去(如果还能用的话)。

这里有个关键技巧:不要等IP失效了才换。我之前发现,即使可用的IP,连续用20次以上也容易被封。所以现在代理池会记录每个IP的使用次数,超过15次就自动标记为“待休息”,暂时移出可用队列,过半小时再放回来。这个小调整让朋友的爬虫被封率从30%降到了5%以下。

User-Agent伪装也很重要,就像给爬虫换不同风格的衣服。你可以建个User-Agent池,每次请求随机选一个,比如:

user_agents = [

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",

"Mozilla/5.0 (Macintosh; Intel Mac OS X 12_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.3 Safari/605.1.15"

]

亲测加上这个,很多简单的反爬机制直接就绕过去了。

验证码识别实战:从图形验证到滑块验证的破解技巧

解决了IP封锁,下一个拦路虎就是验证码。我见过最夸张的案例:一个朋友爬招聘网站,每爬10页就弹出一个验证码,手动输入根本来不及。后来我们用代码自动识别,效率直接提升10倍。下面分享几种常见验证码的破解方法,都是我实战过的,你可以直接套用。

图形验证码:OCR+预处理=低成本破解

最简单的图形验证码(比如数字+字母的组合),用OCR工具就能搞定。我最早用Tesseract-OCR,发现直接识别准确率只有60%左右,后来学了个技巧:先对图片预处理。比如把图片转成黑白、去除干扰线、放大字体,处理后的图片识别率能提到90%以上。

举个例子,假设你拿到一张验证码图片,先用OpenCV做预处理:

import cv2

img = cv2.imread("captcha.png")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度图

_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # 二值化,去除灰色干扰

处理完的图片再喂给Tesseract,准确率会高很多。如果遇到带干扰线的验证码,可以用cv2.medianBlur()去噪,亲测有效。

不过Tesseract对复杂验证码(比如扭曲字体、重叠字符)效果一般,这时候可以试试机器学习。我之前帮朋友处理过一个带汉字的验证码,用CNN模型训练了5000张样本,识别率提到了85%。数据不够的话,也可以用GitHub上的开源项目,比如ddddocr(nofollow),号称“带带弟弟OCR”,对中文验证码支持很好,而且不用自己训练模型。

滑块验证:破解“人形检测”的关键是“模仿人类行为”

现在很多网站用滑块验证,比如你拖动一个滑块拼合图片,网站会通过你的拖动轨迹判断是不是真人。我刚开始用selenium直接拖动,结果10次有9次被识破——因为机器拖动太“完美”了,匀速直线运动,人类根本不会这么操作。

后来我发现,模拟人类的“不完美”轨迹才是关键。比如:开始时速度慢(识别滑块位置),中间加速,快到终点时减速;偶尔左右晃动一下;拖动时间控制在1-3秒之间。我用Python写了个生成轨迹的函数,大概是这样的:

import random

def generate_track(distance):

track = []

current = 0

mid = distance 3/4 # 加速到中间点

t = 0.2

v = 0

while current < distance:

if current < mid:

a = random.uniform(2, 4) # 加速阶段加速度

else:

a = random.uniform(-3, -1) # 减速阶段加速度

v0 = v

v = v0 + a t

move = v0 t + 0.5 a (t2)

current += move

track.append(round(move))

return track

不要用selenium的click_and_hold()方法,太容易被检测。我改用pyautogui控制真实鼠标,或者用Chrome的CDP协议(Chrome DevTools Protocol)模拟操作,成功率提升到80%以上。你可以参考Chrome官方文档(nofollow)里关于输入模拟的部分,里面有详细说明。

最后提醒一句:验证码识别不是100%成功的*。我通常会在代码里加个重试机制,识别失败就换个代理IP再试,3次失败就跳过这个请求。毕竟比起手动输入,自动识别已经省了太多事。

如果你按这些方法搭好了代理池,处理了验证码,爬虫稳定性肯定会大提升。我身边有个做舆情监控的朋友,用这套方法把爬虫效率从每天5万条数据提到了30万条,服务器成本反而降了——因为不用买那么多备用IP了。你如果试了这些方法,遇到问题可以在评论区告诉我,我帮你看看哪里出了问题!


其实代理池要准备多少IP,真不是拍脑袋决定的,得看你爬虫有多“忙”,还有目标网站盯得多紧。我去年帮一个做电商竞品分析的朋友搭代理池时,他每天大概要爬5万条商品数据,一开始我想着“越多越好”,给他找了200个IP,结果发现根本用不完,反而浪费了不少检测资源。后来慢慢调到80个可用IP,每次请求随机挑一个,跑了一个月,IP被封的情况几乎没有——你看,中小规模的爬虫(比如每天请求量在1-10万次),准备50-100个能用的IP就够了,重点不是数量多,而是“周转得过来”,就像你开小超市,不用雇20个收银员,5-8个轮班倒着来,顾客再多也忙得过来。

但如果是高频率爬取,比如做舆情监控,得实时跟踪几十个平台的新消息,每秒都有请求发出去,那IP就得多备点了。我之前帮一个政务项目搭过类似的爬虫,刚开始用150个IP,结果上午10点高峰期一过,一半IP都被封了——因为同一时间请求太密集,网站后台一看“这IP怎么老在刷”,直接就拉黑了。后来把可用IP池扩充到220个,还加了个“使用次数限制”:每个IP每小时最多用30次,用完就暂时“休息”1小时,这才稳住。所以你要是爬实时数据, 至少准备200个以上IP,再配合“限流”机制,别让某个IP“连轴转”,这样既能保证效率,又能藏得更深。


代理池需要准备多少个IP才够用?

IP数量取决于爬虫的访问频率和目标网站的反爬严格程度。中小规模爬虫(如每日请求量1-10万次) 准备50-100个可用IP,按“每次请求随机切换IP”的策略,可避免单个IP高频访问。如果是高频率爬取(如实时监控类爬虫), 将可用IP池扩充到200个以上,并搭配“使用次数限制”(如单个IP每小时最多用30次),进一步降低被封风险。

验证码识别失败率高,有什么快速优化的办法?

可以从三个方面优化: 加强图片预处理,比如用OpenCV裁剪验证码区域、调整对比度(灰度化+二值化)、去除干扰线(中值滤波),提升基础识别率; 设置重试机制,单次识别失败后换代理IP重试,3次失败则跳过该请求,避免无效消耗; 复杂验证码(如汉字、旋转字符)可混合使用多种识别工具,比如简单图形用Tesseract,中文用ddddocr,滑块验证用轨迹模拟+pyautogui,通过“工具组合”提高整体成功率。

使用代理爬取数据会涉及法律风险吗?

爬虫的合法性核心在于“是否遵守网站规则”和“数据用途”。根据《网络安全法》,未经允许爬取受保护数据(如用户隐私、付费内容)可能违法,但公开数据(如新闻、商品价格)在合理范围内爬取通常没问题。 爬取前先查看网站的robots协议(通常在域名/robots.txt),避免爬取禁止访问的页面;同时控制访问频率,不影响网站正常运行,代理仅用于“反制技术封锁”而非“恶意攻击”,这样可大幅降低法律风险。

除了IP代理和验证码,还有哪些反爬手段需要注意?

常见的还有三类:一是Headers伪装,需设置真实的User-Agent( 准备10-20个浏览器UA随机切换)、Referer(模拟从搜索页跳转)、Accept-Language等,避免使用默认爬虫UA;二是Cookie管理,部分网站通过Cookie识别用户,可搭建Cookie池(如用Selenium自动登录获取Cookie,存储到Redis),每次请求随机携带Cookie;三是请求间隔控制,模拟人类浏览习惯,设置随机间隔(如1-3秒/次),避免固定时间间隔触发频率检测。这些手段配合IP代理,能进一步提升爬虫隐蔽性。

免费代理真的完全不能用吗?

免费代理并非完全不可用,但需合理使用。适合场景:开发测试阶段(验证爬虫逻辑)、低频率爬取(如每日请求量<1000次)、对数据实时性要求不高的场景。使用时需注意两点:一是严格筛选,通过“多维度检测”(验证可用性、响应速度<5秒、支持HTTPS)过滤低质IP,可用率需筛选到10%以上;二是搭配“快速淘汰”机制,免费IP存活时间短(通常5-30分钟),代理池需每5-10分钟重新检测,及时剔除失效IP。中小规模需求可尝试“免费+付费”混合池(免费IP占比30%,付费占70%),平衡成本与稳定性。

0
显示验证码
没有账号?注册  忘记密码?