12.6.3 网站如何防爬虫——反爬虫机制:验证码/IP 限制/User-Agent
一句话破题
了解反爬机制不是为了绕过它们,而是为了理解为什么你的爬虫会失败,以及如何设计不会触发这些机制的爬虫。
常见反爬机制
| 机制 | 原理 | 触发条件 |
|---|---|---|
| User-Agent 检查 | 检查请求头识别爬虫 | 使用默认或可疑的 UA |
| IP 频率限制 | 限制单 IP 请求数 | 短时间大量请求 |
| 验证码 | 要求人工验证 | 异常行为或频繁请求 |
| JavaScript 渲染 | 内容由 JS 动态生成 | 无法执行 JS |
| Cookie/Session | 需要登录或有效会话 | 缺少必要的 Cookie |
| 蜜罐链接 | 隐藏的陷阱链接 | 爬虫访问了人不会看到的链接 |
设置合理的请求头
typescript
const headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
};
async function fetchAsHuman(url: string) {
return fetch(url, { headers });
}处理 JavaScript 渲染
很多现代网站使用 JavaScript 动态渲染内容:
typescript
// 使用 Playwright 处理 JS 渲染
import { chromium } from 'playwright';
async function fetchRenderedPage(url: string) {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle' });
const content = await page.content();
await browser.close();
return content;
}处理 Cookie 和 Session
typescript
import { CookieJar } from 'tough-cookie';
const jar = new CookieJar();
async function fetchWithCookies(url: string) {
const cookies = await jar.getCookieString(url);
const response = await fetch(url, {
headers: { Cookie: cookies },
});
// 保存新的 Cookie
const setCookie = response.headers.get('Set-Cookie');
if (setCookie) {
await jar.setCookie(setCookie, url);
}
return response;
}检测自己是否被封
typescript
async function checkIfBlocked(url: string): Promise<boolean> {
try {
const response = await fetch(url);
// 常见的封禁标志
if (response.status === 403) return true;
if (response.status === 429) return true;
const text = await response.text();
// 检查常见的封禁页面关键词
const blockKeywords = [
'access denied',
'blocked',
'captcha',
'verify you are human',
'unusual traffic',
];
return blockKeywords.some(keyword =>
text.toLowerCase().includes(keyword)
);
} catch {
return true;
}
}AI 协作指南
- 核心意图:让 AI 帮你理解反爬机制,而非绕过它们。
- 需求定义公式:
"请解释这个网站可能使用了哪些反爬机制,以及我如何调整爬虫行为来避免触发它们。" - 关键术语:
User-Agent、IP 封禁、验证码 (CAPTCHA)、JavaScript 渲染
避坑指南
- 不要试图绕过反爬:这可能违法,也会损害你和目标网站的关系。
- 被封后冷静下来:暂停爬取,检查你的行为是否过于激进。
- 考虑使用官方 API:如果网站有 API,优先使用 API。
