есть скрипт, который парсит блог. блог состоит из списка статей и внутренних страниц. соответственно парсер имеет два уровня:
- парсинг списка страниц
- парсинг содержимого детальной страницы
на втором уровне у меня вываливается ошибка о том, что переменная browser равно undefined. поэтому
await browser.newPage();
для внутренних страниц не срабатывает. помогите пожалуйста понять что нужно исправить чтобы заработало.
const puppeteer = require('puppeteer');
const fs = require('fs');
let firstPageNum = null;
let lastPageNum = null;
const scrape = async () => {
const allData = [];
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://pycoder.ru/tags/?tag=python&page=1');
const result_ = await page.evaluate(() => {
const firstPageLink = parseInt(document.querySelector('.page-link:first-child').getAttribute('href').slice(-1), 10);
const lastPageLink = parseInt(document.querySelectorAll('.page-link')[2].getAttribute('href').slice(-1), 10);
return {
firstPageLink,
lastPageLink,
}
});
firstPageNum = result_.firstPageLink;
lastPageNum = result_.lastPageLink;
browser.close();
for(let pageNum = firstPageNum; pageNum <= lastPageNum; pageNum++) {
const browser = await puppeteer.launch({devtools: true});
const page = await browser.newPage();
await page.goto('https://pycoder.ru/tags/?tag=python&page=' + pageNum);
const result = await page.evaluate(() => {
let data = [];
let elements = document.querySelectorAll('.post');
debugger;
elements.forEach(element => {
let linkDetails = element.querySelector('.post_link_next').getAttribute('href');
let scrapeInerPage = async (linkDetails) => {
await browser.newPage();
await pageInner.goto(linkDetails);
title = element.querySelector('.blog-main h2').innerHTML;
date = element.querySelector('.blog-main p.meta').innerHTML;
pageInner.close();
return {
title: title,
date: date,
};
}
scrapeInerPage(linkDetails).then(res => {
data.push('helloWorld');
// data.push({pageInner.title, pageInner.date});
return data;
}).catch(function (err) {
console.log("Promise Rejected", err);
});
});
});
allData.push(...result);
// allData.push(...result);
// browser.close();
}
return allData;
};
scrape().then((results) => {
console.log(results);
fs.writeFile('./results.json', JSON.stringify(results), err => err ? console.log(err): null);
}).catch(function (err) {
console.log("Promise Rejected2", err);
});
кода много, но ошибка конкретно здесь:
let scrapeInerPage = async (linkDetails) => {
await browser.newPage();
await pageInner.goto(linkDetails);