веб-парсинг: перебирать каждую страницу веб-приложения с помощью кукольника - PullRequest
2 голосов
/ 11 июля 2020

Я полный новичок в javascript и puppeteer, и я пытаюсь получить первые 151 описание покемонов с веб-сайта Bulapedia https://en.wikipedia.org/wiki/List_of_generation_I_Pok%C3%A9mon На картинке ниже я копирую XPath синего отмеченного элемента один экземпляр покемона, и это текст, который я хочу показать

введите описание изображения здесь

Используя приведенный ниже код, я могу захватить элемент и показать текст в значении json, но я могу сделать это вручную только для одного покемона за раз. Я хочу использовать puppeteer для перебора каждой страницы и делать это для первых 151 покемона. Мой код:

const puppeteer = require('puppeteer');

async function getDesc(url){

    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);
    //xpath of the selected text above in the pic 
    const [el] = await page.$x('//*[@id="mw-content-text"]/table[5]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td');
    const text = await el.getProperty('textContent');
    srcTxt = await text.jsonValue();

    console.log({srcTxt});

    browser.close();

}



//give url for a specific pokemon as input 
getDesc('https://bulbapedia.bulbagarden.net/wiki/Bulbasaur_(Pok%C3%A9mon)');

Я считаю, что решение для l oop, которое выполняет итерацию по каждому URL-адресу для каждого экземпляра покемона, является решением. Однако я не знаю, как реализовать это с помощью кукловода, и был бы признателен за вашу помощь. Заранее спасибо.

1 Ответ

2 голосов
/ 11 июля 2020

Если у вас есть массив URL-адресов, вы можете попробовать что-то вроде этого:

'use strict';

const puppeteer = require('puppeteer');

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

    const urls = ['https://example.org/1', 'https://example.org/2'];
    const allData = [];

    for (const url of urls) {
      await page.goto(url);

      const data = await page.evaluate(() => {
        return document.querySelector('a').innerText;
      });

      allData.push(data);
    }

    console.log(allData);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...