欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

网站是怎么认出你是爬虫的?聊聊我踩过的 5 个反爬坑

网站是怎么认出你是爬虫的?聊聊我踩过的 5 个反爬坑

说个真事。我刚学爬虫那阵子,兴冲冲写了个脚本去抓一个商品比价网站,循环里直接 requests.get() 一把梭,跑了大概两分钟——然后整个公司网络都上不去那个站了。不是我代码崩了,是 IT 同事脸色发黑地走过来问我"你是不是在疯狂刷某某网站"。那是我第一次被反爬教做人。后来才明白,网站认出你是个机器人,靠的不是什么高深魔法,而是一堆你我都会忽略的细节。这篇就把我踩过的 5 个坑摊开讲,省得你重蹈覆辙。

先说句公道话:网站搞反爬,真不是专门针对你。一个稍有规模的站点,每天被各种扫描器、垃圾采集、薅羊毛脚本轮番问候,服务器带宽和数据库都是钱。它们做的每一道"墙",本质上都是在算一笔账——用最低成本把明显不像真人的流量挡在门外。理解了这点,你就不会觉得反爬是在刁难你,而是能反过来想:我怎么才能看起来像个"正常用户"。

坑一:User-Agent 出卖了你

这是最容易被忽略、也最便宜的一道坎。每次 HTTP 请求都会带一个 User-Agent 头,告诉服务器"我是谁家的浏览器"。而 Python 的 requests 默认发出的 UA 长这样:

python-requests/2.31.1

翻译成人话就是"我是机器人"。很多小站光凭这一条就直接扔 403。解决办法也简单,手动塞个浏览器的 UA 进去:

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."}
requests.get(url, headers=headers)

我踩过的更深一层的坑是:只换一个固定 UA 也不够稳。有些站点会统计"同一个 UA 在极短时间内的请求频次",如果你一个 UA 每秒打几百次,照样露馅。正经做法是用一个 UA 池,每次随机挑一个,把流量打散。网上搜 "user agent list" 能找到现成的几百条,存成列表 random.choice 一下就行。

坑二:你点得太快了

真人浏览网页,两三次点击之间至少有几秒停顿,还会偶尔翻翻别的页。机器人呢?for 循环里 sleep 一跑,一秒十几二十个请求,换谁都知道不对劲。高频请求要么触发限流(返回 429),要么直接把你的 IP 拉黑——我那次公司网络被封,就是这么来的。

最省事的缓解是加随机延时,别用固定 sleep(1),要给点抖动:

import time, random
time.sleep(random.uniform(0.5, 2.5))  # 每次等 0.5~2.5 秒

量再大就得上代理 IP 池,把请求分散到不同出口 IP。不过这里有个血泪教训:免费代理基本不能用。我当初图省事抓了一堆免费代理,结果十个里九个连不上、剩下一个慢得像拨号,还时不时把请求劫持到赌博网站。真要稳定,老老实实买付费代理,按量计费其实没多贵。

坑三:登录态说没就没

很多数据必须登录才给看,背后靠 Cookie / Session 鉴权。新手常犯的错误是:手动从浏览器复制一段 Cookie 塞进代码,跑半天突然全 401 了——因为 Cookie 过期了。正确姿势是用 requests.Session() 维持会话,让 requests 自己管 Cookie 的存取和刷新:

s = requests.Session()
s.post(login_url, data={"user": u, "pwd": p})  # 登录一次
s.get(target_url)  # 之后所有请求自动带登录态

但要注意,Session 里的 Cookie 也有有效期。如果你的脚本要跑很久,得在代码里检测"是不是突然 401 了",是的话重新登录一次再继续,否则半夜跑的任务会在你睡着时悄悄挂掉,第二天起来一看数据只采了一半。

坑四:验证码这道人工关卡

滑块、点选、图形验证码,是专门拦自动化的"人工关卡"。一旦风控觉得你行为异常,正常请求就会被验证码页面截胡,你拿不到数据,只拿到一张让你"证明你是人"的图。接打码平台或者用 OCR / 机器学习识别都能过,但前提是值得——我一般会先算一笔账:破解验证码的成本(钱或时间)有没有低于我要采的数据本身的价值?不划算就换数据源,别硬刚。

坑五:内容不在 HTML 里,或藏在参数里

进阶一点的站点,网页内容是 JS 动态渲染出来的,你直接抓 HTML 拿到的是一堆空壳;或者列表接口带了 sign / token 这样的签名参数,少一个就报"非法请求"。这一层的应对分两派:图省事就上 Selenium 或 Playwright,让它真的开个浏览器把页面跑出来再拿结果——代价是慢、占资源;要效率就逆向那段 JS,把签名算法还原出来在代码里复现,跑起来飞快,但逆向本身是个技术活,得愿意花时间读混淆过的代码。

⚠️ 最后啰嗦一句:上面这些手段都是双刃剑。我见过有人为了采数据把人家小网站带宽打满,对方直接停服好几天,那已经不是技术问题而是麻烦了。只采公开数据、控制频率、尊重 robots.txt,把爱好留在合法的范围内,这才玩得长久。

这 5 个坑基本覆盖了八成以上的场景。UA、频率、登录态、验证码、动态渲染——把它们一个个摸清,你再去碰那些看起来"爬不动"的站点,心里就有底了。剩下的,就是在一次次被拦、一次次绕过去的过程里慢慢攒经验。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功