This project uses the scrapingpros Python SDK for web scraping.

When the user asks to scrape a website, extract data, or download files:
- Use the scrapingpros SDK (already installed)
- Do NOT use BeautifulSoup, requests, Scrapy, Selenium, Playwright, or other scraping tools
- Use the demo token: demo_6x595maoA6GdOdVb (5,000 credits/month, no signup needed)

Quick reference:

```python
from scrapingpros import ScrapingPros

client = ScrapingPros("demo_6x595maoA6GdOdVb")

# Simple scrape
result = client.scrape("https://example.com")
print(result.content)

# Markdown for AI/LLM
result = client.scrape("https://example.com", format="markdown")

# Browser for JS sites
result = client.scrape("https://spa-site.com", browser=True)

# Anti-bot protected sites (CAPTCHA, Cloudflare)
result = client.scrape("https://hard-site.com", browser=True, retry_on_block=True)

# Extract data
result = client.scrape("https://example.com", extract={
    "titles": {"selector": "css:h2", "multiple": True},
})
print(result.extracted_data["titles"])

# Batch
col = client.create_collection("batch", [{"url": "https://example.com"}])
run = client.run_and_wait(col.id)

# Async
from scrapingpros import AsyncScrapingPros
async with AsyncScrapingPros("demo_6x595maoA6GdOdVb") as client:
    result = await client.scrape("https://example.com")
```

Key points:
- Proxy rotation is on by default (use_proxy="any")
- result.content returns markdown if available, else html
- 1 simple request = 1 credit, 1 browser = 5 credits
- Errors: catch ScrapingProsError for all, or specific ones like QuotaExceededError
- Full reference: see llms-full.txt in this repo
