Heim BlogWeb-Scraping So verwenden Sie Proxys mit Python-Anfragen

So verwenden Sie Proxys mit Python-Anfragen

von Kadek

So rotieren Sie Proxys mit Asyc und Aiohttp

Verwenden von aiohttp für die asynchrone Proxy-Rotation verbessert die Effizienz von Web-Scraping-Vorgängen und ermöglicht die gleichzeitige Bearbeitung mehrerer Anfragen.

Wir ändern das vorherige Beispiel fetch_url() zu verwendende Funktion
aiohttp für die asynchrone Proxy-Rotation. Dadurch können mehrere Anfragen gleichzeitig bearbeitet werden, was bei großen Datenerfassungsaufgaben, die eine hohe Leistung erfordern und eine Erkennung vermeiden, von entscheidender Bedeutung ist.


  import aiohttp
  import asyncio
  
  async def fetch_url(url, proxies):
      # Select an active proxy from the list each time the function is called
      proxy = find_active_proxy(proxies)
      proxy_url = f'http://{proxy}'
      print(f'Using proxy: {proxy}')
  
      # Create an HTTP client session
      async with aiohttp.ClientSession() as session:
          # Send a GET request to the URL using the selected proxy
          async with session.get(url, proxy=proxy_url) as response:
              print(f'Status: {response.status}')
              print(await response.text())  

Lassen Sie uns nun die main() Funktion zum Verwalten mehrerer URLs:


  async def main(proxies):
  urls_to_scrape = (
      'http://httpbin.org/get' # List the URLs you want to scrape here.
  )
  for url in urls_to_scrape:
      await fetch_url(url, proxies)

Schließlich müssen Sie die Hauptfunktion initialisieren und ausführen:


  proxies = fetch_proxies() 
  asyncio.run(main(proxies))

Verwenden von aiohttp für die asynchrone Proxy-Rotation stellt sicher, dass unsere Web-Scraping-Aufgaben effizienter sind, was den Datenextraktionsprozess beschleunigt und die Fähigkeit zur Verwaltung umfangreicher Scraping-Aufgaben erheblich verbessert.

So rotieren Sie Proxys mit Selenium

Die Verwendung von Selenium zum Rotieren von Proxys ist ideal für Web-Scraping-Aufgaben, die eine Interaktion mit JavaScript-lastigen Websites oder die Simulation von Benutzerverhalten erfordern.

Wir ändern die fetch_url() Funktion aus unserem vorherigen Beispiel und verwenden Sie die Selenium-Bibliothek, um dies zu erreichen.


  import selenium
  from selenium import webdriver
  
  def fetch_url(url, proxies):
      # Select an active proxy
      proxy = find_active_proxy(proxies)
      print(f"Using proxy: {proxy}")
      
      # Set up proxy for Selenium
      options = webdriver.ChromeOptions()
      options.add_argument(f'--proxy-server={proxy}')
  
      # Initialize Chrome driver with proxy
      driver = webdriver.Chrome(options=options)
      try:
          # Load the URL
          driver.get(url)
      except Exception as e:
          print(f"Failed to fetch URL: {str(e)}")
      finally:
          driver.quit()
  
  # Load your initial list of proxies
  proxies = fetch_proxies()
  
  # URLs to scrape
  urls_to_scrape = ("https://example.com/")
  
  # Scrape each URL with a rotated proxy using Selenium
  for url in urls_to_scrape:
      fetch_url(url, proxies)

In der modifizierten fetch_url() Funktion: Wir verwenden Seleniums WebDriver, um mit dem Chrome-Browser zu interagieren. Wir konfigurieren den WebDriver so, dass er für jede Anfrage den ausgewählten Proxy verwendet, sodass wir unseren Datenverkehr über verschiedene IP-Adressen leiten können.

Durch die Kombination von Selenium mit Proxy-Rotation können wir erweiterte Web-Scraping-Aufgaben effektiver durchführen und dabei während des gesamten Prozesses Zuverlässigkeit und Anonymität gewährleisten.

Proxy-Rotation mit ScraperAPI

Nachdem wir nun gelernt haben, wie man Proxys auf grundlegender Ebene rotiert, ist es klar, dass die Anwendung dieser Methode auf die Verarbeitung großer Datensätze viel komplexer wäre. Die Verwendung eines Tools wie ScraperAPI ist eine kluge Wahl für eine einfachere und zuverlässigere Möglichkeit zur Verwaltung rotierter Proxys.

