PlaywrightCrawler: возврат неудачного запроса обратно в список или очередь. Тайм-аут requestHandler истек через 60 секунд

Веб-сайт, который я пытаюсь очистить, динамически загружает свой контент. 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']);

Спасибо @ggorlen, я добавил свой пример кода. Я хочу настроить тайм-аут, чтобы Кроули и Драматург оставались активными.

Mujahid Alkausari 21.04.2024 19:22

Пожалуйста, проверь это! Я добавил код, который перебирает элементы и нажимает кнопку, чтобы загрузить номер телефона.

Mujahid Alkausari 21.04.2024 21:22

Ах, окей, вы используете waitForTimeout, а это огромное замедление. Я рассмотрю это позже, если у меня будет время. Спасибо за обновления.

ggorlen 21.04.2024 21:24

ОК, с нетерпением жду этого

Mujahid Alkausari 21.04.2024 21:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
277
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обработчик запросов 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. См. здесь и здесь.

Другие вопросы по теме