【发布时间】: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.js
和https://www.retailmenot.com/tng/_next/static/chunks/35.f67d49e4abce303212c6.js
请求使用开发者工具阻止它们停止了广告。正如你所看到的,它们都来自同一个站点,所以这是故意的。混蛋……咕咕咕咕咕。
现在,如何以编程方式阻止这些...
不过,我之前注意到了一些奇怪的事情。脚本仅在我稍微移动鼠标时运行。当 puppeteer 运行时不应该发生这种情况吗?我可以检查一个选项以使 puppeteer 鼠标无法检测到吗?
似乎脚本在启动时以及鼠标移动时运行,因此解释了上述情况。我已经编写了一个请求拦截器,并摆脱了一大堆涉及广告的第三方脚本。让我们看看它是否有效。
编辑:工作。
【问题讨论】:
标签: javascript node.js web-scraping automation