用浏览器操纵木偶的不同行为

时间:2020-10-26 23:11:46

标签: javascript node.js web-scraping automation

我在控制台中的querySelector命令和nodejs上的等效伪指令代码之间得到了不同的结果。我使用的是无头铬和木偶额外插件隐身功能,因此它可能不是验证码或其他任何东西。相反,似乎是某种类型的广告重定向使一切混乱。

使用控制台上的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" });

显示的全部是一个广告,后面紧跟大量空白,仅此而已: enter image description here

我要抓取的页面是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

使用开发者工具阻止它们的请求停止了广告。如您所见,它们都源自同一站点,因此是有意的。混蛋...发牢骚发牢骚。

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

我早些时候注意到了一件奇怪的事。仅当我稍微移动鼠标时脚本才运行。当木偶戏运行正常时,那不应该发生吗?我可以检查一下以使木偶鼠标无法被检测到吗?

似乎脚本在启动时以及在鼠标移动时运行,因此可以解释上面的内容。我编写了一个请求阻止程序,并摆脱了涉及广告的大量第三方脚本。让我们看看它是否有效。

编辑:有效。

1 个答案:

答案 0 :(得分:0)

事实证明,这是网页上的脚本,它的行为有所不同。我最终用以下代码阻止了所有第三方脚本:

    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();
      }
    });