Python-Leitfaden · 2 Min Lesezeit

Web-Scraping mit Python-Anfragen und Proxys

Ein praktischer Scraping-Workflow, der auf Requests und BeautifulSoup basiert, über einen authentifizierten Proxy geleitet, sodass Ihre ursprüngliche IP verborgen bleibt und Ihr Crawler die Ratenlimits übersteht. Vollständig ausführbarer Code enthalten.

Ein Scraper ist eine Sitzung, kein Loop von Abrufen.

Der Unterschied zwischen einem Scraper, der zehn Minuten funktioniert, und einem, der stundenlang läuft, liegt fast nie im Parsen – es ist, wie Sie Anfragen stellen. Ein naiver for url in urls: requests.get(url) öffnet jedes Mal eine frische TCP-Verbindung, sendet keine realistischen Header, speichert keine Cookies und bombardiert das Ziel von einer IP, bis es eine 429 oder eine Sperre erhält.

Die Lösung ist eine requests.Session plus einen Proxy. Eine Sitzung bündelt Verbindungen und speichert Cookies, sodass eine Flut von Seiten schneller ist und wie ein kohärenter Client aussieht. Ein authentifizierter Proxy ersetzt Ihre echte Adresse durch einen Datacenter-Ausgang, sodass die Website Ihre ursprüngliche IP niemals sieht und eine einzelne blockierte Adresse nicht den gesamten Job beendet. s4m-Proxys sprechen SOCKS5 auf Port 1080 und HTTP auf Port 3128, beide authentifiziert mit USER:PASS – verwenden Sie socks5h://, damit DNS remote aufgelöst wird und Hostnamen niemals durchsickern. Für experimentelle Zwecke ist die kostenlose öffentliche Proxyliste ein separater Pool, den Sie auf eigenes Risiko nutzen.

Ein widerstandsfähiger Anfragen-Scraper

Sitzung, realistische Header, Wiederholungen mit Backoff, Proxy-Rotation und BeautifulSoup-Parsing in einer Datei. Ersetzen Sie USER:PASS durch Ihre Anmeldedaten.

python
import random
import time
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",  # needs requests[socks]
    f"http://{USER}:{PASS}@{HOST}:3128",
]

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}

def make_session(proxy):
    s = requests.Session()
    s.headers.update(HEADERS)
    s.proxies = {"http": proxy, "https": proxy}
    return s

def fetch(url, retries=4):
    for attempt in range(1, retries + 1):
        proxy = random.choice(POOL)
        try:
            s = make_session(proxy)
            r = s.get(url, timeout=(5, 20))
            if r.status_code == 429:
                raise RequestException("rate limited")
            r.raise_for_status()
            return r
        except RequestException as e:
            wait = 2 ** attempt + random.random()  # exponential backoff
            print(f"[{attempt}/{retries}] {proxy} -> {e}; sleeping {wait:.1f}s")
            time.sleep(wait)
    raise SystemExit(f"giving up on {url}")

html = fetch("https://quotes.toscrape.com/").text
soup = BeautifulSoup(html, "html.parser")
for q in soup.select(".quote"):
    text = q.select_one(".text").get_text(strip=True)
    who = q.select_one(".author").get_text(strip=True)
    print(f"{who}: {text}")

Was einen Crawler am Leben hält

Vier Gewohnheiten, die wichtiger sind als der Parser, den Sie wählen.

Einen echten User-Agent senden

Der Standard-User-Agent von python-requests ist ein sofortiges Warnsignal. Setzen Sie einen normalen Browser-User-Agent und einen Accept-Language-Header, damit die Anfragen sich mit dem normalen Verkehr vermischen.

Gehen Sie zurück, versuchen Sie es nicht blind erneut

Bei einem 429 oder einem Timeout schlafen Sie mit exponentiellem Backoff und Jitter, bevor Sie es erneut versuchen. Enge Wiederholungsloops vertiefen nur die Blockade und verbrauchen Proxy-Verkehr.

