【问题标题】:Is Puppeteer-Cluster Stealthy enough to pass bot tests?Puppeteer-Cluster Stealthy 是否足以通过机器人测试?
【发布时间】:2020-01-09 21:08:22
【问题描述】:

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

浏览器上下文here 是否实际上阻止了 cookie 并且用户数据未被共享或跟踪? Browserless' 现在臭名昭著的页面似乎认为不,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();

}

【问题讨论】:

    标签: node.js automated-tests puppeteer end-to-end puppeteer-cluster


    【解决方案1】:

    直接回答

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

    创建一个新的隐身浏览器上下文。这不会与其他浏览器上下文共享 cookie/缓存。

    此外,文档指出“隐身浏览器上下文不会将任何浏览数据写入磁盘”(source),因此重启浏览器不能重用磁盘中的任何 cookie没有写入数据。

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

    您链接的页面仅涉及browser.newPage()(在页面之间共享 cookie),而不涉及隐身上下文。

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

    某些网站仍会阻止您,因为它们使用不同的措施来检测机器人。如果用户代理与浏览器指纹不匹配,则有headless browser detection tests 以及指纹库可能会将您报告为机器人。你可能对我的this answer 感兴趣,它提供了一些更详细的解释这些指纹是如何工作的。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 剧作家和木偶戏的关系如何?在我的用例中,我确实注意到它不太容易检测到,但我不确定为什么。
      猜你喜欢
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2020-05-18
      • 2021-04-24
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多