爬虫需综合运用IP代理轮换、验证码识别、请求头与行为模拟及JS逆向四类技术绕过反爬。IP代理池应选HTTPS支持的付费或自建服务;验证码优先调用打码平台API;User-Agent等请求头须轮换并控制请求频率;JS动态参数需通过浏览器分析后用PyExecJS或Playwright执行。

IP被封、验证码弹窗、请求被拒——这些是写爬虫时最常遇到的反爬“拦路虎”。光靠requests发请求已经不够,得学会用IP代理轮换和验证码识别来绕过限制。核心思路就两条:让服务器觉得你不是机器人,且每次访问像不同用户。
IP代理池搭建与动态切换
单个IP高频访问必然触发风控,代理池能分散请求来源。免费代理不稳定,建议用付费服务(如快代理、芝麻代理)或自建代理池(通过云服务器+ Squid 代理软件)。
使用时注意三点:
- 代理必须支持HTTPS,否则requests会报错
- 每次请求前随机选一个代理,并设置超时(timeout=10),避免卡死
- 捕获异常(如ProxyError、ConnectTimeout),自动剔除失效代理并重试
示例代码片段:
立即学习“Python免费学习笔记(深入)”;
proxies = {"http": "http://user:pass@host:port", "https": "http://user:pass@host:port"}response = requests.get(url, proxies=proxies, timeout=10)
验证码识别实战:从截图到提交
常见验证码分三类:数字字母组合(易识别)、滑块验证(需模拟拖动)、点选文字(需OCR+坐标定位)。入门推荐先攻第一种。
主流方案有三种:
- 打码平台API(推荐):如超级鹰、云打码,准确率高(95%+),按次扣费,接入简单,适合中小项目
- 本地OCR模型:用tesseract + OpenCV预处理(灰度、二值化、去噪),适合固定样式验证码,但泛化差
- 训练轻量CNN模型:用TensorFlow/Keras训练4位字符分类器,需标注几百张图,适合长期稳定需求
关键细节:验证码图片通常带干扰线/扭曲,预处理比识别本身更重要;识别后务必校验长度和字符范围(如只含数字和大写字母)。
请求头与行为模拟:别让服务器一眼看穿
代理和验证码只是表层,真实用户行为才是重点。光换IP不换User-Agent,照样被秒封。
至少做到以下四点:
- User-Agent要轮换(从真实浏览器UA池中随机取,避免用默认requests UA)
- 加Referer和Accept-Language,匹配目标站点常用来源
- 控制请求间隔(time.sleep(random.uniform(1, 3))),避免匀速高频
- 必要时用Selenium或Playwright模拟点击、滚动等动作,绕过JS检测
注意:Selenium虽强,但慢且易被检测(window.navigator.webdriver为True),可用undetected-chromedriver或手动patch规避。
应对JS渲染与加密参数
很多网站的URL参数、cookie或headers由前端JS动态生成(比如sign、token、timestamp),直接抓包看不到逻辑。
解决路径分两步:
- 先用浏览器开发者工具定位生成逻辑(搜索关键词如“sign”、“encrypt”、“getTimestamp”)
- 把JS代码抠出来,用PyExecJS或js2py在Python中执行,或用PyQt5/Playwright直接调用原生JS上下文
小技巧:在Chrome控制台里右键“Copy as cURL”,再转成Python requests代码,能快速还原真实请求结构。










