Scraping-tool / stealth_browser.py
Sinketji's picture
Create stealth_browser.py
53ef5e6 verified
from playwright.sync_api import sync_playwright
import random
import time
# -----------------------------
# Human-like delay
# -----------------------------
def human_delay(min_ms=200, max_ms=800):
time.sleep(random.uniform(min_ms / 1000, max_ms / 1000))
# -----------------------------
# Stealth browser launcher
# -----------------------------
def launch_stealth_browser(headless=True):
p = sync_playwright().start()
browser = p.chromium.launch(
headless=headless,
args=[
"--disable-blink-features=AutomationControlled",
"--disable-infobars",
"--disable-dev-shm-usage",
"--no-sandbox",
"--disable-gpu",
"--disable-extensions",
]
)
context = browser.new_context(
user_agent=random_user_agent(),
viewport=random_viewport(),
locale="en-US",
timezone_id="America/New_York",
permissions=["geolocation"],
java_script_enabled=True,
)
# Mask webdriver + automation traces
context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
""")
page = context.new_page()
return p, browser, context, page
# -----------------------------
# Random viewport
# -----------------------------
def random_viewport():
return {
"width": random.choice([1366, 1440, 1536, 1600, 1920]),
"height": random.choice([768, 900, 1024, 1080]),
}
# -----------------------------
# High-quality user agents
# -----------------------------
def random_user_agent():
return random.choice([
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
])
# -----------------------------
# Cloudflare-aware navigation
# -----------------------------
def stealth_goto(page, url):
page.goto(url, wait_until="domcontentloaded", timeout=45000)
human_delay(800, 1600)
# Simulate small mouse movements
for _ in range(random.randint(2, 5)):
page.mouse.move(
random.randint(100, 800),
random.randint(100, 600),
steps=random.randint(5, 20)
)
human_delay(100, 300)
# Scroll like human
page.mouse.wheel(0, random.randint(300, 900))
human_delay(500, 1200)
return page.content()
# -----------------------------
# Close browser safely
# -----------------------------
def close_browser(p, browser):
try:
browser.close()
p.stop()
except:
pass