Zum Inhalt springen
Guides 5 Min. Lesezeit 788 Aufrufe

Here are the German translations:

Web-Scraping mit Proxy unter Verwendung von Beautiful Soup und requests

Python Parsing
Here are the German translations:

Web Scraping mit Beautiful Soup und requests unter Verwendung eines Proxys beinhaltet die Konfiguration der requests-Bibliothek, um den Webverkehr über einen bestimmten Proxy-Server zu leiten, bevor der HTML-Inhalt mit Beautiful Soup geparst wird. Dies ermöglicht IP-Rotation, Umgehung von Geo-Beschränkungen und Minderung von IP-Sperren.

Beim Web Scraping können direkte Anfragen von einer einzigen IP-Adresse zu Ratenbegrenzungen, temporären oder permanenten IP-Sperren oder geo-beschränkten Inhalten führen. Proxy-Dienste begegnen diesen Herausforderungen, indem sie Anfragen über verschiedene IP-Adressen leiten, was das Scraping robuster und skalierbarer macht.

Die Kernbibliotheken für diese Aufgabe sind:
* requests: Eine HTTP-Bibliothek für Python, die das Senden von HTTP-Anfragen vereinfacht.
* Beautiful Soup: Eine Python-Bibliothek zum Parsen von HTML- und XML-Dokumenten.

Konfigurieren von Proxys mit requests

Die requests-Bibliothek unterstützt die Proxy-Konfiguration über den Parameter proxies in ihren Anfragemethoden.

Einzelne Proxy-Konfiguration

Um einen einzelnen Proxy zu verwenden, stellen Sie ein Wörterbuch bereit, das Protokolle (HTTP, HTTPS) der Proxy-URL zuordnet.

import requests

proxy_http = "http://your_proxy_ip:port"
proxy_https = "https://your_proxy_ip:port" # Often identical to HTTP

proxies = {
    "http": proxy_http,
    "https": proxy_https,
}

try:
    response = requests.get("http://httpbin.org/ip", proxies=proxies, timeout=10)
    response.raise_for_status()
    print("External IP:", response.json().get('origin'))
except requests.exceptions.RequestException as e:
    print(f"Request failed: {e}")

Proxy-Authentifizierung

Für Proxys, die eine Authentifizierung erfordern, betten Sie die Anmeldeinformationen direkt in die Proxy-URL ein.

import requests

proxy_user = "your_username"
proxy_pass = "your_password"
proxy_host = "your_proxy_ip"
proxy_port = "port"

authenticated_proxy = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"

proxies = {
    "http": authenticated_proxy,
    "https": authenticated_proxy,
}

try:
    response = requests.get("http://httpbin.org/ip", proxies=proxies, timeout=10)
    response.raise_for_status()
    print("External IP (authenticated):", response.json().get('origin'))
except requests.exceptions.RequestException as e:
    print(f"Authenticated request failed: {e}")

Rotierende Proxys

Für groß angelegtes Scraping ist das Rotieren durch eine Liste von Proxys unerlässlich, um Anfragen zu verteilen und das Risiko einer Blockierung zu minimieren.

import requests
import random
import time

proxy_list = [
    "http://user1:[email protected]:8000",
    "http://user2:[email protected]:8000",
    "http://user3:[email protected]:8000",
]

def get_random_proxy():
    return random.choice(proxy_list)

def make_proxied_request(url, headers=None, attempt_limit=3):
    for attempt in range(attempt_limit):
        proxy_url = get_random_proxy()
        proxies = {"http": proxy_url, "https": proxy_url}
        try:
            print(f"Attempt {attempt + 1}: Using proxy {proxy_url.split('@')[-1]} for {url}")
            response = requests.get(url, proxies=proxies, headers=headers, timeout=15)
            response.raise_for_status()
            return response
        except requests.exceptions.RequestException as e:
            print(f"Proxy request failed (attempt {attempt + 1}): {e}")
            time.sleep(random.uniform(2, 5)) # Delay before retrying with a new proxy
    return None

# Example usage with a dummy URL
try:
    target_url = "http://quotes.toscrape.com/"
    response = make_proxied_request(target_url)
    if response:
        print(f"Successfully fetched {target_url} with status code {response.status_code}")
except Exception as e:
    print(f"Failed to fetch {target_url} after multiple retries: {e}")

Parsen von HTML mit Beautiful Soup

Beautiful Soup transformiert HTML-Inhalte aus einer requests-Antwort in ein navigierbares Python-Objekt.

from bs4 import BeautifulSoup

