Python爬虫中分析列表页规律后直接get请求却遇到验证码或其他反爬机制怎么办?
分析百度贴吧的网页规律, 请求如:http://tieba.baidu.com/f?kw=%E4%B8%AD%E8%80%83&pn={}.format(187450)类似的网页
在浏览器中打开没有需要验证码,为什么爬取的时候需要验证码呢?
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset=“utf-8”>
<meta http-equiv=“X-UA-Compatible” content=“IE=edge”>
<meta name=“viewport” content=“width=device-width, initial-scale=1”> <meta name=“format-detection” content=“telephone=no”>
<title>验证码</title>
<link rel="stylesheet" type="text/css" href="http://tb1.bdstatic.com/tb/_/cui/frscaptcha/node_modules/tb-captcha/node_modules/tb-icon/lib/font_af3f10d.css" />
<link rel="stylesheet" type="text/css" href="http://tb1.bdstatic.com/tb/_/cui/frscaptcha/node_modules/tb-captcha/lib/captcha/core/index_6cc78b2.css" />
<link rel="stylesheet" type="text/css" href="http://tb1.bdstatic.com/tb/_/cui/frscaptcha/routes/home/index_1357dd3.css" />
<link rel="stylesheet" type="text/css" href="http://tb1.bdstatic.com/tb/_/cui/frscaptcha/index_75e7e66.css" />
</head>
<body>
<div id=“react-dom”></div>
<script type=“text/javascript” src=“http://tb1.bdstatic.com/tb//cui/frscaptcha/mod_c630892.js"></script>
<script type=“text/javascript”>!function(){var e=500,t=function(){var t=document.documentElement.clientWidth/e;t=screen.width/e;var n=document.querySelector(‘meta[name=“viewport”]’);n.setAttribute(“content”,“width=”+e+",initial-scale="+t+",maximum-scale="+t+", minimum-scale="+t+",user-scalable=no,target-densitydpi=device-dpi")};t(),window.onload=function(){document.documentElement.clientWidth>750&&(document.getElementById(“react-dom”).style.margin=“0 auto”,document.getElementById(“react-dom”).style.width=e+“px”)}}();</script>
<script type=“text/javascript” src="http://tb1.bdstatic.com/tb//cui/frscaptcha/pkg/aio_1436556.js”></script>
</body></html>
**之前用网上的所谓高匿代理,然后用 python 代码检测是否为高匿名,结果发现 100 个中有 1~2 个高匿。。。之前爬 tieba 的时候,以为自己用了高匿名,就没有加 sleep 并启用了多进程,我主机的 ip 应该就封了。。。
**但是现在用检测好的高匿名代理,去爬网站,也是要输入验证码呀,这是怎回事呢?
Python爬虫中分析列表页规律后直接get请求却遇到验证码或其他反爬机制怎么办?
chrome 的 headers 完整复制到 requests
这种情况很常见,很多网站会在列表页的翻页请求上设置反爬。直接分析出规律然后get,服务器一看这么规律的请求,还带着奇怪的headers,很容易就触发验证码了。
核心思路是:让你的请求看起来更像一个“人”在操作,而不是脚本。光分析出URL规律还不够。
1. 基础但关键的伪装:
首先,你的请求头headers必须完整,尤其是User-Agent、Referer、Cookie。直接用浏览器里的那一套。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...',
'Referer': 'https://www.target-site.com/list/page-1.html', # 上一页或列表首页
'Cookie': '你的登录cookie或会话cookie', # 非常重要
# 其他浏览器会带的headers,如Accept, Accept-Language等
}
url = '你分析出的列表页API或URL规律'
response = requests.get(url, headers=headers)
2. 处理动态参数:
很多网站的翻页参数是加密的或者有时效性(比如token、sign)。你不能简单地page=2,3,4。你需要:
- 仔细分析:用浏览器开发者工具的“网络”选项卡,查看翻页时实际发送的请求,对比不同页码请求的所有参数差异。关键参数可能藏在
Form Data或Payload里。 - 模拟计算:如果参数是前端生成的(比如一个时间戳加MD5),你可能需要用Python重现这个生成逻辑。这可能需要分析网站的JS代码。
3. 控制请求节奏: 即使参数对了,请求太快也必死。必须加延迟。
import time
import random
for page in range(1, 10):
# ... 构造请求 ...
resp = requests.get(url, headers=headers, params=params)
# 处理数据 ...
time.sleep(random.uniform(1, 3)) # 随机延迟1-3秒
4. 如果还是遇到验证码:
- 验证码出现在HTML里:说明服务器已经决定给你出题了。这时你有几个选择:
- 使用付费打码平台API(如超级鹰、图鉴),这是最省事的。
- 自己用OCR库(如
ddddocr、tesseract)尝试识别,简单数字字母验证码可能有效。 - 手动处理:程序遇到验证码时暂停,弹出图片让你手动输入,然后继续。
- 根本性规避:如果网站对验证码策略很严,考虑换用
Selenium或Playwright这类浏览器自动化工具,完全模拟真人点击翻页。虽然慢,但能绕过很多针对纯HTTP请求的反爬。把关键数据拿到后,再分析其接口规律。
总结:翻页规律只是第一步,更重要的是模拟真人请求的细节和节奏。
直接爬客户端接口是没有验证码的,任何情况下写爬虫都应该是优先考虑客户端接口。
我的 github.com/cw1997 上有相关项目(仓库名忘了,你找找)你可以参考参考。
cookie 也复制?
heades = {
“Cookie”: “…”
…
}
requests.get(url, headers = headers, proxies= random.choice(proxy_dicts))
复制了 cookie ,使用单一 cookie ,但是每次使用的 proxy 并不一样,这个会有影响么?
有,会导致异地登陆
不要抓 PC 的分页,验证太多,抓 wap 版的分页,随意并发轻松又愉快。
如果想要 PC 版贴子内容的数据,抓完分页之后,自己取 kz 贴子 ID 转换成 PC 版 tieba.baidu.com/p/kzid 之类的即可。
如果有心情分析 app 接口,拦截 app 接口构造请求更轻松。
好吧,有好的解决办法么?
好的,我去试试,谢啦

