SeleniumScrapingTool

이 도구는 현재 개발 중입니다. 기능을 개선하는 과정에서 사용자께서 예기치 않은 동작을 경험하실 수 있습니다. 개선을 위한 소중한 피드백을 부탁드립니다.

설명

SeleniumScrapingTool은 고효율 웹 스크래핑 작업을 위해 제작되었습니다. 이 도구는 CSS 선택자를 사용하여 웹 페이지에서 특정 요소를 정확하게 추출할 수 있습니다. 다양한 스크래핑 요구에 맞게 설계되어, 제공된 모든 웹사이트 URL과 함께 유연하게 작업할 수 있습니다.

설치

이 도구를 사용하려면 CrewAI tools 패키지와 Selenium을 설치해야 합니다:
pip install 'crewai[tools]'
uv add selenium webdriver-manager
또한 이 도구는 Chrome WebDriver를 사용하여 브라우저 자동화를 수행하므로, 시스템에 Chrome이 설치되어 있어야 합니다.

예시

다음 예시는 SeleniumScrapingTool을 CrewAI agent와 함께 사용하는 방법을 보여줍니다:
Code
from crewai import Agent, Task, Crew, Process
from crewai_tools import SeleniumScrapingTool

# Initialize the tool
selenium_tool = SeleniumScrapingTool()

# Define an agent that uses the tool
web_scraper_agent = Agent(
    role="Web Scraper",
    goal="Extract information from websites using Selenium",
    backstory="An expert web scraper who can extract content from dynamic websites.",
    tools=[selenium_tool],
    verbose=True,
)

# Example task to scrape content from a website
scrape_task = Task(
    description="Extract the main content from the homepage of example.com. Use the CSS selector 'main' to target the main content area.",
    expected_output="The main content from example.com's homepage.",
    agent=web_scraper_agent,
)

# Create and run the crew
crew = Crew(
    agents=[web_scraper_agent],
    tasks=[scrape_task],
    verbose=True,
    process=Process.sequential,
)
result = crew.kickoff()
도구를 미리 정의된 파라미터로 초기화할 수도 있습니다:
Code
# Initialize the tool with predefined parameters
selenium_tool = SeleniumScrapingTool(
    website_url='https://example.com',
    css_element='.main-content',
    wait_time=5
)

# Define an agent that uses the tool
web_scraper_agent = Agent(
    role="Web Scraper",
    goal="Extract information from websites using Selenium",
    backstory="An expert web scraper who can extract content from dynamic websites.",
    tools=[selenium_tool],
    verbose=True,
)

파라미터

SeleniumScrapingTool은(는) 초기화 시 다음과 같은 파라미터를 받습니다:
  • website_url: 선택 사항. 스크래핑할 웹사이트의 URL입니다. 초기화 시 지정하면, 에이전트가 도구 사용 시 따로 지정할 필요가 없습니다.
  • css_element: 선택 사항. 추출할 요소의 CSS 셀렉터입니다. 초기화 시 지정하면, 에이전트가 도구 사용 시 따로 지정할 필요가 없습니다.
  • cookie: 선택 사항. 쿠키 정보가 담긴 딕셔너리로, 제한된 콘텐츠에 접근하기 위한 로그인 세션을 시뮬레이션하는 데 유용합니다.
  • wait_time: 선택 사항. 스크래핑 전 대기 시간(초 단위)을 지정하며, 웹사이트와 모든 동적 콘텐츠가 완전히 로드되도록 합니다. 기본값은 3초입니다.
  • return_html: 선택 사항. 단순 텍스트 대신 HTML 콘텐츠를 반환할지 여부를 지정합니다. 기본값은 False입니다.
에이전트와 함께 도구를 사용할 때, 다음 파라미터를 제공해야 합니다(초기화 시 이미 지정된 경우 제외):
  • website_url: 필수. 스크래핑할 웹사이트의 URL입니다.
  • css_element: 필수. 추출할 요소의 CSS 셀렉터입니다.

에이전트 통합 예시

여기서는 SeleniumScrapingTool을 CrewAI 에이전트와 통합하는 방법에 대해 더 자세히 설명합니다.
Code
from crewai import Agent, Task, Crew, Process
from crewai_tools import SeleniumScrapingTool

# Initialize the tool
selenium_tool = SeleniumScrapingTool()

# Define an agent that uses the tool
web_scraper_agent = Agent(
    role="Web Scraper",
    goal="Extract and analyze information from dynamic websites",
    backstory="""You are an expert web scraper who specializes in extracting
    content from dynamic websites that require browser automation. You have
    extensive knowledge of CSS selectors and can identify the right selectors
    to target specific content on any website.""",
    tools=[selenium_tool],
    verbose=True,
)

# Create a task for the agent
scrape_task = Task(
    description="""
    Extract the following information from the news website at {website_url}:

    1. The headlines of all featured articles (CSS selector: '.headline')
    2. The publication dates of these articles (CSS selector: '.pub-date')
    3. The author names where available (CSS selector: '.author')

    Compile this information into a structured format with each article's details grouped together.
    """,
    expected_output="A structured list of articles with their headlines, publication dates, and authors.",
    agent=web_scraper_agent,
)

# Run the task
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를 사용하여 브라우저 상호작용을 자동화합니다:
Code
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. Headless Chrome 브라우저 인스턴스를 생성합니다.
  2. 지정된 URL로 이동합니다.
  3. 페이지가 로드될 수 있도록 지정된 시간만큼 대기합니다.
  4. 제공된 쿠키가 있다면 추가합니다.
  5. CSS 선택자에 따라 콘텐츠를 추출합니다.
  6. 추출된 콘텐츠를 텍스트 또는 HTML로 반환합니다.
  7. 브라우저 인스턴스를 닫습니다.

동적 콘텐츠 처리

SeleniumScrapingTool은 JavaScript를 통해 로드되는 동적 콘텐츠가 있는 웹사이트를 스크래핑할 때 특히 유용합니다. 실제 브라우저 인스턴스를 사용함으로써 다음을 수행할 수 있습니다:
  1. 페이지에서 JavaScript 실행
  2. 동적 콘텐츠가 로드될 때까지 대기
  3. 필요하다면 요소와 상호작용
  4. 단순 HTTP 요청으로는 얻을 수 없는 콘텐츠 추출
모든 동적 콘텐츠가 추출 전에 로드되었는지 확인하기 위해 wait_time 파라미터를 조정할 수 있습니다.

결론

SeleniumScrapingTool은 브라우저 자동화를 활용하여 웹사이트에서 콘텐츠를 추출하는 강력한 방법을 제공합니다. 이 도구는 에이전트가 실제 사용자처럼 웹사이트와 상호작용할 수 있게 해주어, 간단한 방법으로는 추출이 어렵거나 불가능한 동적 콘텐츠의 스크래핑을 가능하게 합니다. 특히, JavaScript로 렌더링되는 현대적인 웹 애플리케이션을 대상으로 연구, 데이터 수집 및 모니터링 작업에 매우 유용합니다.