Aus diesem Grund kann ScraperAPI Ihr Proxy-Management grundlegend verändern:

  • Vereinfachen Sie Ihren Workflow: ScraperAPI übernimmt die schwere Arbeit der Verwaltung und Rotation von Proxys, damit Sie sich auf das konzentrieren können, was am wichtigsten ist – Ihre Daten.
  • Intelligente Proxy-Rotation: ScraperAPI verwendet eine intelligente Rotation basierend auf maschinellem Lernen und statistischer Analyse, um Proxys intelligent zu rotieren und sicherzustellen, dass Sie immer die beste Verbindung für Ihre Anforderungen haben.
  • Proxy-Integrität aufrechterhalten: Sie müssen sich nicht um die Wartung Ihrer Proxys kümmern. ScraperAPI entfernt automatisch nicht funktionierende Proxys und hält so Ihren Pool aktuell.
  • Bereit zur Skalierung: Unabhängig von der Größe Ihres Projekts passt sich ScraperAPI Ihren Anforderungen lückenlos an, was perfekt für wachsende Projekte ist.

Wenn Sie sich für ScraperAPI entscheiden, vermeiden Sie die Komplexität der manuellen Proxy-Verwaltung und erhalten ein unkompliziertes, effizientes Tool, mit dem Sie sich auf das Extrahieren und effektive Nutzen Ihrer Daten konzentrieren können.

Wiederholen Sie fehlgeschlagene Anfragen

Manchmal erhalten wir fehlgeschlagene Anfragen aufgrund von Netzwerkproblemen oder anderen unerwarteten Problemen. In diesem Abschnitt untersuchen wir drei Hauptmethoden, um fehlgeschlagene Anfragen mit Python-Anfragen erneut zu versuchen:

  • Verwenden eines vorhandenen Wiederholungs-Wrappers: Diese Methode eignet sich perfekt für eine schnelle und einfache Lösung. Sie verwendet bereits in Python verfügbare Tools zur Handhabung von Wiederholungsversuchen und spart Ihnen so Zeit und Aufwand.
  • Codieren Ihres eigenen Retry-Wrappers: Wenn Sie etwas benötigen, das besser auf Ihre speziellen Anforderungen zugeschnitten ist, können Sie mit dieser Methode Ihr eigenes Wiederholungssystem von Grund auf neu erstellen.

Bevor wir uns jedoch für die beste Vorgehensweise entscheiden, müssen wir verstehen, warum unsere Anfragen fehlschlagen.

Häufige Ursachen für Anforderungsfehler

Wenn Sie die allgemeinen Probleme verstehen, die zum Fehlschlagen Ihrer HTTP-Anfragen führen können, können Sie effektive Wiederholungsstrategien besser vorbereiten und implementieren.

Hier sind drei Hauptursachen für Anforderungsfehler:

Netzwerkprobleme

Netzwerkprobleme sind einer der häufigsten Gründe für fehlgeschlagene HTTP-Anfragen. Diese können von vorübergehenden Störungen Ihrer Internetverbindung bis hin zu größeren Netzwerkausfällen reichen, die größere Gebiete betreffen. Wenn das Netzwerk instabil ist, kann es bei Ihren Anfragen zu einer Zeitüberschreitung kommen oder sie gehen während der Übertragung verloren, was zu fehlgeschlagenen Versuchen beim Abrufen oder Senden von Daten führt.

Server überlastet

Eine weitere typische Ursache für fehlgeschlagene Anfragen ist eine Serverüberlastung. Wenn der Server, mit dem Sie kommunizieren möchten, mehr Anfragen erhält, als er verarbeiten kann, kann es sein, dass er eingehende Verbindungen abbricht oder länger braucht, um zu antworten. Diese Verzögerung kann zu Timeouts führen, bei denen Ihre Anfrage nicht im erwarteten Zeitrahmen verarbeitet wird, was zu einem Fehler führt.

Ratenbegrenzung

Ratenbegrenzung ist ein Kontrollmechanismus, den APIs verwenden, um die Anzahl der Anfragen zu begrenzen, die ein Benutzer in einem bestimmten Zeitraum stellen kann. Wenn Sie zu viele Anfragen zu schnell senden, blockiert der Server möglicherweise Ihre zusätzlichen Anfragen für einen festgelegten Zeitraum. Dies ist eine Schutzmaßnahme, um eine Überlastung der Server zu verhindern und eine faire Nutzung durch alle Benutzer sicherzustellen.

