我正在为一个想要在其网站上的广告信息的人做一些自由职业。我需要点击带有Puppeteer的广告,并获取生成的页面网址。
这就是我尝试过的。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('http://example.com/page/ad', {waitUntil: 'networkidle2'});
await page.click('#aw0')
})();
它不断返回Error: No node found for selector: #aw0
答案 0 :(得分:1)
点击广告肯定可以,但是您需要对每个广告部分进行不同的调整,并注意后果。
阅读并使用答案的内容需要您自担风险,
将此页面与这个简单的广告一起考虑,如果您尝试进行检查,将会看到iframe,但进一步了解,它是iframe中的一个iframe,在广告服务和目标网站之间差异很大。
如here on the issue所述,到目前为止,我们可以执行此操作以单击框架中的某些内容。
await page.goto('https://example.com');
const frame = await page.frames().find(f => f.name() === 'someIframe');
const button = await frame.$('button');
button.click();
现在,如果我们要单击此特定元素,该怎么办?名称不存在,ID是随机的。转到实际的广告页面将显示iframe,但再次检查免责声明,
如果看到的话,主iframe src会显示/ads/adprotect300.aspx
,因此我们可以将其打开并单击其中的元素。我们还看到iframe的名称以mdns
开头。考虑到所有研究工作,我们可以编写这样的代码,
const page = await browser.newPage();
await page.goto('http://example.com/ads/adprotect300.aspx', {waituntil: "networkidle0"});
await page.waitFor('iframe');
await page.waitFor(4000); // artificial wait for randomness
const frame = await page.frames().find(f=>f.name().includes('mdns'));
const ad = await frame.$('div > a');
ad.click();
在此网站上,它打开了一个新标签页,如前所述,它单击了,现在我们要做的就是获取所有打开的标签页的链接,因此,如果在新标签页上有任何弹出窗口或重定向,它将被获取
await page.waitFor(2000);
const pages = await browser.pages()
console.log(pages.map(page=>page.url()))
还有更好的方法来等待导航和所有操作,但是我只是在说明可以做什么。结果,
[ 'chrome-search://local-ntp/local-ntp.html',
'http://example.com/ads/adprotect300.aspx',
'https://adwebsite/activity/htb/candy/pc?ref=93454&i=704ea49d-7b0b-4c05-b4d0-f0225ecc7154&h=12700290a03e232a14fa0f1cf35e27a346d91f6e&c=878146837666' ]
让我再次提醒您,这显然是非法的,帐户可能会面临风险。风险自负。
答案 1 :(得分:0)