You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PlaywrightCrawler请求处理超时问题:如何延长爬虫超时时间?

解决PlaywrightCrawler请求处理超时问题

你的爬虫因请求处理逻辑耗时超过默认60秒触发了超时错误,要解决这个问题,主要从延长超时时间和优化代码逻辑两方面入手,同时补上你需要的「点击Load按钮加载更多列表」的核心逻辑:

核心修改点

  • 延长requestHandlerTimeoutSecs:默认60秒,根据操作耗时设置足够长的时间,比如300秒(5分钟)
  • 补上加载更多列表的循环逻辑:自动点击Load按钮直到没有更多内容
  • 优化元素定位与循环逻辑,避免不必要的异步等待,同时增加单条操作的错误容错

修改后的完整代码

import { PlaywrightCrawler, Dataset } from 'crawlee';

const crawler = new PlaywrightCrawler({
    requestHandler: async ({ page, log }) => {
        try {
            const title = await page.title();
            log.info(`当前页面标题: ${title}`);

            // 先处理加载更多列表的逻辑
            while (true) {
                try {
                    // 定位Load按钮并等待可见
                    const loadBtn = page.locator('button:has-text("Load")');
                    await loadBtn.waitFor({ state: 'visible', timeout: 5000 });
                    await loadBtn.click();
                    // 等待新列表加载完成
                    await page.waitForTimeout(2000);
                    log.info('已加载更多列表');
                } catch (err) {
                    // 没有更多Load按钮时退出循环
                    log.info('没有更多列表可加载');
                    break;
                }
            }

            // 获取所有商家的按钮总数
            const btnCount = await page.locator('#page_content div.je2-businesses-list div.je2-business-item__buttons').count();
            log.info(`共找到 ${btnCount} 个商家按钮`);

            // 循环点击每个电话号码链接并提取号码
            for (let i = 0; i < btnCount; i++) {
                try {
                    // 每次循环重新定位元素,避免页面更新后元素失效
                    const btn = page.locator('#page_content div.je2-businesses-list div.je2-business-item__buttons').nth(i);
                    await btn.locator('a').click();
                    // 等待电话号码加载(可根据实际页面结构调整等待逻辑)
                    await page.waitForTimeout(1500);
                    // 提取电话号码(请替换成页面实际的号码选择器)
                    const phoneNumber = await page.locator('.je2-business-item__phone').textContent();
                    if (phoneNumber) {
                        await Dataset.pushData({ phone: phoneNumber.trim() });
                        log.info(`提取到号码: ${phoneNumber.trim()}`);
                    }
                } catch (err) {
                    log.error(`处理第 ${i+1} 个商家时出错: ${err.message}`);
                    continue;
                }
            }
        } catch (error) {
            log.error('请求处理出错:', error.message);
        } finally {
            log.info('当前页面处理完成');
        }
    },
    headless: false,
    // 延长请求处理超时时间到300秒(可根据总条数调整,比如2000+条可设为600秒)
    requestHandlerTimeoutSecs: 300,
    // 可选:延长浏览器启动超时时间
    launchContext: {
        launchOptions: {
            timeout: 60000,
        },
    },
});

await crawler.run(['https://www.jamesedition.com/offices?category=real_estate']);

关键说明

  1. 超时设置:requestHandlerTimeoutSecs控制整个请求处理函数的执行超时,2000+条数据建议设置为600秒(10分钟)以上,确保有足够时间完成所有操作
  2. 加载更多逻辑:通过while循环自动检测并点击Load按钮,直到按钮消失,避免遗漏列表内容
  3. 元素重新定位:循环中每次重新获取目标元素,防止页面加载新内容后旧元素引用失效
  4. 容错处理:单个商家的点击/提取操作单独捕获错误,不会因为某一条出错导致整个页面的处理中断

内容的提问来源于stack exchange,提问作者Alkausari M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:56:12