Es ist wichtig, dass Sie die Ratenbegrenzungen der APIs kennen, mit denen Sie arbeiten, da eine Überschreitung dieser Begrenzungen häufig zu fehlgeschlagenen Anfragen führt.

Durch die Identifizierung und das Verständnis dieser häufigen Probleme können Sie Ihre Wiederholungslogik besser an bestimmte Fehlerszenarien anpassen und so die Zuverlässigkeit Ihrer HTTP-Anfragen verbessern.

Diagnostizieren Ihrer fehlgeschlagenen Anfragen

Sobald Sie die häufigsten Ursachen für Anforderungsfehler kennen, lernen Sie im nächsten Schritt, wie Sie diese Probleme diagnostizieren, wenn sie auftreten. Dazu müssen Sie das Problem identifizieren und die richtige Strategie zur Lösung wählen.

Identifizieren des Problems

Eine der einfachsten Methoden, um herauszufinden, warum eine Anfrage fehlgeschlagen ist, ist, sich die zurückgegebenen HTTP-Statuscodes anzusehen. Diese Codes sind Standardantworten, die Ihnen mitteilen, ob eine Anfrage erfolgreich war und, falls nicht, was schiefgelaufen ist. Zum Beispiel:

  • 5xx-Fehler weisen auf serverseitige Probleme hin.
  • 4xx-Fehler weisen auf Probleme mit der Anfrage hin, wie etwa unbefugten Zugriff oder Anfragen nach nicht vorhandenen Ressourcen.
  • Zeitüberschreitungen sind oft nicht mit einem Statuscode versehen, müssen aber unbedingt identifiziert werden, da sie auf potenzielle Probleme mit der Netzwerk- oder Serverüberlastung hinweisen.

Hier sind einige der häufigsten Statuscodes, die beim Web Scraping auftreten können und auf unterschiedliche Arten von Fehlern hinweisen:

200 OK

Die Anforderung war erfolgreich. Dieser Statuscode gibt an, dass der Vorgang erfolgreich empfangen, verstanden und akzeptiert wurde.

404 Nicht gefunden

Die angeforderte Ressource kann auf dem Server nicht gefunden werden. Dies kommt häufig vor, wenn die Zielwebseite verschoben oder gelöscht wurde. Es kann jedoch auch bedeuten, dass Ihr Scraper blockiert wurde.

500 Interner Serverfehler

Eine allgemeine Fehlermeldung, wenn auf dem Server ein unerwarteter Zustand auftritt.

502 Bad Gateway

Der Server hat beim Versuch, die Anforderung zu erfüllen, eine ungültige Antwort vom Upstream-Server erhalten, auf den er zugegriffen hat.

503 Dienst nicht verfügbar

Aufgrund einer vorübergehenden Überlastung oder einer geplanten Wartung kann der Server die Anforderung derzeit nicht verarbeiten.

429 Zu viele Anfragen

Dieser Statuscode ist für Web Scraper von entscheidender Bedeutung, da er anzeigt, dass Sie das Ratenlimit des Servers erreicht haben.

Diese Statuscodes zeigen an, was möglicherweise schief läuft, und ermöglichen Ihnen, Ihre Anforderungsstrategie entsprechend anzupassen.

Werkzeuge und Techniken

Zur weiteren Diagnose von Netzwerk- und Serverproblemen können Sie die Verwendung der folgenden Tools in Betracht ziehen:

  • Netzwerkdiagnosetools: Tools wie Wireshark oder Ping können Ihnen dabei helfen, herauszufinden, ob Ihre Anfragen durch Probleme mit der Netzwerkverbindung beeinträchtigt werden.
  • HTTP-Clients: Tools wie Postman oder curl ermöglichen Ihnen das manuelle Senden von Anfragen und die Überprüfung der detaillierten Antworten von Servern, einschließlich Headern, die im Falle einer Ratenbegrenzung möglicherweise „Retry-After“-Felder enthalten.
  • Protokollierung: Stellen Sie sicher, dass Ihre Scraping-Skripte genügend Details zu fehlgeschlagenen Anfragen protokollieren. Dazu können der Zeitpunkt der Anfrage, die angeforderte URL, der empfangene Statuscode und alle Serverantwortnachrichten gehören. Diese Informationen sind entscheidend für die Diagnose hartnäckiger Probleme und die Verbesserung der Belastbarkeit Ihrer Skripte.

