
CrewAI FirecrawlCrawlWebsiteTool让 Agent 爬取整个站点并转换为干净 Markdown 的完整指南【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI本文基于 CrewAI 仓库中FirecrawlCrawlWebsiteTool的官方工具文档与源码实现完整讲解该工具的定位、安装方式、配置参数、初始化流程与_run执行链路。读完之后你可以直接将该工具接入自己的 CrewAI Agent让它通过一个 URL 爬取整个网站并得到可用于上下文检索的 Markdown/结构化数据同时理解其底层的 URL 安全校验机制与测试验证方式。工具定位面向整站爬取的 Firecrawl 封装工具文档对该工具的定义是Firecrawl is a platform for crawling and convert any website into clean markdown or structured data.即 Firecrawl 是一个将任意网站爬取并转换为干净 Markdown 或结构化数据的平台而FirecrawlCrawlWebsiteTool则是 CrewAI 官方工具集crewai-tools中将该能力封装为 Agent 工具的实现。与只抓取单页的 Scrape 类工具不同该工具面向的是整站爬取crawl你只提供一个起始 URLFirecrawl 会按照深度和数量限制把站点内的多个页面一并抓取并统一输出为 Markdown供 Agent 做知识库构建、站点调研或内容摘要等任务。核心实现位于 firecrawl_crawl_website_tool.py类结构非常简洁class FirecrawlCrawlWebsiteTool(BaseTool): name: str Firecrawl web crawl tool description: str Crawl webpages using Firecrawl and return the contents args_schema: type[BaseModel] FirecrawlCrawlWebsiteToolSchema api_key: str | None None config: dict[str, Any] | None ... # 默认爬取参数见下文需要注意一个版本口径工具 README 声明 This implementation is compatible with FireCrawl API v1而源码 docstring 中描述的配置项max_discovery_depth、allow_subdomains、delay等标注为 Firecrawl v2 API。从源码结构看当前仓库实现已按 v2 参数体系组织默认配置实际行为以源码default_factory中的默认值为准详见后文配置参数全解一节。安装与前置准备按照 README 的说明准备工作分两步获取 API Key从 Firecrawl 官方平台申请 API key并设置为环境变量FIRECRAWL_API_KEY安装依赖同时安装 Firecrawl Python SDK 与crewai[tools]包pip install firecrawl-py crewai[tools]这两条要求与源码声明完全对应。源码中通过 Pydantic 字段显式声明了运行时依赖与环境变量package_dependencies: list[str] Field(default_factorylambda: [firecrawl-py]) env_vars: list[EnvVar] Field( default_factorylambda: [ EnvVar( nameFIRECRAWL_API_KEY, descriptionAPI key for Firecrawl services, requiredTrue, ), ] )也就是说FIRECRAWL_API_KEY在工具元数据层面被标记为requiredCrewAI 框架在 Agent 装配工具时即可据此做依赖检查。此外README 中的 Arguments 部分还说明了api_key构造参数api_key可选。指定 Firecrawl API key缺省时读取FIRECRAWL_API_KEY环境变量。config可选。包含 Firecrawl API 的爬取参数详见后文。还有一个源码级别的细节值得了解如果你忘记安装firecrawl-py工具在初始化时不会静默失败而是会交互式提示自动安装def _initialize_firecrawl(self) - None: try: from firecrawl import FirecrawlApp self._firecrawl FirecrawlApp(api_keyself.api_key) except ImportError: import click if click.confirm( You are missing the firecrawl-py package. Would you like to install it? ): import subprocess subprocess.run([uv, add, firecrawl-py], checkTrue) from firecrawl import FirecrawlApp self._firecrawl FirecrawlApp(api_keyself.api_key) else: raise ImportError( firecrawl-py package not found, please run uv add firecrawl-py ) from None见 firecrawl_crawl_website_tool.py#L82-L105当用户确认后它会直接执行uv add firecrawl-py完成补装拒绝则抛出带安装命令提示的ImportError。快速上手README 给出的标准用法示例如下保留原文from crewai_tools import FirecrawlCrawlWebsiteTool from firecrawl import ScrapeOptions tool FirecrawlCrawlWebsiteTool( config{ limit: 100, scrape_options: ScrapeOptions(formats[markdown, html]), poll_interval: 30, } ) tool.run(urlfirecrawl.dev)用法要点工具通过crewai_tools顶层包导出from crewai_tools import FirecrawlCrawlWebsiteTool即可导入导出注册见 tools/init.pytool.run(url...)的入参由 Pydantic 模式FirecrawlCrawlWebsiteToolSchema约束只有一个必填参数url描述为 Website URL这也是该工具交给 LLM 决策的唯一参数class FirecrawlCrawlWebsiteToolSchema(BaseModel): url: str Field(descriptionWebsite URL)config中允许传字典也允许传 Firecrawl SDK 的ScrapeOptions对象因为它们最终都会被展开进FirecrawlApp.crawl(...)的调用参数机制见后文_run解析一节。需要特别提醒的一处文档与实现差异README 示例将poll_interval放进了config但当前源码中轮询间隔是在调用处硬编码的return self._firecrawl.crawl(urlurl, poll_interval2, **self.config)见 firecrawl_crawl_website_tool.py#L107-L112从源码看若你在config中再传一次poll_interval展开后会与关键字参数重复而引发冲突。因此按当前仓库实现不要在config里手动指定poll_interval轮询间隔固定为 2 秒。配置参数全解config参数的默认值由源码default_factory定义firecrawl_crawl_website_tool.py#L50-L64这是当前实现的事实基准参数类型默认值含义max_discovery_depthint2页面发现的最大深度ignore_sitemapboolTrue是否忽略站点 sitemapTrue表示不依赖 sitemap 发现页面limitint10最多爬取的页面数allow_external_linksboolFalse是否允许爬取指向站外链接的页面allow_subdomainsboolFalse是否允许爬取子域名delayint | NoneNone请求间隔毫秒scrape_optionsdict见下页面内容抓取选项其中scrape_options的默认值为scrape_options: { formats: [markdown], # 返回的内容格式 only_main_content: True, # 只返回正文排除 header/nav/footer timeout: 10000, # 抓取超时毫秒 }对照 README 中给出的 default configuration保留了原文档口径便于与历史版本对照from firecrawl import ScrapeOptions { max_depth: 2, ignore_sitemap: True, limit: 100, allow_backward_links: False, allow_external_links: False, scrape_options: ScrapeOptions( formats[markdown, screenshot, links], only_main_contentTrue, timeout30000, ), }两者存在明显差异README 使用max_depth/allow_backward_links且limit为 100、超时 30 秒而源码使用max_discovery_depth/allow_subdomains并新增了delaylimit收紧为 10、超时 10 秒。可以推断 README 的默认配置段落对应较早的 API 版本而当前源码已按新参数体系重写。实际使用时请以源码default_factory为基准如果你只想改个别项例如把爬取上限放宽到 100 页在config中只传覆盖项即可其余项回落到上述源码默认值。参数取舍上的实战建议对应上表语义控制成本与耗时limit与max_discovery_depth是最直接的开关小站调研用默认值即可全站入库再调大聚焦站点边界allow_external_links、allow_subdomains默认False保证爬取范围不越出目标域名内容形态scrape_options.formats决定输出形态Agent 上下文场景通常只保留[markdown]最省 token需要截图或链接结构时再追加screenshot、links等格式。初始化流程从 api_key 到 FirecrawlApp工具实例化的完整调用链如下见 firecrawl_crawl_website_tool.py#L77-L86__init__(api_keyNone, **kwargs)先调用BaseTool.__init__完成通用工具字段name/description/schema 等的初始化记录self.api_key——若传入None则最终由FirecrawlApp从FIRECRAWL_API_KEY环境变量读取_initialize_firecrawl()创建FirecrawlApp(api_keyself.api_key)实例并缓存到私有属性self._firecrawlPrivateAttr不参与 Pydantic 序列化。文件末尾还有一段防御性逻辑在firecrawl-py可用时主动执行FirecrawlCrawlWebsiteTool.model_rebuild()并打上_model_rebuilt标记防止重复构建用于让 Pydantic 模型正确解析对第三方类的引用SDK 未安装时直接跳过不影响模块导入。这个设计解释了为什么该工具文件顶部对firecrawl的 import 采用try/except ImportError包裹——未安装 SDK 时模块仍可被正常导入和发现只在真正实例化时才触发依赖检查。_run深度解析URL 安全校验与爬取调用_run方法只有三步firecrawl_crawl_website_tool.py#L107-L112def _run(self, url: str) - Any: if not self._firecrawl: raise RuntimeError(FirecrawlApp not properly initialized) url validate_url(url) return self._firecrawl.crawl(urlurl, poll_interval2, **self.config)其中最值得关注的是validate_url。它来自 crewai-tools 统一的路径/URL 安全模块 safe_path.py其模块 docstring 明确说明目的是防止工具在运行时接受用户或 LLM 可控输入时发生未授权文件访问和 SSRF服务端请求伪造。对 URL 的校验规则safe_path.py#L198-L260协议白名单完全禁止file://只允许http/https且必须可解析出 hostnameDNS 解析 私网拦截对主机名做真实 DNS 解析任何解析结果落入私网/保留网段的 URL 直接拒绝。被拦截的 IPv4 网段包括10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8、169.254.0.0/16云元数据地址和0.0.0.0/32IPv6 侧拦截::1/128、::/128、fc00::/7ULA与fe80::/10链路本地。IPv4-mapped IPv6 地址如::ffff:127.0.0.1会先解包为 IPv4 再比对避免绕过解析失败的保守策略主机名无法解析、IP 无法解析为合法地址时一律按不安全处理block it逃生开关设置CREWAI_TOOLS_ALLOW_UNSAFE_PATHStrue可跳过校验官方注释明确不推荐在生产环境使用多租户托管场景还可设置CREWAI_TOOLS_FORCE_SAFE_PATHStrue强制保持校验、禁止租户自行关闭。这意味着由于爬取 URL 往往由 LLM 在运行期生成CrewAI 在把 URL 交给 Firecrawl 之前先做了一道 SSRF 防线防止 Agent 被诱导去请求内网服务或云元数据端点。理解这一点你就能明白为什么该工具不能用于爬取内网页面以及托管部署时相关环境变量的意义。最后self._firecrawl.crawl(urlurl, poll_interval2, **self.config)把config字典逐项展开为 Firecrawl SDKcrawl方法的 kwargspoll_interval2表示每 2 秒轮询一次爬取任务状态Firecrawl 的 crawl 是异步任务SDK 内部轮询直到完成或进入可判定状态。因此config中传普通 dict 还是 SDK 的ScrapeOptions对象都能工作——它们都是crawl()接口接受的参数形态。集成测试验证仓库为这个工具提供了基于 VCR录制回放的集成测试 firecrawl_crawl_website_tool_test.pypytest.mark.vcr() def test_firecrawl_crawl_tool_integration(): tool FirecrawlCrawlWebsiteTool(config{ limit: 2, max_discovery_depth: 1, scrape_options: {formats: [markdown]} }) result tool.run(urlhttps://firecrawl.dev) assert result is not None assert hasattr(result, status) assert result.status in [completed, scraping]该测试印证了前文的几个结论config使用max_discovery_depth这一 v2 风格参数名limit/scrape_options等覆盖项可自由组合_run的返回值是一个带status属性的结果对象状态生命周期包含scraping进行中到completed完成——如果你的集成代码需要判断爬取是否真正拿到数据应以result.status completed为准而不是仅检查对象非空。测试标记pytest.mark.vcr()表示 HTTP 交互通过录制好的 cassette 回放无需真实 API key 即可在 CI 中运行。相关文档与工具规格本工具在仓库中随附的说明文档即 firecrawl_crawl_website_tool/README.md本文的主要依据官方站点文档对应页面为 firecrawlcrawlwebsitetool.mdx包含安装与参数摘要自动生成的工具规格文件 tool.specs.json 中收录了FirecrawlCrawlWebsiteTool的完整 schemainit_params_schemaapi_key、config两个可选构造参数、run_params_schema必填url、env_varsFIRECRAWL_API_KEYrequired与package_dependenciesfirecrawl-py可作为该工具机器可读的接口契约参考。小结FirecrawlCrawlWebsiteTool是 CrewAI 官方工具集中对接 Firecrawl 整站爬取能力的工具给一个 URL返回整站页面转换后的 Markdown/结构化数据README。接入只需设置FIRECRAWL_API_KEY、pip install firecrawl-py crewai[tools]然后FirecrawlCrawlWebsiteTool(config{...})tool.run(url...)漏装 SDK 时初始化流程会交互式提示uv add firecrawl-py。当前源码默认配置为max_discovery_depth2、limit10、scrape_options{formats: [markdown], only_main_content: True, timeout: 10000}allow_external_links/allow_subdomains默认关闭README 中的旧版默认配置limit100等仅作历史口径对照。执行链路_run 初始化检查 validate_urlSSRF 防御仅 http/https解析 DNS 并拦截私网/保留 IPFirecrawlApp.crawl(url, poll_interval2, **config)当前实现中poll_interval固定为 2 秒不应再放入config。集成测试VCR 回放确认返回对象带status字段取值包括scraping与completed。【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考