首页
/ CrewAI BrightData 工具深度指南:Dataset 结构化数据提取、SERP 搜索与 Web Unlocker 抓取实战

CrewAI BrightData 工具深度指南:Dataset 结构化数据提取、SERP 搜索与 Web Unlocker 抓取实战

2026-09-05 14:20:35作者:裴锟轩Denise

本文基于 CrewAI 官方工具包中的 BrightData 工具文档及其源码实现,完整讲解 BrightDataDatasetToolBrightDataSearchToolBrightDataWebUnlockerTool 三个工具的用途边界、环境配置、调用参数与底层请求流程。读完后,你可以在 Agent 中接入 Bright Data 的 Dataset API、SERP API 与 Web Unlocker API,实现从结构化数据提取到反爬绕过的完整数据采集能力,并理解每个工具在源码层面的参数校验、轮询机制与安全约束。

工具概览:三种能力覆盖数据采集全场景

CrewAI 的 BrightData 工具套件(源码位于 lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/)针对三类不同需求提供了三个独立工具:

  • BrightDataDatasetTool:通过 Bright Data 的预置数据集(Amazon、LinkedIn、Instagram、TikTok 等)从指定 URL 提取结构化数据,底层走 Dataset API 的"触发—轮询—取回快照"异步流程;
  • BrightDataSearchTool:调用 Bright Data SERP API 执行网页搜索,支持指定搜索引擎、地理定向与设备模拟,可返回结构化 JSON 或原始 HTML;
  • BrightDataWebUnlockerTool:调用 Web Unlocker API 抓取任意网页内容,借助 Bright Data 的解锁与代理基础设施绕过 CAPTCHA、地理限制与反爬虫检测。

三个类均在 init.py 中统一导出,并通过 crewai_tools 包入口 对外暴露,因此可以直接 from crewai_tools import BrightDataDatasetTool 使用。各工具的运行参数规格(run params schema)也已生成在 tool.specs.json 中,供 CrewAI 企业版等自动化场景消费。官方文档页面见 brightdata-tools.mdx

三者选型建议(继承自官方 README 的选型原则):

需求场景 推荐工具 核心特征
从 Amazon/LinkedIn 等平台拉取结构化字段 BrightDataDatasetTool 命中缓存时比实时抓取更可靠,返回 json/ndjson/jsonl/csv
跨搜索引擎做关键词检索 BrightDataSearchTool 支持 google/bing/yandex、geo-targeting、设备模拟
抓取受保护网站的正文 BrightDataWebUnlockerTool 反绕过 bot protection,可输出 markdown/html

安装与环境配置

安装命令(继承自官方 README):

pip install crewai[tools] aiohttp requests

其中 aiohttp 是 Dataset 工具异步轮询所依赖的库,requests 用于 SERP 与 Web Unlocker 工具的同步 HTTP 请求——这与源码中的 import 完全对应。

环境变量配置是三个工具的共同前置条件:

export BRIGHT_DATA_API_KEY="your_api_key_here"
export BRIGHT_DATA_ZONE="your_zone_here"

从源码结构看,两个环境变量的作用范围并不相同:

  • BRIGHT_DATA_API_KEY:三个工具全部需要。Dataset 工具在每次 _run 时通过 os.getenv 读取并以 Authorization: Bearer <key> 携带(见 brightdata_dataset.py);而 SERP 与 Web Unlocker 工具在构造函数中读取,缺失时立即抛出 ValueError(见 brightdata_serp.pybrightdata_unlocker.py)。
  • BRIGHT_DATA_ZONE:仅 SERP 与 Web Unlocker 两个"Request API"类工具需要,作为 zone 字段写入请求体;Dataset 工具走 Dataset API,不依赖 zone。

除 API Key 外,Dataset 工具还支持三个可覆盖的配置项,由 BrightDataConfig.from_env 在模块导入时解析:

环境变量 默认值 作用
BRIGHTDATA_API_URL https://api.brightdata.com Dataset API 根地址
BRIGHTDATA_DEFAULT_TIMEOUT 600(秒) 轮询等待任务完成的总超时
BRIGHTDATA_DEFAULT_POLLING_INTERVAL 1(秒) 两次轮询之间的间隔

SERP 与 Web Unlocker 工具同样读取 BRIGHTDATA_API_URL,但默认指向 https://api.brightdata.com/request(Request API 端点),与 Dataset 工具的根地址默认值不同。

BrightDataDatasetTool:预置数据集的结构化数据提取

基本用法

继承自官方 README 的示例:

from crewai_tools import BrightDataDatasetTool

# Initialize with specific dataset and URL
tool = BrightDataDatasetTool(
    dataset_type="amazon_product",
    url="https://www.amazon.com/dp/B08QB1QMJ5/"
)
result = tool.run()

参数说明

BrightDataDatasetTool 的完整参数由 BrightDataDatasetToolSchema 定义:

