Im Puppeteer-Browser kam es zu unerwartetem Schließverhalten nach dem Klicken auf die Schaltfläche „Cookie akzeptieren'.
P粉883278265
P粉883278265 2023-08-16 21:40:51
0
1
411
<p>Ich versuche, node.js und puppeteer zu verwenden, um eine Website nach Echtzeit-Fußballinformationen zu crawlen, aber nach console.log("trying to select team element") wird mein Browser sofort geschlossen. </p> <pre class="brush:php;toolbar:false;">const puppeteer = require("puppeteer"); asynchrone Funktion openPage() { const browser = waiting puppeteer.launch( {headless: true} ); const page = waiting browser.newPage(); Warten Sie auf page.setViewport({ width: 1000, height: 926 }); Warten Sie auf page.goto("https://www.livescore.com/en/"); //Cookies akzeptieren const button = waiting page.waitForSelector('#onetrust-accept-btn-handler'); if (Schaltfläche) { Warten Sie auf button.click(); console.log("Cookie-Schaltfläche angeklickt"); }; Rückkehrseite; } asynchrone Funktion scrapeData(page) { let content = []; // Holen Sie sich die Wettbewerbselemente let elements = wait page.waitForSelector(".Ip") console.log("versucht, ein Teamelement auszuwählen") for (let i=0; i < elements.length; i++) { let homeTeamElement = waiting elements[i].$(".Ip") if (homeTeamElement) { const homeTeamText = waiting homeTeamElement.evaluate(node ​​=> node.textContent); content.push(homeTeamText); } }; Inhalt zurückgeben; }; (async () => { const page = wait openPage(); const dataScraped = waiting scrapeData(page); console.log(dataScraped) Warten Sie auf page.browser().close(); })();</pre> <p>Alle Ideen, warum das so ist, und weitere Kritik an meinem Code sind willkommen! </p>
P粉883278265
P粉883278265

Antworte allen(1)
P粉798010441

await page.waitForSelector(".Ip")只返回一个元素,而不是一个数组,所以无法循环遍历。应该有一个清晰的错误消息来解释这个问题。相反,可以使用page.$$eval(或者如果你想尝试最新的定位器 API)来提取数据。

const puppeteer = require("puppeteer"); // ^21.0.2

const url = "";

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  await page.setViewport({width: 1000, height: 926});
  await page.goto(url, {waitUntil: "domcontentloaded"});

  // not really necessary
  const button = await page.waitForSelector("#onetrust-accept-btn-handler");
  await button.click();

  await page.waitForSelector(".Ip");
  const content = await page.$$eval(".Ip", els =>
    els.map(e => {
      const text = id =>
        e.querySelector(`[id*=${id}]`).textContent.trim();
      return {
        time: text("status-or-time"),
        home: text("home-team-name"),
        away: text("away-team-name"),
        homeTeamScore: +text("home-team-score"),
        awaitTeamScore: +text("away-team-score"),
      };
    })
  );
  console.log(content);
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

注:

  • 关闭cookie横幅对于爬取来说并不是必需的,但如果你使用它,没有必要检查waitForSelector的返回值。它保证是该元素,否则如果在规定时间内找不到它,它会抛出异常。
  • await elements[i].$(".Ip")不会帮助你访问任何内容,因为在你已经持有的.Ip元素内部没有.Ip
  • 避免使用ElementHandles,它们速度慢、不可靠且冗长。
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!