Puppeteer-Cluster Stealthy 是否足以通过机器人测试?

Is Puppeteer-Cluster Stealthy enough to pass bot tests?

我想知道是否有人使用 Puppeteer-Cluster 可以详细说明 Cluster.Launch({settings}) 如何防止在不同上下文中的页面之间共享 cookie 和网络数据。

执行浏览器上下文 here, actually block cookies and user-data is not shared or tracked? Browserless' now infamous page seems to think no, here 并且应该在任务上调用 .launch({}),而不是在队列之前。

所以我的问题是,我们如何知道 puppeteer-cluster 是否在排队任务之间共享 cookie/数据?库中有哪些选项可以降低被标记为机器人的可能性?

设置:我将 page.authenticate 与代理服务、随机用户代理一起使用,但仍然偶尔会被我正在执行测试的站点阻止 (403)。

async function run() {
// Create a cluster with 2 workers
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_BROWSER, //Cluster.CONCURRENCY_PAGE,
    maxConcurrency: 2, //5, //25, //the number of chromes open
    monitor: false, //true,
    puppeteerOptions: {
      executablePath,
      args: [
        "--proxy-server=pro.proxy.net:2222",
        "--incognito",
        "--disable-gpu",
        "--disable-dev-shm-usage",
        "--disable-setuid-sandbox",
        "--no-first-run",
        "--no-sandbox",
        "--no-zygote"
      ],
      headless: false,
      sameDomainDelay: 1000,
      retryDelay: 3000,
      workerCreationDelay: 3000
    }
  });

   // Define a task 
      await cluster.task(async ({ page, data: url }) => {
         extract(url, page); //call the extract
      });

   //task
      const extract = async ({ page, data: dataJson }) => {
         page.setExtraHTTPHeaders({headers})

         await page.authenticate({
           username: proxy_user, 
           password: proxy_pass
         });

       //Randomized Delay
         await delay(2000 + (Math.floor(Math.random() * 998) + 1));

         const response = await page.goto(dataJson.Url);
 }

//loop over inputs, and queue them into cluster
  var dataJson = {
      url: url
      };

  cluster.queue(dataJson, extract);

 }

 // Shutdown after everything is done
 await cluster.idle();
 await cluster.close();

}

直接回答

puppeteer-cluster 的作者在这里。该库不会主动阻止 cookie,但会使用 browser.createIncognitoBrowserContext():

Creates a new incognito browser context. This won't share cookies/cache with other browser contexts.

此外,文档指出 "Incognito browser contexts don't write any browsing data to disk" (source),因此重新启动浏览器 不能 重用磁盘中的任何 cookie,因为没有数据已写入。

关于库,这意味着当执行作业时,会创建一个新的隐身上下文,它不会与其他上下文共享任何数据(cookie 等)。因此,只要 Chromium 正确实现隐身浏览器上下文,作业之间就不会共享数据。

您链接的页面仅讨论 browser.newPage()(在页面之间共享 cookie)而不是隐身环境。

为什么网站可能会将您识别为机器人

有些网站仍然会阻止你,因为他们使用不同的措施来检测机器人。我 headless browser detection tests as well as fingerprinting libraries that might report you as bot if the user agent does not match the browser fingerprint. You might be interested in this answer 提供了一些更详细的解释这些指纹是如何工作的。

您可以尝试使用类似puppeteer-extra that comes with a stealth插件的库来帮助您解决问题。然而,这基本上是一场猫捉老鼠的游戏。指纹识别测试可能会更改,或者其他站点可能会使用不同的 "detection" 机制。总而言之,无法保证网站不会检测到您。

如果您想使用 puppeteer-extra,请注意您可以将它与 puppeteer-cluster (example code) 一起使用。

您始终可以使用 PlayWright,它比人偶更难被识别为机器人,并且可以选择使用多个浏览器等。