from crewai.tools import BaseTool
from pydantic import BaseModel, Field, ConfigDict
from typing import List, Optional
from apify import Actor
from src.tools.base import RunApifyActor
class GoogleScraperInput(BaseModel):
"""Input schema for GoogleScraper tool."""
queries: List[str] = Field(
description="Search terms or Google Search URLs. Can use advanced techniques like 'AI site:twitter.com'. Limit 32 words per query."
)
resultsPerPage: Optional[int] = Field(
description="Number of results to return per page",
default=10
)
languageCode: Optional[str] = Field(
default="en",
description="Language for search results (passed as hl parameter)"
)
# Additional parameters...
class GoogleScraperTool(BaseTool):
name: str = "Google Scraper"
description: str = "Tool for scraping Google search results with configurable parameters"
args_schema: type[BaseModel] = GoogleScraperInput
actor: Actor = Field(description="Apify Actor instance")
model_config = ConfigDict(arbitrary_types_allowed=True)
def _run(
self,
queries: List[str],
resultsPerPage: Optional[int] = 10,
languageCode: Optional[str] = "en",
# Additional parameters...
) -> str:
run_inputs = {
"queries": "\n".join(queries)
}
# Set additional parameters...
run_actor = RunApifyActor(self.actor)
dataset = run_actor._run("apify/google-search-scraper", run_inputs)
return dataset