⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

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;
}
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-AgentIP 封禁验证码 (CAPTCHA)JavaScript 渲染

避坑指南

  • 不要试图绕过反爬:这可能违法,也会损害你和目标网站的关系。
  • 被封后冷静下来:暂停爬取,检查你的行为是否过于激进。
  • 考虑使用官方 API:如果网站有 API,优先使用 API。