跳转到内容

Selenium 抓取器

SeleniumScrapingTool 专为高效网页抓取任务打造。
它允许通过 CSS 选择器精确提取网页中的内容。
其设计适用于广泛的抓取需求,并且对任意提供的网站 URL 都具有灵活性。

要使用此工具,你需要安装 CrewAI tools 包和 Selenium:

Terminal window
pip install 'crewai[tools]'
uv add selenium webdriver-manager

你还需要确保系统已安装 Chrome,因为该工具使用 Chrome WebDriver 进行浏览器自动化。

下面示例演示如何将 SeleniumScrapingTool 与 CrewAI 智能体一起使用:

from crewai import Agent, Task, Crew, Process
from crewai_tools import SeleniumScrapingTool
# 初始化工具
selenium_tool = SeleniumScrapingTool()
# 定义一个使用该工具的智能体
web_scraper_agent = Agent(
role="Web Scraper",
goal="使用 Selenium 从网站中提取信息",
backstory="擅长从动态网站提取内容的网页抓取专家。",
tools=[selenium_tool],
verbose=True,
)
# 示例任务:从网站抓取内容
scrape_task = Task(
description="提取 example.com 主页的主要内容。使用 CSS 选择器 'main' 定位主内容区域。",
expected_output="example.com 主页的主要内容。",
agent=web_scraper_agent,
)
# 创建并运行 crew
crew = Crew(
agents=[web_scraper_agent],
tasks=[scrape_task],
verbose=True,
process=Process.sequential,
)
result = crew.kickoff()

你也可以使用预定义参数初始化工具:

# 使用预定义参数初始化工具
selenium_tool = SeleniumScrapingTool(
website_url='https://example.com',
css_element='.main-content',
wait_time=5
)
# 定义一个使用该工具的智能体
web_scraper_agent = Agent(
role="Web Scraper",
goal="使用 Selenium 从网站中提取信息",
backstory="擅长从动态网站提取内容的网页抓取专家。",
tools=[selenium_tool],
verbose=True,
)

SeleniumScrapingTool 在初始化时接受以下参数:

  • website_url:可选。要抓取的网站 URL。如果在初始化时提供,智能体在使用该工具时就无需再指定它。
  • css_element:可选。要提取元素的 CSS 选择器。如果在初始化时提供,智能体在使用该工具时就无需再指定它。
  • cookie:可选。包含 cookie 信息的字典,适用于模拟登录会话以访问受限内容。
  • wait_time:可选。抓取前的延迟(秒),用于让网站和任何动态内容充分加载。默认值为 3 秒。
  • return_html:可选。是否返回 HTML 内容而不仅仅是文本。默认值为 False

在与智能体一起使用时,智能体需要提供以下参数(除非它们已在初始化时指定):

  • website_url:必需。要抓取的网站 URL。
  • css_element:必需。要提取元素的 CSS 选择器。

下面是如何将 SeleniumScrapingTool 与 CrewAI 智能体集成的更详细示例:

from crewai import Agent, Task, Crew, Process
from crewai_tools import SeleniumScrapingTool
# 初始化工具
selenium_tool = SeleniumScrapingTool()
# 定义一个使用该工具的智能体
web_scraper_agent = Agent(
role="Web Scraper",
goal="从动态网站中提取并分析信息",
backstory="""你是一名擅长从需要浏览器自动化的动态网站中提取
内容的网页抓取专家。你对 CSS 选择器有丰富的知识,能够识别
任意网站上用于定位特定内容的正确选择器。""",
tools=[selenium_tool],
verbose=True,
)
# 为智能体创建任务
scrape_task = Task(
description="""
{website_url} 这个新闻网站提取以下信息:
1. 所有精选文章的标题(CSS 选择器:'.headline')
2. 这些文章的发布日期(CSS 选择器:'.pub-date')
3. 如有作者姓名,则提取作者名(CSS 选择器:'.author')
将这些信息整理成结构化格式,并将每篇文章的详情归组。
""",
expected_output="包含文章标题、发布日期和作者的结构化列表。",
agent=web_scraper_agent,
)
# 运行任务
crew = Crew(
agents=[web_scraper_agent],
tasks=[scrape_task],
verbose=True,
process=Process.sequential,
)
result = crew.kickoff(inputs={"website_url": "https://news-example.com"})

SeleniumScrapingTool 使用 Selenium WebDriver 自动化浏览器交互:

class SeleniumScrapingTool(BaseTool):
name: str = "Read a website content"
description: str = "A tool that can be used to read a website content."
args_schema: Type[BaseModel] = SeleniumScrapingToolSchema
def _run(self, **kwargs: Any) -> Any:
website_url = kwargs.get("website_url", self.website_url)
css_element = kwargs.get("css_element", self.css_element)
return_html = kwargs.get("return_html", self.return_html)
driver = self._create_driver(website_url, self.cookie, self.wait_time)
content = self._get_content(driver, css_element, return_html)
driver.close()
return "\n".join(content)

该工具会执行以下步骤:

  1. 创建一个无头 Chrome 浏览器实例
  2. 导航到指定 URL
  3. 等待指定时间以让页面加载完成
  4. 如果提供了 cookie,则添加它们
  5. 根据 CSS 选择器提取内容
  6. 以文本或 HTML 形式返回提取内容
  7. 关闭浏览器实例

SeleniumScrapingTool 对于抓取通过 JavaScript 加载的动态内容的网站特别有用。通过使用真实的浏览器实例,它可以:

  1. 在页面上执行 JavaScript
  2. 等待动态内容加载
  3. 在需要时与元素交互
  4. 提取仅靠简单 HTTP 请求无法获取的内容

你可以调整 wait_time 参数,以确保所有动态内容在提取前都已加载完成。

SeleniumScrapingTool 提供了一种通过浏览器自动化从网站中提取内容的强大方式。通过让智能体像真实用户一样与网站交互,它使抓取动态内容成为可能,而这些内容使用更简单的方法往往难以或无法提取。对于涉及现代 Web 应用、JavaScript 渲染内容的研究、数据收集和监控任务,这个工具非常有用。