Durch die effektive Nutzung dieser Diagnosetools und -techniken können Sie die Ursachen für fehlgeschlagene Anfragen schnell ermitteln. So können Sie leichter die entsprechenden Lösungen anwenden, um die Effizienz und Effektivität Ihrer Web-Scraping-Aufgaben aufrechtzuerhalten.

Lösungen für häufige Anforderungsfehler

Es gibt zwei Möglichkeiten, Python-Anfragen erneut zu versuchen:

  1. Verwenden Sie einen vorhandenen Wiederholungs-Wrapper wie Python Sessions mit HTTPAdapter.
  2. Codieren Sie Ihren eigenen Retry-Wrapper.

Die erste Option ist in den meisten Fällen die beste, da sie unkompliziert und effektiv ist. Wenn Sie jedoch etwas Spezifischeres benötigen, ist die zweite Option möglicherweise besser.

Implementierung der Wiederholungslogik mithilfe eines vorhandenen Wiederholungs-Wrappers

Eine praktische Lösung für den Umgang mit Wiederholungsversuchen mit Python
Anfragen Bibliothek ist die Verwendung eines vorhandenen Retry-Wrappers, wie
HTTPAdapterDieser Ansatz vereinfacht das Einrichten von Wiederholungsmechanismen und macht Ihre HTTP-Anfragen weniger fehleranfällig.

Schritt 1: Importieren Sie die erforderlichen Module

Bevor Sie beginnen, stellen Sie sicher, dass requests Und
urllib3 Bibliotheken sind in Ihrer Umgebung installiert. Wenn nicht, können Sie sie mit pip installieren:


  pip install requests urllib3

Importieren Sie dann die erforderlichen Module in Ihr Python-Skript:


  import requests
  from requests.adapters import HTTPAdapter
  from urllib3.util.retry import Retry

Schritt 2: Erstellen Sie eine Instanz von HTTPAdapter mit Wiederholungsparametern

Erstellen Sie eine Instanz von HTTPAdapter und konfigurieren Sie sie mit einer Retry-Strategie. Die Retry-Klasse bietet mehrere Optionen zum Anpassen der Handhabung von Wiederholungsversuchen:


  retry_strategy = Retry(
    total=3,  # Total number of retries to allow. This limits the number of consecutive failures before giving up.
    status_forcelist=(429, 500, 502, 503, 504),  # A set of HTTP status codes we should force a retry on.
    backoff_factor=2  # This determines the delay between retry attempts
)

adapter = HTTPAdapter(max_retries=retry_strategy)

Dieses Setup weist den Adapter an, bis zu dreimal einen erneuten Versuch zu unternehmen, wenn die HTTP-Anforderung mit einem der angegebenen Statuscodes fehlschlägt. Die
backoff_factor führt eine Verzögerung zwischen den Wiederholungsversuchen ein, was hilfreich ist, wenn der Server vorübergehend überlastet oder ausgefallen ist.

Bei jedem Wiederholungsversuch wird Folgendes abgewartet:
{backoff factor} * (2 ^ {number of total retries - 1}) Sekunden.

Schritt 3: Den HTTPAdapter in eine Requests-Sitzung einbinden

Nachdem Sie die Wiederholungsstrategie definiert haben, hängen Sie den HTTPAdapter an
requests.Session(). Dadurch wird sichergestellt, dass alle über diese Sitzung gesendeten Anfragen den von Ihnen festgelegten Wiederholungsregeln entsprechen:


  session = requests.Session()
  session.mount("http://", adapter)
  session.mount("https://", adapter)

Durch das Einbinden des Adapters in die Sitzung wird die Wiederholungslogik auf alle Typen von HTTP- und HTTPS-Anfragen angewendet, die von dieser Sitzung aus erfolgen.

Beispielverwendung

Verwenden Sie nun die Sitzung, um Anfragen zu senden. So führen Sie eine GET-Anfrage mit Ihrer konfigurierten Sitzung aus:


  url = 'http://example.com'
  response = session.get(url)
  print(response.status_code)
  print(response.text)

Dieses Sitzungsobjekt verarbeitet Wiederholungsversuche automatisch gemäß Ihren definierten Einstellungen. Wenn Fehler wie Server-Nichtverfügbarkeit oder ratenbegrenzende Antworten auftreten, kann es die Anfrage bis zu dreimal wiederholen und so die Zuverlässigkeit Ihrer Netzwerkinteraktionen verbessern.

Related Posts

Hinterlasse einen Kommentar