首页 > 解决方案 > 网页抓取:使用 puppeteer 遍历网页应用的每一页

问题描述

我是一个完整的初学者,javascriptpuppeteer正在尝试从 bulapedia 网站获取前 151 个 pokemon 描述 在下https://en.wikipedia.org/wiki/List_of_generation_I_Pok%C3%A9mon 图中,我复制了单个 pokemon 实例的蓝色标记元素的 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)');

我相信为每个 pokemon 实例遍历每个 url 的 for 循环是解决方案。但是我不知道如何使用 puppeteer 来实现这一点,我将不胜感激。先感谢您 。

标签: javascriptweb-scrapingpuppeteer

解决方案


如果你有一个 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);
  }
})();

推荐阅读