Я пытаюсь почистить некоторые сайты. Навигация выглядит следующим образом:
- Откройте начальную страницу.
- Нажмите на каждый URL один за другим, зарегистрируйте соответствующую информацию.
- Перейдите на следующую страницу, повторитешаг 2.
- Закройте браузер, когда больше нет следующей кнопки.
Проблема заключается в том, что после того, как я нажимаю на первый URL из списков и регистрирую некоторую информацию, оностанавливает его выполнение, выдавая ошибку Error: Execution context was destroyed, most likely because of a navigation.
Можно ли сохранить глубокий клон предыдущей страницы и каким-то образом использовать его, чтобы нажать на следующий URL? Или есть какой-то другой способ, которым я могу достичь этой навигации?
Вот мой код:
index.js
const hatla2ee = require('./hatla2ee');
(async () => {
await hatla2ee.initialize();
let results = await hatla2ee.getListings();
debugger;
})();
hatla2ee.js
const puppeteer = require("puppeteer");
const chalk = require("chalk");
var fs = require("fs");
const error = chalk.bold.red;
const success = chalk.keyword("green");
const start_url = "https://eg.hatla2ee.com/en/car"
const self = {
browser: null,
page: null,
initialize: async () => {
self.browser = await puppeteer.launch({ headless: false });
self.page = await self.browser.newPage();
self.pageNew = await self.browser.newPage();
await self.page.setViewport({ width: 1440, height: 768 });
await self.page.goto(start_url, { waitUntil: 'networkidle0' });
},
getListings: async () => {
let results = [];
do {
let new_results = await self.getUrls();
results = [results, ...new_results]
console.log(results);
let nextButton = await self.page.$x(`//div[@class='pagination pagination-right']/ul/li`);
let nextPage = await nextButton[nextButton.length-1];
let buttonText = (await(await nextPage.getProperty(`innerText`)).jsonValue());
console.log(success(buttonText))
if (buttonText.includes(`Next`)){
await nextPage.click();
await self.page.waitForNavigation({ waitUntil: 'networkidle0' });
}else{
break;
}
}while (true);
return results;
},
getUrls: async () => {
let urls = await self.page.$x(`//a[@class='NewListTitle']`);
let results = [];
for (let url of urls) {
url.click()
await self.page.waitForNavigation({ waitUntil: 'networkidle0' });
/*let href = await (await url.getProperty(`href`)).jsonValue()
results.push(href)
console.log(href)
await self.page.goto(href, { waitUntil: 'networkidle0' });
await self.page.waitForNavigation({ waitUntil: 'networkidle0' });
*/
}
return results;
}
}
module.exports = self;