CrewAI BrightData 工具深度指南:Dataset 结构化数据提取、SERP 搜索与 Web Unlocker 抓取实战
本文基于 CrewAI 官方工具包中的 BrightData 工具文档及其源码实现,完整讲解 BrightDataDatasetTool、BrightDataSearchTool、BrightDataWebUnlockerTool 三个工具的用途边界、环境配置、调用参数与底层请求流程。读完后,你可以在 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.py 与 brightdata_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" |
响应格式,仅支持 json、ndjson、jsonl、csv |
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 搜索结果数据 | keyword、pages_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 商品数据 | — |
| dataset_type | 说明 | 额外输入 |
|---|---|---|
linkedin_person_profile |
个人主页数据 | — |
linkedin_company_profile |
公司主页数据 | — |
linkedin_job_listings |
职位列表数据 | — |
linkedin_posts |
帖子数据 | — |
linkedin_people_search |
人物搜索数据 | first_name、last_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_name 与 last_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_async(brightdata_dataset.py)实现了一个典型的异步三步流程:
- 触发任务:向
{API_URL}/datasets/v3/trigger发送 POST,query 参数携带dataset_id与include_errors=true,请求体为[{url, ...}]列表(zipcode、additional_params会被合并进该字典);服务端返回snapshot_id; - 轮询进度:按
polling_interval(默认 1 秒)循环 GET{API_URL}/datasets/v3/progress/{snapshot_id},直到status == "ready"则取结果;status == "error"抛出BrightDataDatasetToolException;超过timeout(默认 600 秒)抛出TimeoutError; - 取回结果: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" |
支持 google、bing、yandex |
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):
- 搜索引擎基础 URL:
get_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}; - 参数追加规则:
country→gl={country}language→hl={language}results_count→num={results_count}parse_results=True→brd_json=1(由 Bright Data 负责解析并返回 JSON)search_type→ 一般为tbm={search_type},唯独jobs映射为ibp=htl;jobsdevice_type→mobile追加brd_mobile=1,ios/android分别追加brd_mobile=ios/brd_mobile=android,desktop不追加任何参数
最终请求体为 {"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" |
数据格式,仅支持 html 与 markdown |
两点源码细节值得关注:
- SSRF 防护:
_run在发出请求前会调用validate_url(url)(来自 crewai_tools/security/safe_path.py),拒绝危险目标 URL,这是抓取类工具内置的安全底线; - payload 组装:仅当
data_format == "markdown"时,payload 才会附加"data_format": "markdown"字段,其余情况只传url、zone、format三个字段。请求同样是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,声明了 name、description 与 args_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 数据采集链路的直接可用组件。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00