【问题标题】:How to extract text from a carousel with puppeteer?如何使用 puppeteer 从旋转木马中提取文本?
【发布时间】:2020-05-19 22:42:11
【问题描述】:

我想在点击OuiNon按钮时获取this webpage的文本以及以下内容,它们将在同一个地方,并将它们存储为json文件:

我对 javascript 和 python 中的解决方案持开放态度。我尝试了以下一个:

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('http://www.leparisien.fr/elections/municipales/municipales-a-paris-notre-simulateur-pour-savoir-quel-candidat-vous-correspond-le-mieux-05-03-2020-8273238.php');

    const pollFrame = page.frames().find(
      frame => frame.url() === 'https://livemixr-assets.s3-eu-west-1.amazonaws.com/quel-candidat/index.html'
    );

    // getting first question
    const data = await pollFrame.evaluate(
      () => document.querySelector('html > body > div > div > div > div > div:nth-child(5) > h4').innerText
    );

    console.log(data);

    // clicking on an answer
    await page.$x('/html/body/div/div/div[1]/div/div[5]/div/div/label[1]')
    const elements = await page.$x('/html/body/div/div/div[1]/div/div[5]/div/div/label[1]')
    await elements[0].click()

    // getting second question
    const data2 = await pollFrame.evaluate(
      () => document.querySelector('html > body > div > div > div > div > div:nth-child(5) > h4').innerText
    );

    console.log(data2);


    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

获取第一个文本,单击一个按钮,获取第二个文本。 但出现以下错误:

C:\Users\antoi\Documents\Programming\Scraping>node scraper.js
Faut-il accélérer l’automatisation du métro ?
TypeError: Cannot read property 'click' of undefined
    at main (C:\Users\antoi\Documents\Programming\Scraping\scraper.js:24:23)
    at processTicksAndRejections (internal/process/task_queues.js:94:5)

那么如何使用 puppeteer 从网页中提取文本?

【问题讨论】:

    标签: javascript python-3.x web-scraping puppeteer


    【解决方案1】:
    1. 此选择器位于 iframe 内,因此您需要先找到此框架。
    2. 虽然您在 puppeteer 方面没有那么丰富的经验,但通过在浏览器上下文中执行 Web API 代码来使用 page.evaluate()(或 frame.evaluate())来获取文档数据会更容易。

    例如:

    'use strict';
    
    const puppeteer = require('puppeteer');
    
    (async function main() {
      try {
        const browser = await puppeteer.launch();
        const [page] = await browser.pages();
    
        await page.goto('http://www.leparisien.fr/elections/municipales/municipales-a-paris-notre-simulateur-pour-savoir-quel-candidat-vous-correspond-le-mieux-05-03-2020-8273238.php');
    
        await page.waitForSelector('iframe[src="https://livemixr-assets.s3-eu-west-1.amazonaws.com/quel-candidat/index.html"]');
    
        const pollFrame = page.frames().find(
          frame => frame.url() === 'https://livemixr-assets.s3-eu-west-1.amazonaws.com/quel-candidat/index.html'
        );
    
        const data = await pollFrame.evaluate(() => {
          const texts = [];
          while (document.querySelector('div.ant-modal-content') === null) {
            texts.push(document.querySelector('div:nth-child(5) > h4').innerText);
    
            document.querySelectorAll('input[type="radio"]')[1].click();
            // or: document.querySelector('input[type="radio"][value="Non"]').click();
          }
          return texts;
        });
    
        console.log(data);
    
        await browser.close();
      } catch (err) {
        console.error(err);
      }
    })();
    

    输出:

    [
      'Faut-il accélérer l’automatisation du métro ?',
      'Faut-il faire payer le stationnement des deux-roues ?',
      'Faut-il interdire les bus de tourisme dans la capitale ?',
      'Faut-il piétonniser les quatre arrondissements centraux de la capitale ?',
      'Faut-il réduire le nombre de places de stationnement en surface ?',
      "Faut-il rendre le Vélib' gratuit ?",
      'Faut-il renforcer la vidéoverbalisation ?',
      'Faut-il rouvrir à la circulation les voies sur berges ?',
      'Faut-il interdire les trottinettes électriques ? (free floating)',
      'Le périphérique doit-il...',
      'Les transports doivent-ils être rendus gratuits...',
      "Faut-il demander l'annulation des Jeux olympiques ?",
      'Faut-il mettre fin à la pratique du tirage au sort pour le conservatoire ?',
      'Faut-il augmenter le nombre de caméras de vidéo-surveillance dans la rue ?',
      'Faut-il créér une police municipale ?',
      'Le future police municipale doit-elle être armée ?',
      "Faut-il augmenter le montant des amendes (jets de mégots, urine, dépôt d'ordures...) ?",
      'Faut-il privatiser le ramassage des déchets ?',
      'À Paris, la société Airbnb doit-elle être ...',
      'Faut-il baisser le nombre de nuitées autorisées à la location sur Airbnb (120 jours actuellement) ?',
      "Faut-il maintenir l'encadrement des loyers?",
      "En priorité, l'accès au logement social doit-il être attribué ...",
      'Faut-il accroître le nombre de logements sociaux ?',
      'En matière de finances, faut-il ...',
      'Faut-il interdire les animaux sauvages dans les cirques ?',
      'Faut-il proposer une alternative végétarienne tous les jours dans les cantines ?',
      'Faut-il piétonniser les abords des écoles ?',
      "Quelle est la priorité pour améliorer l'environnement ?",
      'En cas de grèves, faut-il un service minimum pour les crèches et les écoles ?',
      'Faut-il revenir à la semaine de 4 jours dans les écoles ?',
      'Les tarifs des cantines scolaires doivent-ils ... ?',
      'Faut-il étendre le travail du dimanche ?'
    ]
    

    【讨论】:

    • 谢谢!很抱歉再次打扰您,但是点击OuiNon按钮时如何获取以下项目的文本?
    • 我们需要获取文本,单击按钮(按顺序或值)结束通过检查一些最终元素来检查这是否是结束——所有这些都在一个循环中。我已经更新了示例。
    • 顺便说一句,在您更新的变体中,您需要在找到 iframe 后的所有下一行中使用 pollFrame,而不是 page,因为所有其他需要的元素仍位于此 iframe 中。跨度>
    • 请注意,输入值并不总是OuiNon,还有其他一些变体。
    • 非常感谢!你知道如何获取... 的全部内容吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 2014-02-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多