【发布时间】:2020-07-10 21:53:39
【问题描述】:
我是javascript 和puppeteer 的初学者,我正在尝试从bulapedia 网站https://en.wikipedia.org/wiki/List_of_generation_I_Pok%C3%A9mon 获取前151 个口袋妖怪描述
在下图中,我复制了单个 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 来实现这一点,我将不胜感激。提前谢谢你。
【问题讨论】:
-
我已经在 npm 上的一个库中完成了这项工作,但是您可能需要获取每个访问页面上的每个锚点/链接,存储这些链接确保不重复并跟踪哪些链接已经访问过,递归导航到页面/链接并执行所需的逻辑,直到用完链接。
-
@AlexanderStaroselsky 感谢您的回复。有没有更好的办法?
-
更好的方法是什么意思?如果您询问 puppeteer 是否有一个内置的方法来自动和递归地完成您正在尝试的自定义逻辑,它没有。您需要创建逻辑来确定它应该访问哪些页面,然后为每个页面执行访问和逻辑。但有人可能已经找到了更有效的方法。
-
@KresimirPendic 我使用 FETCH API 来获取它们。我采取了完全不同的方法。
标签: javascript web-scraping puppeteer