【问题标题】:Puppeteer Different Behavior with BrowserPuppeteer 使用浏览器的不同行为
【发布时间】:2020-10-26 23:11:46
【问题描述】:

我在控制台中的 querySelector 命令和 nodejs 上的等效 puppeteer 代码之间得到了不同的结果。我正在使用无头铬和 puppeteer-extra-plugin-stealth,所以它可能不是验证码或任何东西。相反,它似乎是某种类型的广告重定向,把一切都搞砸了。

使用控制台上的querySelector,我可以点击我想要的按钮。

document.querySelectorAll("button[class*=OfferCta__]")[1].click()

这会在同一页面上打开一个模式。有时它还会打开另一个网站的新标签。

不幸的是,当我通过 nodejs 在 puppeteer 上运行等效项时:

    const buttons = await page.$$("button[class*=OfferCta__]");
    await page.waitFor(2000);
    await buttons[1].click();
    await page.waitFor(6000);
    await page.screenshot({ path: "screenshot.png" });

所有出现的只是一个广告,后面跟着很多空白,没有别的:

我要抓取的页面是https://www.retailmenot.com/view/myntra.com

编辑:我在日志中发现了一些有趣的东西。如日志所示,每两分钟,puppeteer 似乎就会重新启动。前几次它像往常一样失败,但在第五次重新启动时,在我运行代码十分钟后,它运行正常,我用“完成检索”表示。我有一种感觉,这意味着成功的条件,不管是什么,都是随机的?

编辑:时间上似乎确实是随机的。我打开了一个 headful={false} 实例,这样我就可以看到发生了什么。在空白上方的唯一广告接管之前,Puppeteer 会进入正确结果的不同阶段(着陆页、点击前的页面、甚至成功点击后的页面)。

奇怪的是,该 url 仍然显示正确的地址,因此它也不是重定向,即使它显示的是广告而没有其他内容。很奇怪。

我有种下沉的感觉,这可能是一个反机器人功能。检测机器人?切换到广告并且没有内容。如果是这种情况,也许我可以玩弄时间延迟,看看有什么效果。

我猜到这是一个 javascript 脚本搞砸了。我在 puppeteer 中禁用了 javascript,它停止给我广告。不幸的是,这也破坏了我最初需要的按钮按下功能,所以......我会看看我是否能找到有问题的脚本。

我发现了有问题的脚本:

https://www.retailmenot.com/tng/_next/static/chunks/34.c2f99cfb33704560c5d7.jshttps://www.retailmenot.com/tng/_next/static/chunks/35.f67d49e4abce303212c6.js

请求使用开发者工具阻止它们停止了广告。正如你所看到的,它们都来自同一个站点,所以这是故意的。混蛋……咕咕咕咕咕。

现在,如何以编程方式阻止这些...

不过,我之前注意到了一些奇怪的事情。脚本仅在我稍微移动鼠标时运行。当 puppeteer 运行时不应该发生这种情况吗?我可以检查一个选项以使 puppeteer 鼠标无法检测到吗?

似乎脚本在启动时以及鼠标移动时运行,因此解释了上述情况。我已经编写了一个请求拦截器,并摆脱了一大堆涉及广告的第三方脚本。让我们看看它是否有效。

编辑:工作。

【问题讨论】:

    标签: javascript node.js web-scraping automation


    【解决方案1】:

    原来是网页上的一个脚本导致其行为不同。我最终用这段代码阻止了所有第三方脚本:

        page.on("request", (request) => {
          request.abort();
        });
    

    由于操作我需要的按钮的脚本嵌入在 html 中,这很好。如果您需要更细粒度地阻止请求,可以这样做:

        page.on("request", (request) => {
          const url = request.url();
          const filters = [
            "https://www.retailmenot.com/tng/_next/static/chunks/",
            "https://www.retailmenot.com/thumbs/ops/promoContent/Site_SavingsEducation_StickyBanner_200x100.png",
            "btstatic",
            "googleadservices",
            "doubleclick",
            "idsync",
            "quant",
            "facebook",
            "amazon",
            "tracking",
            "taboola",
            ".gif",
            "google-analytics",
            "forter",
          ];
    
          const shouldAbort = filters.some(
            (urlPart) => url.includes(urlPart) && !url.includes("https://www.retailmenot.com/tng/_next/static/chunks/commons.")
          );
          //'https://www.retailmenot.com/tng/_next/static/chunks/34.c2f99cfb33704560c5d7.js'
          if (shouldAbort) request.abort();
          else {
            //console.log(url);
            request.continue();
          }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2010-11-14
      • 2012-07-11
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多