Rotieren Sie den Exit, nicht nur den Retry

Wähle bei jedem Versuch einen frischen Proxy aus einem Pool, damit eine markierte IP den Job nicht stoppt. Abgerechnete Rechenzentrums-Proxys machen dies kostengünstig skalierbar.

Respektieren Sie das Ziel

Lesen Sie robots.txt, drosseln Sie die gleichzeitige Nutzung und scrapen Sie nur das, was Ihnen erlaubt ist. Ein höflicher Crawler ist auch schwerer zu blockieren.

Von einem Skript zu einer echten Pipeline

Sobald die Abrufschleife stabil ist, besteht der Rest aus Orchestrierung. Halte einen kleinen Pool von Proxy-URLs und rotiere sie pro Anfrage; wenn ein Ziel aggressiv wird, vergrößere den Pool anstatt die Anzahl der Wiederholungen zu erhöhen. Speichere die Ergebnisse während des Vorgangs, damit ein Fehler während des Laufs dich nicht die gesamte Crawl-Kosten kostet, und füge eine höfliche Verzögerung zwischen den Seiten hinzu, damit du unter dem Ratenlimit bleibst, anstatt dagegen anzukämpfen.

Wenn du ad-hoc-Skripte überwachst, fällt derselbe Proxy-Endpunkt direkt in Scrapy oder einen asynchronen Client — siehe rotierende Proxys in Python für einen aiohttp-Pool. Alles basiert auf denselben s4m-Bausteinen: authentifizierte Datacenter-SOCKS5- und HTTP-Proxys, nach Verbrauch abgerechnet, mit der API und Tools, um Exit-IP-Adressen und Ports zu überprüfen. Wenn du nur schnell ein Land oder Protokoll überprüfen musst, starte von der kostenlosen Liste.

FAQ

Fragen, beantwortet

Brauche ich PySocks für die SOCKS5-Beispiele?

Ja. SOCKS-Unterstützung in Anfragen kommt von PySocks — installieren Sie es mit pip install "requests[socks]". Der HTTP-Endpunkt auf Port 3128 funktioniert mit einer Standard-Requests-Installation und ohne zusätzliche Abhängigkeiten.

Wie vermeide ich es, beim Scraping blockiert zu werden?

Senden Sie einen realistischen User-Agent, drosseln Sie Ihre Anfragerate, reduzieren Sie bei 429-Antworten und rotieren Sie Ausgangs-IPs durch einen Proxy-Pool. Sperren beziehen sich normalerweise auf Verhalten und IP-Ruf, nicht auf den Parser, den Sie verwenden.

Sind s4m-Proxys residential?

Nein. s4m verkauft authentifizierte Rechenzentrums-SOCKS5- und HTTP-Proxys, die nach Verbrauch abgerechnet werden. Die separate kostenlose öffentliche Proxyliste ist von Dritten und auf eigene Gefahr zu verwenden, nützlich nur für schnelle Tests.

Warum socks5h anstelle von socks5 verwenden?

socks5h fordert den Proxy auf, DNS aufzulösen, sodass die Hostnamen, die Sie scrapen, niemals von Ihrem Gerät geleakt werden. Plain socks5 löst zuerst lokal auf, was Ihre Ziele offenbaren kann.

Proxys, die für Scraping entwickelt wurden

Richten Sie Anfragen an proxy.s4m.online, rotieren Sie durch authentifizierte Datacenter SOCKS5- und HTTP-Ausgänge und zahlen Sie nur für den Traffic, den Sie nutzen. Fügen Sie eine dedizierte IP hinzu, wann immer ein Ziel eine erwartet.

Menschen fanden diese Seite durch die Suche nach

Echte Suchphrasen, auf die diese Seite antwortet — die verlinkten öffnen die Seite, die sie ausführlich behandelt.