- Add playwright-stealth integration with enable_stealth parameter in BrowserConfig - Merge undetected browser strategy into main async_crawler_strategy.py using adapter pattern - Add browser adapters (BrowserAdapter, PlaywrightAdapter, UndetectedAdapter) for flexible browser switching - Update install.py to install both playwright and patchright browsers automatically - Add comprehensive documentation for anti-bot features (stealth mode + undetected browser) - Create examples demonstrating stealth mode usage and comparison tests - Update pyproject.toml and requirements.txt with patchright>=1.49.0 and other dependencies - Remove duplicate/unused dependencies (alphashape, cssselect, pyperclip, shapely, selenium) - Add dependency checker tool in tests/check_dependencies.py Breaking changes: None - all existing functionality preserved 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
"""
|
|
Simple test to verify stealth mode is working
|
|
"""
|
|
|
|
import asyncio
|
|
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
|
|
|
|
|
|
async def test_stealth():
|
|
"""Test stealth mode effectiveness"""
|
|
|
|
# Test WITHOUT stealth
|
|
print("=== WITHOUT Stealth ===")
|
|
config1 = BrowserConfig(
|
|
headless=False,
|
|
enable_stealth=False
|
|
)
|
|
|
|
async with AsyncWebCrawler(config=config1) as crawler:
|
|
result = await crawler.arun(
|
|
url="https://bot.sannysoft.com",
|
|
config=CrawlerRunConfig(
|
|
wait_until="networkidle",
|
|
screenshot=True
|
|
)
|
|
)
|
|
print(f"Success: {result.success}")
|
|
# Take screenshot
|
|
if result.screenshot:
|
|
with open("without_stealth.png", "wb") as f:
|
|
import base64
|
|
f.write(base64.b64decode(result.screenshot))
|
|
print("Screenshot saved: without_stealth.png")
|
|
|
|
# Test WITH stealth
|
|
print("\n=== WITH Stealth ===")
|
|
config2 = BrowserConfig(
|
|
headless=False,
|
|
enable_stealth=True
|
|
)
|
|
|
|
async with AsyncWebCrawler(config=config2) as crawler:
|
|
result = await crawler.arun(
|
|
url="https://bot.sannysoft.com",
|
|
config=CrawlerRunConfig(
|
|
wait_until="networkidle",
|
|
screenshot=True
|
|
)
|
|
)
|
|
print(f"Success: {result.success}")
|
|
# Take screenshot
|
|
if result.screenshot:
|
|
with open("with_stealth.png", "wb") as f:
|
|
import base64
|
|
f.write(base64.b64decode(result.screenshot))
|
|
print("Screenshot saved: with_stealth.png")
|
|
|
|
print("\nCheck the screenshots to see the difference in bot detection results!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(test_stealth()) |