Zum Inhalt springen
GProxy
Registrierung
Гайды 5 Min. Lesezeit 31 Aufrufe

Here are the German translations:

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

Python Парсинг
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:pass1@proxy1.example.com:8000",
    "http://user2:pass2@proxy2.example.com:8000",
    "http://user3:pass3@proxy3.example.com: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:pass1@proxy1.example.com:8000",
    "http://user2:pass2@proxy2.example.com: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

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.