参数 类型 默认值 说明
dataset_type str 必填 数据集标识,必须匹配内置 datasets 列表中的 id
url str 必填 数据来源 URL(如含 /dp/ 的商品页)
format str "json" 响应格式,仅支持 jsonndjsonjsonlcsv
zipcode str None 可选邮编,用于地理收窄(如本地化商品数据)
additional_params dict None 透传给 Bright Data API 的额外参数,用于满足特定数据集的额外输入

两个必填参数都支持"构造时或调用时"二选一提供,_run 中会先做非空校验,format 不在 {json, ndjson, jsonl, csv} 集合内会直接抛出 ValueError(见 brightdata_dataset.py)。

内置数据集清单

源码中内置了 29 个预置数据集(brightdata_dataset.py),每个数据集映射到一个 Bright Data dataset_id。按平台归类如下:

电商平台

dataset_type 说明 额外输入
amazon_product Amazon 商品数据,URL 需含 /dp/
amazon_product_reviews Amazon 商品评论数据,URL 需含 /dp/
amazon_product_search Amazon 搜索结果数据 keywordpages_to_search(默认 1
walmart_product Walmart 商品数据,URL 需含 /ip/
walmart_seller Walmart 卖家数据
ebay_product eBay 商品数据
homedepot_products Home Depot 商品数据
zara_products Zara 商品数据
etsy_products Etsy 商品数据
bestbuy_products Best Buy 商品数据

LinkedIn

dataset_type 说明 额外输入
linkedin_person_profile 个人主页数据
linkedin_company_profile 公司主页数据
linkedin_job_listings 职位列表数据
linkedin_posts 帖子数据
linkedin_people_search 人物搜索数据 first_namelast_name

社交与内容平台

dataset_type 说明
instagram_profiles / instagram_posts / instagram_reels / instagram_comments Instagram 主页、帖子、Reel、评论
facebook_posts / facebook_marketplace_listings / facebook_events Facebook 帖子、Marketplace 商品、活动
facebook_company_reviews Facebook 公司评价(需 num_of_reviews
tiktok_profiles / tiktok_posts / tiktok_shop TikTok 主页、帖子、小店商品

企业信息

dataset_type 说明
crunchbase_company Crunchbase 公司数据
zoominfo_company_profile ZoomInfo 公司主页数据

需要注意 additional_params 的典型用法:以 linkedin_people_search 为例,first_namelast_name 需要经 additional_params 传入:

tool = BrightDataDatasetTool(
    dataset_type="linkedin_people_search",
    url="https://www.linkedin.com/in/someone/",
    additional_params={"first_name": "Ada", "last_name": "Lovelace"},
)

底层流程:触发 → 轮询 → 取回

get_dataset_data_asyncbrightdata_dataset.py)实现了一个典型的异步三步流程:

  1. 触发任务:向 {API_URL}/datasets/v3/trigger 发送 POST,query 参数携带 dataset_idinclude_errors=true,请求体为 [{url, ...}] 列表(zipcodeadditional_params 会被合并进该字典);服务端返回 snapshot_id
  2. 轮询进度:按 polling_interval(默认 1 秒)循环 GET {API_URL}/datasets/v3/progress/{snapshot_id},直到 status == "ready" 则取结果;status == "error" 抛出 BrightDataDatasetToolException;超过 timeout(默认 600 秒)抛出 TimeoutError
  3. 取回结果:GET {API_URL}/datasets/v3/snapshot/{snapshot_id} 并带 format 参数,返回快照文本。

异常处理上,_run 不会向上抛出超时或 API 异常,而是将其转换为可被 Agent 阅读的字符串(如 Timeout Exception occured in method : get_dataset_data_async...),这对 LLM 调用方更友好——Agent 拿到的是错误描述而非进程崩溃。

BrightDataSearchTool:带地理定向与设备模拟的 SERP 搜索

基本用法

继承自官方 README 的示例:

from crewai_tools import BrightDataSearchTool

# Initialize with search query
tool = BrightDataSearchTool(
    query="latest AI trends 2025",
    search_engine="google",
    country="us"
)
result = tool.run()

参数说明

参数由 BrightDataSearchToolSchema 定义:

参数 默认值 说明
query 必填 搜索词,内部会经 urllib.parse.quote 做 URL 编码
search_engine "google" 支持 googlebingyandex
country "us" 两位国家码,映射为 Google/Bing 的 gl 参数
language "en" 语言码,映射为 hl 参数
search_type None 搜索类型,如 isch(图片)、nws(新闻);jobs 有特殊映射
device_type "desktop" 设备模拟:desktop/mobile/ios/android
parse_results True True 时返回 Bright Data 解析后的结构化 JSON,False 时返回原始页面

此外 _run 还接受一个未在 schema 中声明的关键字参数 results_count(默认 "10"),映射为 URL 的 num 参数。

参数到搜索引擎 URL 的映射逻辑

_run 的核心是把逻辑参数翻译成 Bright Data SERP API 背后的真实搜索引擎查询串(brightdata_serp.py):

  • 搜索引擎基础 URLget_search_url 按引擎拼接,如 Google 为 https://www.google.com/search?q=${query},Bing 为 https://www.bing.com/search?q=${query},Yandex 为 https://yandex.com/search/?text=${query}
  • 参数追加规则
    • countrygl={country}
    • languagehl={language}
    • results_countnum={results_count}
    • parse_results=Truebrd_json=1(由 Bright Data 负责解析并返回 JSON)
    • search_type → 一般为 tbm={search_type},唯独 jobs 映射为 ibp=htl;jobs
    • device_typemobile 追加 brd_mobile=1ios/android 分别追加 brd_mobile=ios / brd_mobile=androiddesktop 不追加任何参数

最终请求体为 {"zone": <BRIGHT_DATA_ZONE>, "url": <拼装后的完整 URL>, "format": "raw"},通过 requests.post 提交到 {BRIGHTDATA_API_URL}(默认 https://api.brightdata.com/request),请求头携带 Authorization: Bearer {API_KEY},超时 30 秒。失败时返回以 Error 开头的错误字符串而非抛异常。

单元测试 brightdata_serp_tool_test.py 验证了两条路径:mock requests.post_run 正常返回响应文本;构造异常时结果包含 Error 字样,与上述容错行为一致。

BrightDataWebUnlockerTool:反爬网页抓取

基本用法

继承自官方 README 的示例:

from crewai_tools import BrightDataWebUnlockerTool

# Initialize with target URL
tool = BrightDataWebUnlockerTool(
    url="https://example.com",
    data_format="markdown"
)
result = tool.run()

参数与安全校验

参数由 BrightDataUnlockerToolSchema 定义:

参数 默认值 说明
url 必填 目标抓取 URL
format "raw" 响应格式(raw 为标准)
data_format "markdown" 数据格式,仅支持 htmlmarkdown

两点源码细节值得关注:

  1. SSRF 防护_run 在发出请求前会调用 validate_url(url)(来自 crewai_tools/security/safe_path.py),拒绝危险目标 URL,这是抓取类工具内置的安全底线;
  2. payload 组装:仅当 data_format == "markdown" 时,payload 才会附加 "data_format": "markdown" 字段,其余情况只传 urlzoneformat 三个字段。请求同样是 requests.post 到 Request API 端点,超时 30 秒。

测试文件 brightdata_webunlocker_tool_test.py 覆盖了成功抓取(html/json 两种 format)与 HTTP 403 错误路径:403 时返回结果中包含 HTTP Error 与响应体 Forbidden,便于 Agent 感知上游拒绝原因。

在 CrewAI Agent 中的集成方式

三个工具均继承自 crewai.tools.BaseTool,声明了 namedescriptionargs_schema,因此可以直接挂给 Agent 的 tools 列表,由 LLM 依据工具描述自主决定调用时机与参数:

from crewai import Agent
from crewai_tools import BrightDataDatasetTool, BrightDataSearchTool

search = BrightDataSearchTool(search_engine="google", country="us")
dataset = BrightDataDatasetTool(dataset_type="amazon_product_reviews")

agent = Agent(
    role="Market Research Analyst",
    goal="Collect structured market data and competitor reviews",
    tools=[search, dataset],
    verbose=True,
)

这种"构造时给默认值、运行时由 LLM 覆盖"的模式是三个工具的一致设计:所有参数都允许在 __init___run(即 tool.run(...))两级提供,_run 中的 x = x or self.x 逻辑保证了调用时参数优先。

使用建议与限制

  • 计费与账户前提:所有工具都依赖 Bright Data 账号,BRIGHT_DATA_API_KEY 为必填;SERP 与 Web Unlocker 还要求 BRIGHT_DATA_ZONE 指向已在控制台创建的对应 zone(Dataset/Request API 的 zone 类型不同,请确保 zone 与工具匹配)。
  • 超时预算:Dataset 工具默认轮询上限 600 秒,适合在 Agent 任务中预留充足执行时间;SERP 与 Unlocker 的 HTTP 超时固定为 30 秒。
  • 结果形态:三个工具均返回字符串——Dataset 工具返回所选格式(json/ndjson/jsonl/csv)的原始文本,SERP 工具在 parse_results=True 时返回 JSON 文本,Unlocker 返回 markdown/html 文本;下游若需结构化对象需自行反序列化。
  • 容错风格:工具内部将网络/HTTP 异常统一转换为带 Error 前缀的描述字符串返回,编写 Agent 提示词时可引导 LLM 识别此类失败并降级(如换用其他搜索工具重试)。

综合来看,CrewAI 的 BrightData 工具套件把"结构化数据提取、搜索引擎检索、反爬网页抓取"三种采集能力封装成了符合 CrewAI 工具契约的 BaseTool,参数 schema 对 LLM 友好、异步轮询与安全校验在源码层面齐备,是 Agent 数据采集链路的直接可用组件。

登录后查看全文
热门项目推荐
相关项目推荐