从一页获取数据很简单,但是如何从首页获取数据,进入新页面,从该页面获取数据……等等。我正在网站{{3}上尝试这样做}。
因此,我选择打印存货中的书籍数量,因为只有在输入链接后才能对其进行访问。例如,如果您运行代码,您将获得:{ stock: 'In stock (22 available)' }
现在,我希望返回原始页面,输入第二个链接,并获取与上一个相同的信息。等等。
如何使用原始JavaScript完成此操作?
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('http://books.toscrape.com/');
await page.click('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.image_container > a > img');
await page.waitFor(1000);
const result = await page.evaluate(() => {
let stock = document.querySelector('#content_inner > article > table > tbody > tr:nth-child(6) > td').innerText;
return {
stock
}
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value); // Success!
});
答案 0 :(得分:1)
您需要做的是在完成任务后调用page.goBack()
返回上一页,然后单击下一个元素。为此,您应该使用page.$$
来获取可点击元素的列表,并使用循环逐个地遍历它们。然后,您可以重新运行脚本以为下一页提取相同的信息。
我修改了您的代码,以在控制台中为以下每一页打印出所需的结果。请注意,我从您的问题中更改了选择器,以删除:nth-child(1)
以选择所有可点击的元素。
const puppeteer = require('puppeteer');
const elementsToClickSelector = '#default > div > div > div > div > section > div:nth-child(2) > ol > li > article > div.image_container > a > img';
let scrape = async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('http://books.toscrape.com/');
// get all elements to be clicked
let elementsToClick = await page.$$(elementsToClickSelector);
console.log(`Elements to click: ${elementsToClick.length}`);
for (let i = 0; i < elementsToClick.length; i++) {
// click element
elementsToClick[i].click();
await page.waitFor(1000);
// generate result for the current page
const result = await page.evaluate(() => {
let stock = document.querySelector('#content_inner > article > table > tbody > tr:nth-child(6) > td').innerText;
return { stock };
});
console.log(result); // do something with the result here...
// go back one page and repopulate the elements
await page.goBack();
elementsToClick = await page.$$(elementsToClickSelector);
}
browser.close();
};
scrape();