Я занимаюсь какой-то независимой работой для парня, который хочет получить информацию о рекламе на своем веб-сайте. Мне нужно нажать на объявление с помощью Puppeteer и получить результирующий URL-адрес страницы.
Вот что я пробовал.
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
Нажатие на объявления определенно работает, однако вам нужно будет настроить каждую отдельную рекламную секцию по-разному и остерегаться последствий.
Прочитайте и используйте содержание ответа на свой страх и риск,
Рассмотрите эту страницу с помощью этого простого объявления, если вы попытаетесь проверить, вы увидите iframe, но, пожалуйста, посмотрите iframe внутри iframe и сильно варьируется между рекламными службами и целевым веб-сайтом.
Как обсуждалось здесь по этой проблеме, до сих пор мы могли сделать это, чтобы щелкнуть что-то внутри рамки.
await page.goto('https://example.com');
const frame = await page.frames().find(f => f.name() === 'someIframe');
const button = await frame.$('button');
button.click();
Теперь, если мы хотим щелкнуть этот конкретный элемент, что можно сделать? Имя не существует, идентификатор случайный. Переход на фактическую страницу объявления покажет 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' ]
Позвольте мне еще раз напомнить, что это явно незаконно, и счета могут быть подвергнуты риску. Используйте свою голову на свой страх и риск.
Вы можете использовать waitFor, чтобы убедиться, что конкретный селектор доступен в DOM https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#framewaitforselectororfunctionortimeout-options-args
#aw0
, вы видите рекламу, отображаемую в Chrome?