#!/usr/bin/env python3 """Scrape mobile.de for Mazda 2 listings near Mönchengladbach using Playwright + proxy""" import asyncio, json, re, sys from playwright.async_api import async_playwright MG_PLZ = "41061" BUDGET = 10000 MAX_KM = 120000 MIN_YEAR = 2014 # mobile.de URL with filters URL = ( f"https://suchen.mobile.de/fahrzeuge/search.html" f"?dam=0&isSearchRequest=true&ms=1200;3;;&pMax={BUDGET}" f"&mlMin={MIN_YEAR}&mlMax:{MAX_KM}&sf={MG_PLZ}&vc=Car&od=down&sb=rel" ) PROXY = { "server": "http://geo.iproyal.com:12321", "username": "8B7M8nJOfXTNHPUw", "password": "lR1VidJhN5RrRbeK_region-europe" } async def main(): listings = [] async with async_playwright() as p: browser = await p.chromium.launch( headless=True, args=['--no-sandbox', '--disable-setuid-sandbox'] ) context = await browser.new_context( proxy=PROXY, user_agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', locale='de-DE', timezone_id='Europe/Berlin' ) page = await context.new_page() try: print(f"Loading {URL}") await page.goto(URL, wait_until='networkidle', timeout=30000) content = await page.content() print(f"Page loaded: {len(content)} bytes") if 'Zugriff verweigert' in content or 'Access denied' in content: print("BLOCKED - access denied with proxy too") await browser.close() return [] # Wait for results to load try: await page.wait_for_selector('[data-testid="result-list"], .result-list, .cfyXj, article', timeout=10000) except: print("No results selector found, trying to extract anyway...") # Extract listings from page content = await page.content() # Try to find structured data via JSON-LD or embedded data # mobile.de embeds listing data in