在控制台中的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
用开发者工具阻止他们的请求阻止了广告。如你所见,它们都来自同一站点,所以这是故意的。混蛋..。发牢骚。
现在,如何通过编程阻止这些……
不过,早些时候我注意到了一些奇怪的事情。脚本仅在我稍微移动鼠标时运行。当puppeteer运行正常时,不应该发生这种情况?有没有什么办法可以让木偶表演者的鼠标不被检测到?
脚本似乎在启动时运行,当鼠标移动时也会运行,所以这就解释了上面的情况。我写了一个请求拦截器,去掉了一大堆涉及广告的第三方脚本。让我们看看它是否有效。
编辑:已工作。
发布于 2020-10-28 02:58:55
原来是网页上的一个脚本让它的行为有所不同。我最终使用以下代码阻止了所有第三方脚本:
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();
}
});
https://stackoverflow.com/questions/64546228
复制相似问题