html_doc = """
<html>
<head><title>Example Page</title></head>
<body>
<p class="intro"><b>Welcome!</b></p>
<div id="content">
    <a href="/item1" class="product-link">Product A</a>
    <a href="/item2" class="product-link">Product B</a>
</div>
</body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

# Accessing elements
print("Page Title:", soup.title.string)

# Finding specific elements
intro_paragraph = soup.find('p', class_='intro')
print("Intro text:", intro_paragraph.get_text(strip=True))

# Finding all elements by class
product_links = soup.find_all('a', class_='product-link')
for link in product_links:
    print(f"Product: {link.get_text()}, URL: {link['href']}")

Integration von Proxys mit Beautiful Soup Scraping

Die Kombination von Proxy-Konfiguration mit Beautiful Soup Parsing ermöglicht einen vollständigen Scraping-Workflow.

import requests
from bs4 import BeautifulSoup
import random
import time

# --- Proxy Configuration (as defined previously) ---
proxy_list = [
    "http://user1:[email protected]:8000",
    "http://user2:[email protected]:8000",
    # Add more proxies from your service
]

def get_random_proxy():
    return random.choice(proxy_list)

def make_proxied_request(url, headers=None, attempt_limit=3):
    for attempt in range(attempt_limit):
        proxy_url = get_random_proxy()
        proxies = {"http": proxy_url, "https": proxy_url}
        try:
            print(f"Attempt {attempt + 1} for {url}: Using proxy {proxy_url.split('@')[-1]}")
            response = requests.get(url, proxies=proxies, headers=headers, timeout=15)
            response.raise_for_status()
            return response
        except requests.exceptions.RequestException as e:
            print(f"Request failed (attempt {attempt + 1}): {e}")
            time.sleep(random.uniform(2, 5))
    return None

# --- Scraping Logic ---
def scrape_quotes(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }

    response = make_proxied_request(url, headers=headers)

    if response:
        soup = BeautifulSoup(response.text, 'html.parser')
        quotes = soup.find_all('div', class_='quote')

        data = []
        for quote in quotes:
            text = quote.find('span', class_='text').get_text(strip=True)
            author = quote.find('small', class_='author').get_text(strip=True)
            tags = [tag.get_text(strip=True) for tag in quote.find_all('a', class_='tag')]
            data.append({"text": text, "author": author, "tags": tags})
        return data
    return []

# --- Execution ---
if __name__ == "__main__":
    target_url = "http://quotes.toscrape.com/"
    print(f"Starting scrape of {target_url}")
    scraped_data = scrape_quotes(target_url)

    if scraped_data:
        print(f"Scraped {len(scraped_data)} quotes:")
        for i, quote in enumerate(scraped_data[:3]): # Print first 3 for brevity
            print(f"  {i+1}. Author: {quote['author']}, Quote: {quote['text'][:50]}...")
    else:
        print("No data scraped.")

Best Practices und Überlegungen

User-Agent Header

Webserver überprüfen oft den User-Agent-Header, um den Client zu identifizieren. Ein Standard-requests-User-Agent kann einen Bot anzeigen. Das Nachahmen eines gängigen Browser-User-Agents reduziert die Erkennung.

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Connection": "keep-alive",
}
response = requests.get(url, proxies=proxies, headers=headers)

Anforderungsverzögerungen und Drosselung

Schnelle Anfragen können Ratenbegrenzungen oder IP-Sperren auslösen. Implementieren Sie Verzögerungen zwischen den Anfragen, insbesondere bei der Rotation von Proxys. time.sleep() mit einem zufälligen Verzögerungsbereich ist effektiv.

import time
import random
# ... inside a loop processing multiple URLs ...
time.sleep(random.uniform(2, 7)) # Wait between 2 and 7 seconds
response = make_proxied_request(next_url, headers=headers)

Fehlerbehandlung

Robustes Scraping erfordert eine umfassende Fehlerbehandlung für Netzwerkprobleme, Proxy-Fehler und Serverantworten.
* requests.exceptions.RequestException: Fängt alle requests-bezogenen Fehler ab (Verbindung, Timeout, HTTP-Fehler).
* HTTP-Statuscodes: Überprüfen Sie response.status_code. Codes wie 403 (Forbidden), 404 (Not Found), 429 (Too Many Requests) oder 5xx (Server Error) weisen auf Probleme hin.
* Timeouts: Konfigurieren Sie einen timeout-Parameter in requests.get(), um unbegrenzte Wartezeiten zu verhindern.

CAPTCHAs und erweiterte Anti-Scraping-Maßnahmen

Einige Websites verwenden fortschrittliche Erkennungsmechanismen wie CAPTCHAs oder JavaScript-Herausforderungen. Proxys helfen bei der IP-Rotation, lösen diese jedoch nicht direkt. Für solche Fälle sollten Sie Headless-Browser (z. B. Selenium, Playwright) oder spezialisierte CAPTCHA-Lösungsdienste in Betracht ziehen.

Vergleich der Proxy-Typen

Merkmal Datacenter Proxys Residential Proxys
IP-Quelle Kommerzielle Server, Cloud-Anbieter Echte Benutzergeräte (Desktops, Mobilgeräte) mit ISP-IPs
Anonymität Hoch, aber IPs werden oft als Datacenter erkannt Sehr hoch, IPs erscheinen als legitime Benutzer
Kosten Im Allgemeinen niedriger Deutlich höher
Geschwindigkeit Typischerweise schneller, geringere Latenz Kann langsamer sein, höhere Latenz
Erkennungsrisiko Höheres Risiko, erkannt/blockiert zu werden Geringeres Risiko, ideal zur Umgehung strenger Anti-Bot-Maßnahmen
Anwendungsfälle Allgemeines Scraping, öffentliche Daten, weniger geschützte Websites Hochwertige Ziele, E-Commerce, soziale Medien, Geo-Targeting

Rechtliche und ethische Überlegungen

  • robots.txt: Respektieren Sie die robots.txt-Datei einer Website, die Regeln für Web-Crawler festlegt. Greifen Sie darauf unter http://example.com/robots.txt zu.
  • Nutzungsbedingungen: Überprüfen Sie die Nutzungsbedingungen einer Website. Scraping kann untersagt sein.
  • Datennutzung: Stellen Sie die Einhaltung der Datenschutzbestimmungen (z. B. DSGVO, CCPA) sicher.
  • Auswirkungen auf den Server: Vermeiden Sie es, den Zielserver mit Anfragen zu überlasten. Implementieren Sie angemessene Verzögerungen.
Aktualisiert: 04.03.2026
Zurück zur Kategorie

Lesen Sie auch

Guides 2 Min.

Proxy für Nike SNKRS: Limitierte Drops ergattern & mehrere Teilnahmen sichern

Nutze Residential- oder Mobile-Proxies für Nike SNKRS, um mit mehreren Accounts an Draws teilzunehmen, IP-Limits zu umgehen und limitierte Drops ohne Bans zu coppen. Welcher Typ zu wählen ist und wie man das Setup einrichtet.

Guides 2 Min.

So richten Sie einen Proxy auf dem iPhone ein (WLAN & SOCKS5)

Richten Sie einen Proxy auf dem iPhone über die nativen Wi-Fi-Einstellungen (HTTP/HTTPS) oder eine Proxy-App wie Shadowrocket für SOCKS5 und Mobilfunkabdeckung ein. Schritt-für-Schritt-iOS-Setup und die zu beachtenden Einschränkungen.

Guides 3 Min.

Proxy für Tinder: Mehrere Accounts & Sperren vermeiden

Nutze Mobile- oder Residential-Proxies für Tinder, um mehrere Profile zu betreiben und IP-Shadowbans zu vermeiden. Warum Mobile gewinnt, wie man es einrichtet und warum ein Proxy allein nicht deinen Standort ändert.

Guides 2 Min.

Proxy für StockX: Preise überwachen & Accounts verwalten

Nutzen Sie Residential-, ISP- oder Mobile-Proxys für StockX, um Preise zu überwachen, mehrere Accounts zu verwalten und Drops ohne Bans zu coppen. Hier erfahren Sie, welchen Typ Sie wählen sollten und wie Sie GProxy einrichten.

Guides 3 Min.

Proxy für OpenAI API: Zugriff, Rate Limits & Setup

Leite die OpenAI API über einen Residential- oder ISP-Proxy (GProxy +) weiter, um auf unterstützte Regionen zuzugreifen, 429-Rate-Limits zu umgehen und Accounts zu isolieren. Welcher Proxy zu verwenden ist, plus Python-Setup-Beispiele.

Guides 1 Min.

Einrichten eines Proxys in Cypress für E2E-Tests

Einrichten eines Proxys in Cypress: HTTP_PROXY-Variablen, cy-proxy-middleware und das Testen standortabhängiger Inhalte.

Testen Sie unsere Proxys

20.000+ Proxys in über 100 Ländern weltweit

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.