crewAI 网页抓取工具 ScrapeWebsiteTool:从文本提取到 SSRF 安全实现的完整指南
crewAI 网页抓取工具 ScrapeWebsiteTool从文本提取到 SSRF 安全实现的完整指南【免费下载链接】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导读ScrapeWebsiteTool是 crewAI 生态中负责抓取并读取指定网站内容的官方工具它通过 HTTP 请求获取网页再用 BeautifulSoup 解析 HTML 并提取纯文本最终把结构规整、可直接喂给大模型的正文返回给 Agent。本文围绕其关联文档与仓库源码scrape_website_tool.py展开讲解安装方式、两种实例化模式、参数细节、在 Agent 中的接入方式并深入其底层的 SSRF 安全请求机制与文本清洗流程帮助你既能立刻上手使用也能理解它为什么可以安全地放进自主 Agent 的工作流中。一、工具概述与适用场景按照官方工具文档与关联 README 的定义ScrapeWebsiteTool 是一把「专读网页内容的工具」它能够对不同类型的网页发起 HTTP 请求并解析返回的 HTML从页面中抽取正文文本供下游任务如问答、总结、信息提取使用被直接当作文本预处理步骤使用也可以作为 Agent 的tools之一在任务执行期间动态调用。典型的应用场景包括网页抓取任务、数据收集以及从站点中提取特定信息。在 crewAI 的 Agent 编排里它的典型角色是检索型工具让 Agent 在推理过程中访问某个 URL 的真实页面内容再基于抓取结果产出答案。从源码结构看ScrapeWebsiteTool继承自BaseTool来自crewai.tools并依赖beautifulsoup4与requests完成抓取scrape_website_tool.py。二、安装与环境要求在 crewAI 项目中启用该工具只需安装带 tools 扩展的 crewai 包pip install crewai[tools]对应底层依赖包为crewai-tools从 pyproject.toml 可以看到其硬性要求与默认依赖运行环境python 3.10, 3.14默认依赖beautifulsoup4~4.13.4、requests2.33.0,3即标准安装后即可直接使用 ScrapeWebsiteTool无需额外动作。需要注意一个异常分支源码在__init__中会检查BeautifulSoup是否可导入若缺失会抛出带有如下提示的ImportErrorscrape_website_tool.pybeautifulsoup4 is not installed. Please install it with pip install crewai-tools[beautifulsoup4]也就是说如果你在极简环境里手动安装了不带 bs4 的crewai-tools可以按提示执行pip install crewai-tools[beautifulsoup4]补齐。三、快速上手两种实例化模式工具的核心是ScrapeWebsiteTool类从顶层包直接导入即可from crewai_tools import ScrapeWebsiteTool工具通过 tools/init.py 统一导出并注册在__all__中因此from crewai_tools import ScrapeWebsiteTool是官方推荐的导入方式。3.1 动态模式抓取任意网站不传入 URL 时工具保持「开放式」状态——website_url字段为空由 Agent 在每次执行时通过参数传入目标地址从而可以抓取任务执行过程中遇到的任何网站# 允许 Agent 在执行过程中抓取它遇到的任意网站 tool ScrapeWebsiteTool()3.2 固定模式锁定单一网站传入website_url后工具被「固定」到该站点Agent 只能抓取指定网站的内容适合目标明确、不希望 Agent 随意访问外部的场景# 初始化并绑定目标网站Agent 只能抓取指定站点的内容 tool ScrapeWebsiteTool(website_urlhttps://www.example.com) # 直接提取站点文本 text tool.run() print(text)固定模式有一个值得注意的内部行为源码 L59-L65当传入website_url时工具会保存该 URL将自身描述改写为A tool that can be used to read {website_url}s content.让 LLM 清楚它被限定在哪个站点把参数 Schema 切换为不含任何必填字段的FixedScrapeWebsiteToolSchema因为 URL 已在构造时确定运行时不再需要模型补充输入。动态模式则使用完整的ScrapeWebsiteToolSchema其中website_url被标记为必填Field(..., ...)供 Agent 在运行时填入scrape_website_tool.py。工具对外暴露的名字是Read website content。四、参数与行为细节4.1 构造参数参数类型默认值说明website_urlstr \| NoneNone要抓取的目标 URL。传入后工具被固定到该站点并改写自身描述不传则由 Agent 运行时提供cookiesdict[str, str] \| NoneNone需要携带的 Cookie用于访问需要登录态/会话的页面headersdict[str, str]一组浏览器风格的请求头见下方「默认请求头」从init源码 可以看到默认请求头相当完整地模拟了真实 Chrome 浏览器L36-L45headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9, image/avif,image/webp,image/apng,*/*;q0.8, application/signed-exchange;vb3;q0.9, Accept-Language: en-US,en;q0.9, Referer: https://www.google.com/, Connection: keep-alive, Upgrade-Insecure-Requests: 1, }4.2 Cookie 的安全传递方式cookies参数采用「键为 Cookie 名、值为环境变量名」的约定构造时工具会把第二个字段当作环境变量名通过os.getenv取值若不存在则为空字符串从而避免把真实凭证硬编码进代码或提示词# 假设环境变量 MY_SESSION 中保存了会话值 tool ScrapeWebsiteTool( website_urlhttps://app.example.com, cookies{name: session, value: MY_SESSION}, )源码对应逻辑为self.cookies {cookies[name]: os.getenv(cookies[value]) or }scrape_website_tool.py。使用前请确认 Cookie 字段名与站点实际所需一致。4.3 运行时行为每次抓取的核心流程位于_run方法L69-L90解析目标 URL优先取运行时传入的website_url其次回退到构造时固定的 URL两者皆无则抛出ValueError(Website URL must be provided.)发起请求调用safe_get并设置timeout15秒、携带默认 headers 与可选 cookies识别编码以response.apparent_encoding覆盖response.encoding提高对非 UTF-8 页面如 GBK 中文站的兼容性HTML 解析用BeautifulSoup(page.text, html.parser)解析文本抽取与规整parsed.get_text( )提取全部可见文本随后用正则把连续空格/制表符合并、清理行首行尾空白得到紧凑的纯文本并统一加前缀The following text is scraped website content:后返回。也就是说该工具只抓取服务端渲染后即可见的内容并返回纯文本不会执行 JavaScript也不保留链接、图片、表格等结构信息。五、底层实现纵深SSRF 安全请求链ScrapeWebsiteTool 并非直接调用裸requests.get而是统一经过crewai_tools.security.safe_requests模块中的safe_getsafe_requests.py。官方工具文档对此的表述是请求会通过 CrewAI 的 SSRF 安全 HTTP 助手发出——每个目标 URL 及每一次重定向跳转都会被校验拒绝指向私网与保留地址段含云元数据地址的请求TCP 连接也会被钉扎到已通过校验的 IP 上。结合源码其安全设计可以拆解为以下五点URL 与重定向逐跳校验safe_get首先对 URL 调用validate_url之后手动处理 301/302/303/307/308 重定向默认max_redirects10超出即抛错每一跳都重新执行 URL 校验从根本上防止「初始合法、重定向到内网」的绕过手法TCP 钉扎到校验过的 IP通过自定义的SSRFProtectedAdapter完成连接避免 DNS 重绑定攻击safe_requests.py默认关闭自动重定向与代理会话把allow_redirects默认设为False并要求忽略环境代理trust_env False、proxies {}防止经由本机代理产生不可控的出网路径跨源凭证剥离当重定向跨域时会自动删除authorization、cookie、x-api-key等敏感请求头避免把内网凭据泄露给第三方站点safe_requests.py显式超时ScrapeWebsiteTool 传入timeout15请求不会无限挂起。对于把工具交给自主 Agent 使用的场景这一层防护意义重大它把「模型可能被诱导去请求http://169.254.169.254云元数据或内网地址」这类 SSRF 风险在 HTTP 层直接拦截是Agent 抓取工具与普通爬虫脚本在工程上最本质的区别之一。六、在 Agent / Crew 工作流中使用_run实现了 BaseTool 的可调用协议因此该工具既可以像普通函数一样tool.run(url)使用更适合作为tools注入 Agent让模型在任务执行中自主决定何时去读取页面。一个典型的组合用法如下from crewai import Agent, Task, Crew, Process from crewai_tools import ScrapeWebsiteTool # 固定抓取公司官网供 Agent 提取产品信息 tool ScrapeWebsiteTool(website_urlhttps://www.example.com) agent Agent( role市场调研分析师, goal从指定官网中提取产品发布信息并输出结构化摘要, backstory你擅长浏览网页并提炼关键事实。, tools[tool], verboseTrue, ) task Task( description阅读 example.com 首页总结该公司最新发布的产品及其特性。, expected_output一段包含产品名、发布时间与核心卖点的中文摘要。, agentagent, ) crew Crew(agents[agent], tasks[task], processProcess.sequential) result crew.kickoff()接入 Agent 时工具面向 LLM 的对外身份由nameRead website content与description决定。若需要让 Agent 自主抓取多个站点建议使用动态模式不传website_url并在任务描述中说明「访问网页请调用 Read website content 工具」若只允许读取单一来源则固定 URL 可以显著缩小模型的行动空间。七、使用边界与注意事项不渲染 JavaScript工具只解析 HTML 静态内容。对依赖 JS 动态渲染的单页应用SPA抓取结果可能为空或残缺此时可考虑仓库中基于浏览器/渲染服务的其他网页工具见下文对比。以纯文本为目标返回的是规整文本而非 DOM/HTML标题层级、表格结构、超链接关系等结构性信息会丢失适合内容理解而非结构化抓取。依赖正确编码探测工具依赖apparent_encoding猜测字符集极少数声明错误的页面可能出现乱码。需要 BS4 环境缺少beautifulsoup4时工具在构造阶段即抛错请按提示安装。超时与站点反爬单次请求超时固定为 15 秒且不执行 JS对响应很慢或强反爬的站点成功率有限。八、与同仓库其他网页抓取工具的取舍在 crewAI 工具集中「读网页」不止一种实现。除本工具的源码与文档外仓库还提供若干面向不同抓取需求的同类工具可依据场景选择工具源码位置特点据其 READMEFirecrawlScrapeWebsiteToolfirecrawl_scrape_website_tool对接 Firecrawl 服务支持 JS 渲染、整站抓取等高级能力需 API KeyJinaScrapeWebsiteTooljina_scrape_website_tool基于 Jina Reader以更省流量的方式获取网页正文ScrapflyScrapeToolscrapfly_scrape_website_tool通过 Scrapfly 云服务执行抓取SerperScrapeWebsiteToolserper_scrape_website_tool基于 Google 搜索结果的网页内容读取相比之下ScrapeWebsiteTool不依赖任何第三方服务或 API Key开箱即用、零成本、自带 SSRF 安全层是自托管场景下最轻量的默认选择只有当需要渲染 JS、绕过强反爬或规模化抓取时才值得引入上述带服务商依赖的工具。总结ScrapeWebsiteTool在 crewAI 中承担着「把网页变成 Agent 可读文本」的基础职能安装crewai[tools]即可使用支持「固定单站」与「动态多站」两种模式返回经过空白规整的纯文本。其工程价值不止于抓取本身——底层统一的safe_getSSRF 防护让它可以放心地暴露给自主行动的 Agent而 15 秒超时、浏览器风格请求头、字符编码自动识别等细节也让它成为你组合数据采集类 Crew 时可靠的第一块拼图。相关源码与文档索引工具实现scrape_website_tool.py工具 READMEREADME.md安全请求层safe_requests.py导出注册tools/init.py官方文档页scrapewebsitetool.mdx、网页抓取工具总览依赖声明crewai-tools/pyproject.toml【免费下载链接】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),仅供参考