"""Pydantic data models for Google Maps scraper."""
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field
class PlaceDetails(BaseModel):
"""Structured details about a Google Maps place."""
name: Optional[str] = None
place_id: Optional[str] = None
address: Optional[str] = None
rating: Optional[float] = None
review_count: Optional[int] = None
phone: Optional[str] = None
website: Optional[str] = None
category: Optional[str] = None
price_level: Optional[str] = None
hours: Optional[list[str]] = None
latitude: Optional[float] = None
longitude: Optional[float] = None
plus_code: Optional[str] = None
url: Optional[str] = None
google_maps_url: Optional[str] = None
image_url: Optional[str] = None
description: Optional[str] = None
photos_count: Optional[int] = None
# Additional details
permanently_closed: bool = False
temporarily_closed: bool = False
class ScrapeResult(BaseModel):
"""Result of scraping a single Google Maps URL."""
input_url: str
place: Optional[PlaceDetails] = None
success: bool = True
error: Optional[str] = None
scraped_at: datetime = Field(default_factory=datetime.now)
class ScrapeConfig(BaseModel):
"""Configuration for the scraper."""
concurrency: int = Field(default=5, ge=1, le=50)
timeout: int = Field(default=30000, description="Page load timeout in ms")
headless: bool = True
language: Optional[str] = None
max_retries: int = 3
delay_min: float = 1.0
delay_max: float = 3.0
save_interval: int = Field(
default=50,
description="Save results every N items for crash recovery",
)
proxy: Optional[str] = None