Warum Scrapy einen Proxy benötigt
Proxys für Scrapy ermöglichen es dem Tool, sich über eine andere IP-Adresse zu verbinden, anstatt immer die IP der Maschine zu verwenden, die es ausführt. Dies ist nützlich für standortbasierte Aufgaben, Tests, Überwachung und andere Arbeiten, bei denen die Verbindungsquelle eine Rolle spielt.
Scrapy erledigt weiterhin die Hauptaufgabe. Der Proxy kümmert sich darum, woher die Verbindung kommt.
Was ohne einen passiert: IP-Sperren, Ratenbegrenzungen, Geoblocking
Ohne einen Proxy sehen Websites immer dieselbe IP. Wenn die Aktivität zunimmt, kann diese IP eine Ratenbegrenzung erreichen oder gesperrt werden.
Auch der Standort kann wichtig sein. Eine Seite, die von Deutschland aus geöffnet wird, liefert möglicherweise nicht denselben Inhalt wie eine, die von den USA aus geöffnet wird.
Ein Proxy für Scrapy ermöglicht es, sich bei Bedarf von verschiedenen IPs und Standorten aus zu verbinden.
Welchen Proxy-Typ man mit Scrapy verwenden sollte
Der richtige Proxy-Typ hängt von der Aufgabe ab.
| Proxy-Typ | Scraping | Kontoverwaltung | Testen | Überwachung |
|---|
| Residential | Gut, wenn Standort und IP-Quelle wichtig sind | Nützlich, wenn Konten Residential IPs benötigen | Gut für standortbasierte Tests | Nützlich, um Inhalte von verschiedenen Standorten zu überprüfen |
| ISP | Gut, wenn eine stabile IP benötigt wird | Nützlich für längere Sitzungen auf einer IP | Gut zum Testen mit einer konsistenten IP | Nützlich für fortlaufende Überprüfungen von derselben IP |
| Datacenter | Gut für Geschwindigkeit und größere Anfragenvolumina | Besser, wenn Residential IPs nicht erforderlich sind | Gut für allgemeine Tests | Gut für häufige automatisierte Überprüfungen |
Residential Proxys sind nützlich, wenn die IP-Quelle und der Standort wichtig sind. ISP-Proxys funktionieren gut, wenn dieselbe IP länger aktiv bleiben muss. Datacenter-Proxys sind sinnvoll, wenn der Hauptfokus auf Geschwindigkeit und Skalierbarkeit liegt.
Die beste Option hängt auch davon ab, ob die Aufgabe Geo-Targeting, eine stabile Verbindung oder den Zugang zu einem größeren Pool von IPs erfordert.
Wie man einen Proxy in Scrapy verbindet
Das Scrapy Proxy-Setup benötigt den Geonode-Host, Port, Benutzernamen und das Passwort. Bewahren Sie die Anmeldeinformationen in Umgebungsvariablen auf und laden Sie diese dann beim Einrichten des Proxys im Code.
Nutzen Sie Geonode? Holen Sie sich den Benutzernamen und das Passwort von Access Credentials und den Host, Port und das Protokoll von Proxy Server Information.
Einstellungen oder Code-Pfad
Für unseren Test haben wir eine Downloader-Middleware hinzugefügt:
DOWNLOADER_MIDDLEWARES = {
"geonode_scrapy.middlewares.GeonodeProxyMiddleware": 350,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
Die Middleware übergibt die Proxy-URL über request.meta["proxy"], die Scrapy's HttpProxyMiddleware dann verwendet:
request.meta["proxy"] = proxy_url
Sie können den Proxy auch direkt an eine einzelne Anfrage übergeben:
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Bewahren Sie den tatsächlichen Benutzernamen und das Passwort in Umgebungsvariablen auf, anstatt sie direkt in die Python-Datei zu schreiben. Dieses Setup lieferte während unseres Tests erfolgreich HTTP 200 über den Proxy zurück.
Authentifizierungsformat Host:Port:Benutzer:Passwort
Geonode gibt Ihnen vier Werte:
proxy.geonode.io:PORT:USERNAME:PASSWORD
Scrapy benötigt dieselben Details wie eine Proxy-URL:
http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Speichern Sie die Anmeldeinformationen oder den vollständigen Proxy-Wert in einer Umgebungsvariablen:
GEONODE_PROXY_URL=http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Dann laden Sie sie in Python:
import os
proxy_url = os.environ["GEONODE_PROXY_URL"]
Für unseren HTTP-Test war das resultierende Format:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
Um die Authentifizierung zu überprüfen, haben wir die Anfrage auch mit falschen Anmeldeinformationen ausgeführt. Scrapy erhielt HTTP 407 mit der Antwort:
Authentication error. Please check your authentication settings.
Scrapy zeigte die Antwort über HttpErrorMiddleware als HttpError('Ignoring non-200 response') an.
Rotation vs. Sticky Session in Scrapy
Wenn die Anfragen nicht dieselbe IP behalten müssen, verwenden Sie Rotation.
Für unseren Test haben wir den rotierenden Geonode-Proxy an Scrapy übergeben:
proxy_url = "http://USERNAME:PASSWORD@proxy.geonode.io:9000"
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Wir haben fünf aufeinanderfolgende Anfragen gestellt:
Anfrage 1: 101.98.231.191
Anfrage 2: 101.98.231.191
Anfrage 3: 101.98.231.191
Anfrage 4: 122.164.83.189
Anfrage 5: 122.164.83.189
Einzigartige IPs: 2
Rotation: Ja
Der Test bestätigt, dass eine Rotation stattgefunden hat, aber die IP hat sich nicht bei jeder Anfrage geändert.
Wenn verwandte Anfragen auf derselben IP bleiben müssen, verwenden Sie stattdessen eine Sticky Session:
proxy_url = (
"http://USERNAME-session-blogtest01-lifetime-10:"
"PASSWORD@proxy.geonode.io:10000"
)
Wir haben drei Anfragen mit derselben Sitzung gestellt:
Anfrage 1: 177.73.202.78
Anfrage 2: 177.73.202.78
Anfrage 3: 177.73.202.78
Gleiche IP: Ja
Alle drei Anfragen verwendeten in unserem Test dieselbe IP.
Sehen Sie sich die Geonode-Anleitungen für rotierende Proxys und neue Sticky Sessions für die verfügbaren Einstellungen an.
Häufige Proxy-Fehler in Scrapy und deren Behebung
Wenn der Proxy nicht funktioniert, beginnen Sie mit den Verbindungsdetails. Überprüfen Sie den Benutzernamen und das Passwort, dann den Host, den Port und das Protokoll. Der von Scrapy zurückgegebene Fehler kann in der Regel helfen, das Problem einzugrenzen.
407 Proxy-Authentifizierung erforderlich
Ein 407 deutet in der Regel auf ein Authentifizierungsproblem hin.
Als wir Scrapy mit falschen Anmeldeinformationen testeten, gab der Proxy zurück:
HTTP status: 407
Authentication error. Please check your authentication settings.
Überprüfen Sie zuerst den Benutzernamen und das Passwort. Wenn diese korrekt sind, stellen Sie sicher, dass Scrapy die vollständige Proxy-URL mit Schema, Anmeldeinformationen, Host und Port erhält.
ERR_TUNNEL_CONNECTION_FAILED / Verbindung abgelehnt
Ein Verbindungsfehler bedeutet in der Regel, dass Scrapy den Proxy nicht erreichen konnte.
Überprüfen Sie zuerst den Host und den Port. Stellen Sie dann sicher, dass das Protokoll mit dem verwendeten Proxy-Server übereinstimmt.
Scrapy gibt nicht unbedingt die browserähnliche Meldung ERR_TUNNEL_CONNECTION_FAILED zurück. In unserem Test mit Verbindungsfehlern hat Scrapy die Anfrage wiederholt und schließlich DownloadFailedError zurückgegeben, der einen Twisted ConnectionLost-Fehler enthielt.
Timeouts und leere Antworten
Ein Timeout bedeutet, dass die Anfrage innerhalb der konfigurierten Zeit keine Antwort erhalten hat.
Überprüfen Sie zuerst, ob die Ziel-URL funktioniert und ob der Proxy eine Verbindung herstellen kann. Wenn beides funktioniert, überprüfen Sie die Timeout-Konfiguration in Scrapy.
Für unseren Verbindungsfehlertest haben wir einen ungültigen Proxy-Port mit DOWNLOAD_TIMEOUT=5 verwendet. Nach den Wiederholungen gab Scrapy zurück:
DownloadFailedError(
ConnectionLost:
Die Verbindung zur anderen Seite wurde auf unsaubere Weise getrennt.
)
Ein fehlgeschlagener Proxy-Verbindungsversuch kann also eher als Verbindungsfehler denn als einfache Timeout-Meldung erscheinen.
Ein spezieller Fehler bei Scrapy
Ein einfacher Scrapy-spezifischer Fehler ist das Übergeben eines unvollständigen Wertes an request.meta["proxy"].
In unserem Test haben wir verwendet:
proxy.geonode.io:9000
ohne Schema oder Anmeldeinformationen. Die Anfrage gab HTTP 407 zurück.
Die Lösung bestand darin, die vollständige Proxy-URL zu übergeben:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
oder die Downloader-Middleware sie aus Umgebungsvariablen erstellen zu lassen.
Scrapy + Geonode: Was Sie erhalten
Scrapy wickelt die Anfragen oder Verbindungen in der Anwendung ab. Geonode kümmert sich um die Proxy-Verbindung.
Sie können je nach Aufgabe Residential, ISP oder Datacenter-Proxys wählen und dann bei Bedarf Rotation, Sticky Sessions und Geo-Targeting verwenden. Dies hält die Proxy-Einrichtung vom Rest des Anwendungscodes getrennt.
Die Pläne variieren je nach Proxy-Typ, wobei einige Optionen pro GB bepreist sind.
FAQ
Unterstützt Scrapy SOCKS5-Proxys?
SOCKS5 erforderte in der von uns getesteten Scrapy-Version eine zusätzliche Einrichtung.
Das Übergeben eines socks5://-Proxys über Scrapy's Standard-HTTP-Handler schlug fehl mit:
UnsupportedURLSchemeError("Nicht unterstütztes Schema: b'socks5'")
Wir haben dann httpx2[socks] installiert und Scrapy's experimentellen HttpxDownloadHandler konfiguriert. Mit dem SOCKS5-Rotationsproxy auf Port 11000 war die Anfrage erfolgreich mit HTTP 200 und gab eine Proxy-IP zurück. Der Handler ist experimentell, daher ist er eher für Tests als für eine Produktionsempfehlung geeignet.
Kann ich IPs pro Anfrage in Scrapy rotieren lassen?
Ja, Scrapy kann Anfragen über einen rotierenden Proxy senden, aber eine andere IP ist nicht für jede Anfrage garantiert.
Unser Fünf-Anfragen-Test ergab zwei einzigartige IPs. Die ersten drei Anfragen teilten sich eine IP, während die letzten beiden eine andere teilten, was bestätigt, dass während des Tests eine Rotation stattfand.
Gibt es eine kostenlose Testversion?
Ja. Geonode bietet eine kostenlose Testversion an, sodass der Proxy vor dem Wechsel zu einem kostenpflichtigen Plan mit Scrapy getestet werden kann. Überprüfen Sie die aktuelle kostenlose Testversion und die Pläne.
Wo sollte ich den Proxy in Scrapy konfigurieren?
Für eine einzelne Anfrage übergeben Sie den Proxy über request.meta["proxy"].
Wenn für viele Anfragen dieselbe Proxy-Einrichtung erforderlich ist, hält die Downloader-Middleware die Proxy-Logik an einem Ort. In unserem Test setzte die benutzerdefinierte Middleware request.meta["proxy"], bevor Scrapy's integrierte HttpProxyMiddleware die Anfrage verarbeitete.
Warum läuft mein Scrapy-Spider, sendet aber 0 Anfragen?
Überprüfen Sie, wie der Spider seine ersten Anfragen erstellt.
In unserem Scrapy 2.19-Test führte das Definieren nur der alten start_requests()-Methode dazu, dass der Spider mit null Anfragen geöffnet und geschlossen wurde. Die Verwendung der asynchronen start()-Methode behob dies:
async def start(self):
yield scrapy.Request(...)
Dies war das Verhalten, das während unserer getesteten Einrichtung aufgezeichnet wurde.