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']);
关键说明
- 超时设置:
requestHandlerTimeoutSecs控制整个请求处理函数的执行超时,2000+条数据建议设置为600秒(10分钟)以上,确保有足够时间完成所有操作 - 加载更多逻辑:通过while循环自动检测并点击Load按钮,直到按钮消失,避免遗漏列表内容
- 元素重新定位:循环中每次重新获取目标元素,防止页面加载新内容后旧元素引用失效
- 容错处理:单个商家的点击/提取操作单独捕获错误,不会因为某一条出错导致整个页面的处理中断
内容的提问来源于stack exchange,提问作者Alkausari M
相关产品推荐
相关产品推荐

