为什么你的脚本总被封?
做爬虫、自动化或者数据采集的朋友肯定遇到过这种情况:脚本跑得好好的,突然就被目标网站拦了,验证码弹个不停,甚至直接IP封禁。问题出在哪?很可能是因为你的脚本“太明显”了,被对方系统一眼识破。
网站反爬机制越来越智能,不只是看请求频率,还会分析行为模式、浏览器指纹、JavaScript执行环境等。想让脚本稳定运行,得学会“伪装”得像真人操作。
使用无头浏览器但别暴露身份
很多人用Puppeteer或Playwright做自动化,但默认的无头模式其实自带“标签”。比如Chrome的window.navigator.webdriver字段在无头模式下是true,普通用户根本不会有这玩意儿。
解决办法是在启动浏览器时加上参数隐藏这个特征:
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
args: ['--disable-blink-features=AutomationControlled']
});
const page = await browser.newPage();
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
});这样页面里的JavaScript就检测不到你在用自动化工具了。
模拟真实用户行为
真人操作不会每秒点五次按钮,也不会鼠标走直线。如果你的脚本点击间隔固定、滑动轨迹完美,那简直就是“我是机器人”大喇叭。
加入随机延迟和模拟鼠标移动能大大降低被识别概率:
await page.mouse.move(100, 100);
await page.waitForTimeout(Math.random() * 1000 + 500); // 随机停顿
await page.mouse.move(200, 100, { steps: 10 }); // 分步移动,像人手再配合一些滚动、轻微晃动鼠标的操作,看起来就像真人在慢慢浏览。
更换User-Agent不是万能的
只换User-Agent已经不够用了。现在很多网站会结合IP、设备指纹、Canvas渲染、字体列表等信息综合判断。
建议使用完整的浏览器指纹伪造方案,比如用不同地区的常见配置组合(操作系统+浏览器版本+分辨率),轮换使用,避免所有请求都来自“同一台电脑”。
利用代理池和IP轮换
单个IP频繁请求等于自曝行踪。搭建或购买高质量的代理池,让每次请求从不同IP发出,能有效分散风险。
注意别用免费公开代理,很多已经被列入黑名单。可以考虑住宅代理或移动代理,更接近真实用户网络环境。
处理验证码要提前布局
一旦触发验证码,说明你已经被盯上了。与其事后解码,不如提前规避。
控制请求频率,模拟登录状态,使用Cookies保持会话,都能减少触发动态验证的机会。真遇到验证码,可以用打码平台API自动处理,但成本会上升,所以最好还是别走到这一步。
脚本能不能跑得久,不在于多快,而在于多“像人”。把细节做足,让系统觉得你只是个手慢的普通用户,反而能走得更远。