Fortgeschrittenes Web Scraping mit rotierenden Dataimpulse Residential-Proxies und Scrapy unter Linux
Erstellen Sie einen produktionsbereiten Scrapy-Spider, der Dataimpulse Residential-Proxies rotiert, Wiederholungsversuche behandelt und unter Linux skaliert.
Überblick
Scrapy ist ein leistungsstarkes Python-Framework für Web Scraping im großen Maßstab. Dieses Tutorial zeigt, wie Sie rotierende Dataimpulse Residential-Proxies in ein Scrapy-Projekt unter Linux integrieren, mit benutzerdefinierter Middleware für Rotation, Wiederholungslogik und SOCKS5-Unterstützung. Wir behandeln außerdem die Skalierung mit mehreren Spiders.
Voraussetzungen
- Linux-Server (Ubuntu 20.04+ empfohlen)
- Python 3.8+
- Scrapy installiert (
pip install scrapy) - Dataimpulse Residential-Proxy-Zugangsdaten (HTTP oder SOCKS5)
- Grundkenntnisse zu Scrapy-Middleware und -Einstellungen
Architektur
Wir verwenden eine benutzerdefinierte Downloader-Middleware, um Proxies pro Anfrage zu rotieren. Dataimpulse bietet einen rotierenden Endpunkt (ein einzelner host:port, der IPs automatisch rotiert) oder eine Liste von Sticky-Session-Endpunkten. Prüfen Sie Ihr Dataimpulse-Dashboard für das genaue Endpunktformat.
Schritte
-
Richten Sie ein Scrapy-Projekt ein.
pip install scrapy scrapy startproject advanced_scraper cd advanced_scraper -
Speichern Sie Ihre Proxy-Zugangsdaten sicher. Erstellen Sie eine
.env-Datei (und fügen Sie sie zu.gitignorehinzu) oder exportieren Sie Umgebungsvariablen:export DAI_PROXY_HOST="your-proxy-host" export DAI_PROXY_PORT="your-proxy-port" export DAI_PROXY_USER="your-username" export DAI_PROXY_PASS="your-password" -
Erstellen Sie eine benutzerdefinierte Proxy-Middleware. Fügen Sie in
advanced_scraper/middlewares.pyhinzu:import os from scrapy import signals from scrapy.exceptions import NotConfigured class DataimpulseProxyMiddleware: def __init__(self, proxy_url): self.proxy_url = proxy_url @classmethod def from_crawler(cls, crawler): proxy_host = os.getenv('DAI_PROXY_HOST') proxy_port = os.getenv('DAI_PROXY_PORT') proxy_user = os.getenv('DAI_PROXY_USER') proxy_pass = os.getenv('DAI_PROXY_PASS') if not all([proxy_host, proxy_port, proxy_user, proxy_pass]): raise NotConfigured('Dataimpulse-Proxy-Zugangsdaten fehlen') proxy_url = f'socks5://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}' return cls(proxy_url) def process_request(self, request, spider): request.meta['proxy'] = self.proxy_url # Für SOCKS5 benötigt Scrapy das Proxy-Schema in meta # Für SOCKS5 sind keine zusätzlichen Header erforderlich -
Aktivieren Sie die Middleware und konfigurieren Sie die Scrapy-Einstellungen. Aktualisieren Sie in
advanced_scraper/settings.py:DOWNLOADER_MIDDLEWARES = { 'advanced_scraper.middlewares.DataimpulseProxyMiddleware': 543, # Standard-Proxy-Middleware deaktivieren, falls aktiviert 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, } # Wiederholungseinstellungen RETRY_ENABLED = True RETRY_TIMES = 5 RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429] # Parallelität und Verzögerung CONCURRENT_REQUESTS = 16 DOWNLOAD_DELAY = 0.5 -
Erstellen Sie einen Spider, der die Middleware verwendet. In
advanced_scraper/spiders/example.py:import scrapy class ExampleSpider(scrapy.Spider): name = 'example' start_urls = ['https://httpbin.org/ip'] def parse(self, response): yield {'ip': response.json()['origin']}Führen Sie ihn aus:
scrapy crawl exampleDie Ausgabe sollte eine Dataimpulse-IP anzeigen.
-
Implementieren Sie Proxy-Rotation für Sticky-Sessions (optional). Wenn Sie mehrere Sticky-Session-Endpunkte haben, ändern Sie die Middleware, um einen zufälligen Proxy aus einer Liste auszuwählen:
import random class RotatingProxyMiddleware: def __init__(self, proxy_list): self.proxy_list = proxy_list @classmethod def from_crawler(cls, crawler): # Liste aus Umgebungsvariablen oder Konfiguration erstellen proxy_list = [ f'socks5://{os.getenv("DAI_PROXY_USER")}:{os.getenv("DAI_PROXY_PASS")}@{host}:{port}' for host, port in [('host1', 'port1'), ('host2', 'port2')] ] return cls(proxy_list) def process_request(self, request, spider): request.meta['proxy'] = random.choice(self.proxy_list) -
Skalieren Sie mit mehreren Spiders mithilfe von scrapyd. Installieren Sie scrapyd:
pip install scrapyd scrapyd-clientStellen Sie Ihr Projekt bereit und planen Sie mehrere Spiders mit unterschiedlichen Proxy-Endpunkten. Verwenden Sie eine Job-Warteschlange, um URLs zu verteilen.
-
Überwachen und behandeln Sie Fehler. Protokollieren Sie Proxy-Fehler in der Middleware:
def process_response(self, request, response, spider): if response.status in [403, 429]: spider.logger.warning(f'Blockiert mit Proxy {request.meta.get("proxy")}') return response
Fehlerbehebung
- SOCKS5 funktioniert nicht: Stellen Sie sicher, dass Sie das Schema
socks5://inrequest.meta['proxy']verwenden und dass ScrapysHttpProxyMiddlewaredeaktiviert ist. Scrapy setzt auftxsocksxoderPySocks; installieren Sie bei Bedarfpip install txsocksx. - Authentifizierungsfehler: URL-kodieren Sie Sonderzeichen in Benutzername/Passwort.
- Hohe Sperrraten: Erhöhen Sie die Verzögerung, reduzieren Sie die Parallelität und stellen Sie sicher, dass Sie rotierende Endpunkte verwenden. Ziehen Sie Dataimpulse Sticky-Sessions für Seiten mit Anmeldepflicht in Betracht.
- Speicherlecks: Überwachen Sie die Speichernutzung von Scrapy mit
scrapy statsund starten Sie Spiders regelmäßig neu.
Zusammenfassung
Die Integration von rotierenden Dataimpulse Residential-Proxies mit Scrapy unter Linux umfasst eine benutzerdefinierte Downloader-Middleware, geeignete Wiederholungseinstellungen und optional SOCKS5 für Protokollflexibilität. Durch Skalierung mit scrapyd und Überwachung der Proxy-Leistung können Sie eine robuste Scraping-Pipeline aufbauen. Respektieren Sie stets die Nutzungsbedingungen und robots.txt der Zielwebsites.