如何从带有木偶的旋转木马中提取文本?

时间:2020-05-19 22:42:11

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

我想在OuiNon按钮上单击时得到this webpage及以下文本,并将它们存储为json文件:

enter image description here

我愿意使用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)

那么如何从带有伪造者的网页中提取文本?

1 个答案:

答案 0 :(得分:1)

  1. 此选择器位于iframe内,因此您需要先找到此框架。
  2. 虽然您对木偶戏的使用还不那么丰富,但是通过在浏览器上下文中执行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 ?'
]