Dans le navigateur Puppeteer, comportement de fermeture inattendu après avoir cliqué sur le bouton Cookie Accepter
P粉883278265
P粉883278265 2023-08-16 21:40:51
0
1
405
<p>J'essaie d'utiliser node.js et puppeteer pour explorer un site Web pour obtenir des informations sur le football en temps réel, mais après console.log("trying to select team element"), mon navigateur se ferme immédiatement. </p> <pre class="brush:php;toolbar:false;">const marionnettiste = require("marionnettiste"); fonction asynchrone openPage() { const navigateur = wait puppeteer.launch( {headless: true} ); const page = attendre navigateur.newPage(); wait page.setViewport({ largeur : 1000, hauteur : 926 }); attendre page.goto("https://www.livescore.com/en/"); //Accepter les cookies bouton const = attendre page.waitForSelector('#onetrust-accept-btn-handler'); si (bouton) { attendre le bouton.click(); console.log("clic sur le bouton cookie"); } ; page de retour ; } fonction asynchrone scrapeData (page) { laissez contenu = []; // Récupère les éléments du concours let elements = attendre page.waitForSelector(".Ip") console.log("essayer de sélectionner un élément d'équipe") pour (soit i=0; i < elements.length; i++) { laissez homeTeamElement = attendre les éléments[i].$(".Ip") si (homeTeamElement) { const homeTeamText = wait homeTeamElement.evaluate(node ​​​​=> node.textContent); content.push(homeTeamText); } } ; renvoyer du contenu ; } ; (async () => { const page = attendre openPage(); const dataScraped = wait scrapeData(page); console.log(dataScraped) attendre page.browser().close(); })();</pre> <p>Toutes les idées sur les raisons pour lesquelles c'est le cas et toute autre critique de mon code sont les bienvenues ! </p>
P粉883278265
P粉883278265

répondre à tous(1)
P粉798010441

await page.waitForSelector(".Ip")只返回一个元素,而不是一个数组,所以无法循环遍历。应该有一个清晰的错误消息来解释这个问题。相反,可以使用page.$$eval (ou si vous souhaitez essayer la dernière Locator API) pour extraire les données.

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());

Remarque :

  • La désactivation de la bannière des cookies n'est pas nécessaire pour l'exploration, mais si vous l'utilisez, il n'est pas nécessaire de vérifier la valeur de retour de waitForSelector. Il est garanti qu'il s'agit de l'élément, sinon il lèvera une exception s'il n'est pas trouvé dans le délai spécifié.
  • await elements[i].$(".Ip")不会帮助你访问任何内容,因为在你已经持有的.Ip元素内部没有.Ip.
  • Évitez d'utiliser ElementHandles, ils sont lents, peu fiables et verbeux.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!