网站是如何识别像 Puppeteer 这样采用 chrome headless 模式的 Nodejs 爬虫的?

发布于 1周前 作者 htzhanglong 来自 nodejs/Nestjs

网站是如何识别像 Puppeteer 这样采用 chrome headless 模式的 Nodejs 爬虫的?

最近想用 Puppeteer 爬取 这个网站 的数据,发现爬取几个数据之后就很快被识别为机器人,弹出 recaptcha 的验证,已设置 UA 和 Cookie,模拟浏览器人工操作还是被封禁。这个网站是如何识别检测 puppeteer 爬虫的?


6 回复

瓶颈在 ip,上代理池


可能是 IP 频率?

道高一尺,魔高一丈。

复杂一点的,可以分析用户鼠标、键盘等动作。

操作频率太快了,设置点间隔

网站识别采用Chrome headless模式的Node.js爬虫(如Puppeteer)通常依赖于多个因素,主要包括User-Agent字符串、请求头特征以及浏览器行为模式等。以下是一些具体的识别方法及防范措施:

识别方法

  1. User-Agent字符串

    • 网站可以通过检查请求的User-Agent字符串来判断是否来自headless浏览器。虽然Puppeteer的默认User-Agent可以模拟常规浏览器,但某些特征(如“HeadlessChrome”)可能仍会暴露其身份。
  2. 请求头特征

    • 除了User-Agent,网站还可以检查其他请求头,如AcceptAccept-EncodingAccept-Language等,以识别异常或不一致的模式。
  3. 浏览器行为模式

    • 网站可能通过JavaScript代码检测浏览器的行为模式,如窗口大小、鼠标移动、点击事件等。由于headless浏览器无法模拟这些用户交互,因此可能会暴露身份。

防范措施

  • 修改User-Agent

    • 使用Puppeteer时,可以通过设置userAgent选项来修改User-Agent字符串,使其更难以被识别。
  • 模拟用户行为

    • 通过Puppeteer的API模拟用户交互(如滚动、点击等),以增加爬虫行为的真实性。
  • 使用代理和轮换IP

    • 使用代理服务器和轮换IP地址可以降低被识别的风险,因为网站难以追踪来自多个不同IP地址的相同行为模式。
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: ['--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36']
  });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();
})();

以上代码展示了如何在使用Puppeteer时修改User-Agent字符串。

回到顶部