我在控制台中的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" });
我要抓取的页面是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
使用开发者工具阻止它们的请求停止了广告。如您所见,它们都源自同一站点,因此是有意的。混蛋...发牢骚发牢骚。
现在,如何以编程方式阻止这些行为...
我早些时候注意到了一件奇怪的事。仅当我稍微移动鼠标时脚本才运行。当木偶戏运行正常时,那不应该发生吗?我可以检查一下以使木偶鼠标无法被检测到吗?
似乎脚本在启动时以及在鼠标移动时运行,因此可以解释上面的内容。我编写了一个请求阻止程序,并摆脱了涉及广告的大量第三方脚本。让我们看看它是否有效。
编辑:有效。
答案 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();
}
});