Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 木偶演员与浏览器的不同行为_Javascript_Node.js_Web Scraping_Automation - Fatal编程技术网

Javascript 木偶演员与浏览器的不同行为

Javascript 木偶演员与浏览器的不同行为,javascript,node.js,web-scraping,automation,Javascript,Node.js,Web Scraping,Automation,我在控制台中的querySelector命令和NodeJ上的等效木偶程序代码之间得到了不同的结果。我使用的是无头铬和木偶演员额外的隐形插件,所以它可能不是验证码或其他东西。相反,它似乎是某种类型的广告重定向,把一切都搞砸了 使用控制台上的querySelector,我可以单击所需的按钮 document.querySelectorAll("button[class*=OfferCta__]")[1].click() 这将在同一页面上打开一个模式。有时它还会打开另一个网站的新

我在控制台中的querySelector命令和NodeJ上的等效木偶程序代码之间得到了不同的结果。我使用的是无头铬和木偶演员额外的隐形插件,所以它可能不是验证码或其他东西。相反,它似乎是某种类型的广告重定向,把一切都搞砸了

使用控制台上的querySelector,我可以单击所需的按钮

document.querySelectorAll("button[class*=OfferCta__]")[1].click()
这将在同一页面上打开一个模式。有时它还会打开另一个网站的新标签

不幸的是,当我通过nodejs在puppeter上运行等效程序时:

    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" });
出现的只是一则广告,后面是大量空白,没有其他内容:

我要刮的那一页是

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

编辑:它似乎在时间上是随机的。我打开了一个headful={false}实例,以便观察发生了什么。在空白上方的单独广告接管之前,傀儡玩家可以获得不同阶段的正确结果(登录页面、点击前的页面、甚至成功点击后的页面)

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

我觉得这可能是一个反机器人的功能。检测机器人?切换到广告和没有内容。如果是这样的话,也许我可以利用时间延迟,看看什么是有效的

我猜是javascript脚本把事情搞砸了。我在Puppeter中禁用了javascript,它停止了给我广告。不幸的是,这也破坏了我最初需要的按键功能,所以…我会看看是否能找到有问题的脚本

我发现了令人不快的脚本:

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

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

现在,如何通过编程阻止这些

不过,早些时候我注意到了一些奇怪的事情。只有当我稍微移动鼠标时,脚本才会运行。这不应该发生在木偶演员正在奔跑的时候,对吗?是否有一个选项,我可以检查,使木偶鼠标检测不到

脚本似乎在开始时以及鼠标移动时运行,因此可以解释上述内容。我已经写了一个请求拦截器,并且去掉了一大堆涉及广告的第三方脚本。让我们看看它是否有效


编辑:成功。

结果是网页上的一个脚本使其表现不同。我最终用以下代码阻止了所有第三方脚本:

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