CrewAI + Scrapeless: 为您的代理团队提供实时网络数据
Lead Scraping Automation Engineer
CrewAI团队的效用仅取决于其代理能够访问的工具。给一个研究代理仅提供一个语言模型,它将自信地描述一个它从未打开过的页面。
将该团队连接到Scrapeless MCP服务器修复了输入端:代理获得浏览器控制、页面抓取、Google搜索和Google趋势作为普通的CrewAI工具,而渲染、代理路由和反检测则留在服务器上。本指南将端到端运行连接,并展示工具列表、参数模式,以及真实调用返回的Markdown内容。
此设置为您的团队提供的功能
您的代理通过一次连接获得21个可调用工具。Scrapeless MCP服务器通过可流式传输的HTTP公开这些工具,而crewai-tools将每一个工具转化为任何代理都可以持有的标准CrewAI BaseTool。
这些工具分为三组:
- 页面检索 —
scrape_markdown、scrape_html和scrape_screenshot获取一个URL并以您要求的格式返回。 - 实时浏览器控制 — 十六个
browser_*工具创建一个会话,然后在其中点击、输入、滚动、导航、等待和快照。 - 搜索表面 —
google_search和google_trends。
由于工作发生在服务器端,团队流程保持简小。没有本地浏览器需要安装,没有代理池需要管理,也没有驱动版本需要与Chrome版本保持一致。
为什么选择Scrapeless MCP服务器
模型上下文协议规范定义了客户端如何发现和调用服务器上的工具,这使得一次连接比手工编写的封装更有价值:工具列表、参数模式及结果信封都来自服务器,而不是硬编码在您的项目中。调用以JSON-RPC 2.0消息的形式进行,因此请求和响应格式是一个发布的标准,而不是供应商约定。
Scrapeless发布了一个托管端点,因此无需运行服务器。传输是可流式传输的HTTP,协议的HTTP机制,认证是单个头部。CrewAI代理所需的一切是一个字典。相同的密钥也支持Scrapeless抓取浏览器,这是browser_*工具驱动的云浏览器,每个工具的参数引用存放在Scrapeless文档中。
先决条件
- Python 3.10或更高版本。
crewai和crewai-tools目前都声明为>=3.10,<3.14。 - 来自仪表板的Scrapeless API密钥。
- 您的团队运行的任何LLM的模型提供者密钥。CrewAI默认为OpenAI并读取
OPENAI_API_KEY。
注意:以下示例是在没有模型提供者密钥的情况下使用Scrapeless密钥执行的。MCP连接、工具发现、参数模式、工具调用和代理附加都实时运行。最终的
crew.kickoff()调用是一个先决条件缺口——它需要一个模型密钥,文章标记了该步骤,而不是显示虚构的输出。
安装
bash
pip install "crewai==1.15.4" "crewai-tools[mcp]==1.15.4"
[mcp]额外拉入mcp客户端库和mcpadapt,这是将MCP工具定义转换为框架本地工具的层。
如果您的环境已经携带OpenTelemetry栈,请像下面一样一起安装这两个包,而不是一个一个安装。crewai锁定opentelemetry-sdk~=1.42,部分升级的导出器集在您的代码运行之前会导致导入错误。
在您的shell中设置密钥:
bash
export SCRAPELESS_API_KEY="your_api_key_here"
通过可流式传输的HTTP连接
MCPServerAdapter接受一个描述服务器的字典。headers条目携带Scrapeless API密钥:
python
import os
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params) as tools:
names = sorted(t.name for t in tools)
print(f"tool count: {len(names)}")
for n in names:
print(" -", n)
运行它会列出服务器实际提供的内容:
text
tool count: 21
- browser_click
- browser_close
- browser_create
- browser_get_html
- browser_get_text
- browser_go_back
- browser_go_forward
- browser_goto
- browser_press_key
- browser_screenshot
- browser_scroll
- browser_scroll_to
- browser_snapshot
- browser_type
- browser_wait
- browser_wait_for
- google_search
- google_trends
- scrape_html
- scrape_markdown
- scrape_screenshot
两个值得注意的细节。名称是平的——没有服务器前缀或点分命名空间,因此 scrape_markdown 是代理将调用的字面字符串。而上下文管理器很重要:它在进入时打开会话,在退出时关闭会话,这就是为什么适配器被编写成 with 块而不是裸构造函数的原因。
只赋予代理所需的工具
将所有 21 种工具交给每个代理让模型的工作变得更困难,而不是更简单。MCPServerAdapter 在服务器字典后接受工具名称,只返回那些工具:
python
import os
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params, "scrape_markdown", "google_search") as tools:
print("过滤后的工具:", [t.name for t in tools])
for t in tools:
schema = getattr(t, "args_schema", None)
fields = list(schema.model_fields) if schema else "n/a"
print(f" {t.name} 参数: {fields}")
text
过滤后的工具: ['scrape_markdown', 'google_search']
scrape_markdown 参数: ['url']
google_search 参数: ['q', 'hl', 'gl']
参数模式来自服务器,因此它们是真正的合同:scrape_markdown 需要一个 url,而 google_search 需要一个查询及语言和国家代码。一个只需要读取页面和运行搜索的研究代理恰好获取两个工具,而没有浏览器会话表面可供滥用。
准备将其接入自己的团队了吗?创建一个免费的 Scrapeless 账户并用您的仪表板密钥进行连接。
将工具附加到团队
工具直接进入 Agent 构造函数,代理进入具有其任务的 Crew:
python
import os
from crewai import Agent, Task, Crew
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params, "scrape_markdown", "google_search") as tools:
analyst = Agent(
role="网络研究分析师",
goal="将公共页面转化为清晰的 markdown 以供后续分析。",
backstory="与公共网络来源合作,并返回结构化笔记。",
tools=tools,
verbose=False,
)
print("代理工具:", [t.name for t in analyst.tools])
task = Task(
description="获取 https://quotes.toscrape.com/js/ 并总结出现的作者。",
expected_output="在页面上找到的作者名称列表。",
agent=analyst,
)
crew = Crew(agents=[analyst], tasks=[task], verbose=False)
print("团队代理:", len(crew.agents), "| 团队任务:", len(crew.tasks))
text
代理工具: ['scrape_markdown', 'google_search']
团队代理: 1 | 团队任务: 1
代理持有服务器提供的工具,团队也组建完成。到目前为止,所有内容仅依赖于 Scrapeless 密钥。
注意:
crew.kickoff()是需要模型提供者密钥的下一步。如果没有设置OPENAI_API_KEY,CrewAI 在第一次模型调用之前会引发ValueError: OPENAI_API_KEY is required,因此运行结果被显示为您添加的行,而不是捕获到的输出。
python
result = crew.kickoff()
print(result)
工具调用返回的内容
直接调用工具是查看返回形状的最快方式,而无需消耗模型令牌。scrape_markdown 接收 URL 并返回 markdown:
python
import os
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params, "scrape_markdown") as tools:
tool = list(tools)[0]
md = tool.run(url="https://quotes.toscrape.com/js/")
text = md if isinstance(md, str) else str(md)
print("markdown 字符数:", len(text))
print("包含爱因斯坦:", "Einstein" in text)
print("前 180 个字符:", text[:180].replace("\n", " "))
text
markdown 字符数: 1580
包含爱因斯坦: True
前 180 个字符: 响应: "# [Quotes to Scrape](https://quotes.toscrape.com/)\n\n[Login](https://quotes.toscrape.com/login)\n\n“我们创造的世界是我们思维的过程。它可以
目标页面在浏览器中构建其引用列表,而不是在初始 HTML 中发送,引用仍然出现在 markdown 中——服务器在转换之前就已渲染该页面。这就是基于真实基础设施的 MCP 工具与简单 HTTP 获取之间的实际区别:代理请求一个页面,并获得用户将看到的页面。
Markdown 也是语言模型处理成本最低的格式。标题、链接和段落结构得以保留,而脚本、样式和布局标记则无法保存,因此代理可以将其上下文用于内容。
结论
将 CrewAI 连接到 Scrapeless MCP 服务器只需一个字典和一个上下文管理器。服务器提供 21 个工具及其各自的参数模式,crewai-tools 将其转换为原生 CrewAI 工具,在适配器中指定特定工具可使每个代理的表面保持足够小,以便模型能够有效使用。
值得在自己的项目中携带的部分是工具过滤器。一个由研究代理持有 scrape_markdown 和 google_search 的团队,以及一个单独的浏览代理持有 browser_* 集合,给每个模型提供了一个简短的菜单和明确的任务。
开始使用 Scrapeless 免费计划 获取密钥,在规划工作负载时查看 Scrapeless 定价,并阅读 Scrapeless MCP 服务器概述 获取完整的工具参考。
常见问题
问:CrewAI 的 Scrapeless MCP 服务器端点是什么?
托管的端点是 https://api.scrapeless.com/mcp,通过 streamable-http 传输访问,在 x-api-token 头中包含您的密钥。CrewAI 不需要本地服务器进程,因为工具在远程提供。
问:Scrapeless MCP 服务器公开了多少工具?
实时连接返回 21 个工具:十六个 browser_* 会话控制工具,三个页面检索工具(scrape_markdown、scrape_html、scrape_screenshot),以及两个搜索工具(google_search、google_trends)。请在运行时检查列表,而不是假设,因为服务器可以在发布之间添加工具。
问:我可以限制代理接收哪些 MCP 工具吗?
可以。通过服务器字典后将工具名称传递给 MCPServerAdapter —— MCPServerAdapter(server_params, "scrape_markdown", "google_search") 仅返回这两个。这使模型的工具菜单保持简短,通常会提高选择的准确性。
问:CrewAI 需要 LLM 密钥才能连接到 MCP 服务器吗?
不需要。MCP 握手、工具发现和直接工具调用仅使用 Scrapeless 密钥即可工作。在您调用 crew.kickoff() 的那一刻,需要提供模型提供者的密钥,因为这是代理询问模型使用哪个工具的时刻。
问:为什么在 MCPServerAdapter 中使用上下文管理器?
with 块在入口处打开 MCP 会话,并在出口处关闭它。如果不构造一个,上下文管理器,连接将保持打开状态,而工具仅在会话存活期间有效——在会话关闭后访问它们会引发错误。
问:scrape_markdown 是否处理在浏览器中呈现的页面?
是的。通过 JavaScript 写入其内容的页面仍然会返回该内容的 markdown,因为在转换之前,渲染发生在服务器端。同一 URL 的普通 HTTP 获取请求返回的是预渲染的标记。
问:指向实时网站之前我应该检查什么?
查看网站的条款及其 /robots.txt 指令,这些指令遵循 robots 排除协议标准。将收集限制为公共页面,并给团队一个有限的任务列表,而不是无目的的爬取指令——否则代理循环可能会发出比您预期的更多请求。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



