Веб-сайт, который я пытаюсь очистить, динамически загружает свой контент. Playwright Crawler нажимает кнопку «Загрузить», чтобы загрузить дополнительные списки. Он отображает 30 списков на странице. Есть более 2000 списков, я хочу, чтобы парсер щелкал каждую ссылку с номером телефона, чтобы загрузить ее, а затем извлечь ее. Сценарий делает это, но мне нужно увеличить время ожидания, чтобы сценарий мог работать бесконечное время.
Ошибка:
PlaywrightCrawler: возврат неудачного запроса обратно в список или очередь. Тайм-аут requestHandler истек через 60 секунд
import { PlaywrightCrawler, Configuration, Dataset } from 'crawlee';
const crawler = new PlaywrightCrawler({
requestHandler: async ({ request, page, enqueueLinks, log }) => {
try {
const title = await page.title();
log.info(`Title of ${request.loadedUrl} is '${title}'`);
const curser_i = 0
for(let i=curser_i; i< await curser_i+10; i++){
const btn= await page.locator('#page_content div.je2-businesses-list div.je2-business-item__buttons').nth(i);
await page.waitForTimeout(3000);
const a = await btn.locator('a').click()
}
}
catch (error) {
console.error("An error occurred:", error.message);
}
finally {
console.info("Finally block executed.");
}
},
headless: false,
})
// Here we start the crawler on the selected URLs.
await crawler.run(['https://www.jamesedition.com/offices?category=real_estate']);
Пожалуйста, проверь это! Я добавил код, который перебирает элементы и нажимает кнопку, чтобы загрузить номер телефона.
Ах, окей, вы используете waitForTimeout
, а это огромное замедление. Я рассмотрю это позже, если у меня будет время. Спасибо за обновления.
ОК, с нетерпением жду этого
Обработчик запросов Playwright по умолчанию имеет время ожидания 60 секунд — см. PlaywrightCrawlerOptions
Документацию по API здесь.
Чтобы позволить одному вызову requestHandler
выполняться дольше 60 секунд, вам необходимо установить тайм-аут на расчетное время выполнения обработчика в секундах.
import { PlaywrightCrawler, Configuration, Dataset } from 'crawlee';
const crawler = new PlaywrightCrawler({
requestHandlerTimeoutSecs: 1800, // e.g. set requestHandler timeout to 30 minutes
requestHandler: async ({ request, page, enqueueLinks, log }) => {
// ...
},
})
await crawler.run(['https://foo.bar']);
По-видимому, установка requestHandlerTimeoutSecs: 0
не создает неопределенный тайм-аут обработчика запроса. В моем понимании класса BasicCrawler
— цепочки наследования PlaywrightCrawler
> BrowserCrawler
> BasicCrawler
— установка таймаута на 0 в конечном итоге приводит к таймауту по умолчанию, равному 60 секундам. Итак, насколько я понимаю, вам нужно выбрать достаточно безопасный тайм-аут для обработчика запроса. Однако максимум, похоже, равен 2147483647. См. здесь и здесь.
Спасибо @ggorlen, я добавил свой пример кода. Я хочу настроить тайм-аут, чтобы Кроули и Драматург оставались активными.