使用 puppeteer 进行并行抓取
Parallel scraping with puppeteer
目前我有一些代码正在从 mongodb 获取数组。抓取器循环遍历数组,并从网站上抓取数组中的每个值。我的问题是它目前真的很慢。我怎样才能并行化它以便同时抓取更多数据?
编辑:这是我要并行化的函数示例:
async function scrape(browser, page, i) {
//Start new Browser session
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
await page.goto(dealer);
//Site specific code
await page.type('.Search-bar-text-input', arrayOfArticles[i]);
await page.click('.Embedded-search-button')
await page.waitFor('.BuyingOptions-total', {timeout: 2000});
price = await page.evaluate(() => {
price = document.querySelector('.BuyingOptions-total').innerText;
console.log(price);
return price;
});
您始终可以使用 child_process
或 cluster
手动完成。或者您可以使用更自动的 node-pool
。
从这个issue:
const cluster = require("cluster");
const numCPUs = require("os").cpus().length;
const headless = true;
let forks = numCPUs; // 4
let browser;
if (cluster.isMaster) {
for (let i = 0; i < forks; i++) {
cluster.fork();
console.log('Fork #' + i);
}
} else {
connectToChrome();
}
function connectToChrome()
{
(async function() {
let headless = false;
if (args.headless) {
headless = true;
}
browser = await puppeteer.launch({headless: headless, args: ['--no-sandbox']});
})();
}
目前我有一些代码正在从 mongodb 获取数组。抓取器循环遍历数组,并从网站上抓取数组中的每个值。我的问题是它目前真的很慢。我怎样才能并行化它以便同时抓取更多数据?
编辑:这是我要并行化的函数示例:
async function scrape(browser, page, i) {
//Start new Browser session
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
await page.goto(dealer);
//Site specific code
await page.type('.Search-bar-text-input', arrayOfArticles[i]);
await page.click('.Embedded-search-button')
await page.waitFor('.BuyingOptions-total', {timeout: 2000});
price = await page.evaluate(() => {
price = document.querySelector('.BuyingOptions-total').innerText;
console.log(price);
return price;
});
您始终可以使用 child_process
或 cluster
手动完成。或者您可以使用更自动的 node-pool
。
从这个issue:
const cluster = require("cluster"); const numCPUs = require("os").cpus().length; const headless = true; let forks = numCPUs; // 4 let browser; if (cluster.isMaster) { for (let i = 0; i < forks; i++) { cluster.fork(); console.log('Fork #' + i); } } else { connectToChrome(); } function connectToChrome() { (async function() { let headless = false; if (args.headless) { headless = true; } browser = await puppeteer.launch({headless: headless, args: ['--no-sandbox']}); })(); }