跳转到主要内容
本指南介绍 Bright Data Scraper Studio 团队推荐的编码模式,帮助您在 IDE 中编写快速、可靠的爬虫。每个章节都对比一种常见错误与推荐写法,并解释原因。

如何可靠地检测无效页面?

使用 navigate() 时,添加 dead_page() 条件,避免爬虫对不存在的页面进行重试。Bright Data Scraper Studio 会自动将 HTTP 404 响应标记为无效,但许多站点会返回 200 加一个”未找到”模板,因此需要您自行检测。 不要把 wait() 包在 try/catch 中,再从 catch 块里调用 dead_page()wait() 抛错只能说明选择器在超时窗口内未出现,并不能证明页面真的不存在。

如何减少对浏览器的请求次数?

clicktypeel_existsel_is_visiblewaitwait_visible 等交互命令都会向浏览器发送一次请求。请把多个选择器合并到一次调用中,而不是串联多次调用。

如何在不阻碍并行化的前提下处理分页?

当站点有分页结果、您又需要每一页的数据时,应在根页面上为每一页调用一次 rerun_stage()。不要在每页内顺序爬取分页时再调用 rerun_stage(),那样会把工作串行化,Bright Data Scraper Studio 无法并行处理请求。
避免在单个会话中收集所有页面。每个会话有 16MB 的结果大小限制,该限制统计会话中累积的全部数据,包括所有已收集的行、解析结果、子项和解析器元数据,而不仅仅是渲染页面的大小。为每一页调用一次 rerun_stage({url: input.url, page}),即可让每个会话只处理一页,并使每个会话保持在限制之内。

如何在不等待的情况下关闭弹窗?

使用 close_popup('popup_selector', 'close_button_selector') 注册一个后台监视器,让它在弹窗出现时自动关闭。不要在每次交互前用 wait_visible() 轮询弹窗:弹窗可能随时出现,而显式等待会给每一步都增加延迟。

解析前如何等待已标记的响应?

使用 tag_response() 捕获后台 API 调用后,紧接着调用 wait_for_parser_value() 以确保请求在读取 parser 之前已经完成。否则,解析器可能在响应到达之前就运行,导致 parser.<字段>undefined

是否应该抛出自定义错误信息?

不应该。让 Bright Data Scraper Studio 的内置错误自然冒出。内置错误会附带选择器、超时时间和阶段信息,比手写的 “Page not loaded properly” 更有用。只有当您要检查平台无法自行识别的、领域相关的条件时(例如缺少产品标题),才需要抛出自定义错误。

如何在不过度延长超时的前提下应对响应慢的站点?

大多数等待保持默认的 30 秒超时即可。如果某个特定页面长期较慢,可将超时上调到 45 或 60 秒。不要超过 60 秒:原因通常是 peer 较慢,而 Bright Data Scraper Studio 在页面报告超时错误后会自动用新的 peer 会话重试。

是否应该自己写重试循环?

不应该。Bright Data Scraper Studio 在任务层面会用新的 peer 会话进行重试。在爬虫内部写自定义重试循环会复用同一个会话,而这正是第一次失败的根源。报告错误,把重试交给平台。

是否应该在解析器表达式外面包 try/catch?

不应该。改用可选链(?.)和空值合并(??)。属性访问外面包一层静默的 try/catch 会掩盖真实的 bug;包在 wait() 外的 try/catch 则会浪费浏览器时间。

解析器代码中如何从一组元素提取值?

使用 toArray().map() 而不是 each()。前者更短、返回真正的数组,并且作为单一表达式可读性更好。

解析器代码中如何规范化文本?

调用 $(selector).text_sane()。Bright Data Scraper Studio 在 Cheerio 原型上扩展了这个方法:它会把每一段连续空白折叠为单个空格并对结果进行 trim。对于数字提取,使用正则去掉非数字。

相关内容

Scraper Studio 函数参考

Bright Data Scraper Studio 交互命令与解析器命令的完整参考

Worker 类型

为您的爬虫在 Browser worker 与 Code worker 之间做选择