Scrapy-Proxy-Einstellung: Unterschiedliche IPs pro Anfrage mit meta proxy
Diese Anleitung zeigt für Scrapy die Verbindung von Socks5Proxy-HTTP-Proxys über meta proxy, das Rotieren von API-Listen pro Anfrage mit Downloader-Middleware und geschwindigkeitsoptimierte Einstellungen.
Wie verarbeitet Scrapy Proxies?
Scrapy hat standardmäßig HttpProxyMiddleware aktiviert. Wenn Sie die Proxy-Adresse im meta-Dictionary der Anfrage angeben, wird diese über den Proxy gesendet. Benutzername und Passwort in der Adresse werden von der Middleware in einen Proxy-Authorization-Header umgewandelt. HTTPS-Adressen gehen durch einen CONNECT-Tunnel.
Scrapys Standard-Download-Handler unterstützt HTTP-Proxies. Wenn SOCKS5 unbedingt benötigt wird, ist ein separater Handler erforderlich. Wir empfehlen daher für Scrapy den HTTP-Port derselben IP zu verwenden - die sichtbare IP ist identisch.
Beispiel mit IP 198.51.100.23, HTTP-Port 8000, Benutzername spx_user, Passwort spx_pass.
pip install scrapy
scrapy startproject shop
cd shopWie füge ich einer Anfrage einen Proxy hinzu?
Fügen Sie proxy in Request.meta (start_requests). Für Session-Konsistenz übernehmen Sie proxy-Wert aus vorheriger Response.meta.
import scrapy
PROXY = "http://spx_user:spx_pass@198.51.100.23:8000"
class IpCheckSpider(scrapy.Spider):
name = "ip_check"
def start_requests(self):
yield scrapy.Request("https://api.ipify.org?format=json", meta={"proxy": PROXY})
def parse(self, response):
self.logger.info("seen as %s", response.json()["ip"])Wie rotiere ich die IP pro Anfrage?
Ein Downloader-Middleware, das jedem Request den nächsten Proxy zuweist, ermöglicht Rotation ohne Codeänderungen. Diese Middleware lädt die Liste beim Start per API und behält vorhandene proxy-meta bei für Session-Persistenz mit Rotation.
Speichern Sie den API-Schlüssel in settings.py oder lesen Sie ihn aus Umgebungsvariablen. Registrieren Sie ihn mit einer Zahl, die kleiner ist als die Standard-HttpProxyMiddleware(750), damit die von der Middleware eingefügte Adresse von der Standard-Middleware verarbeitet wird.
import itertools
import requests
class RotatingProxyMiddleware:
def __init__(self, key):
text = requests.get(
"https://socks5proxy.io/api/v1/proxies/download",
params={"format": "user:pass@ip:port", "protocol": "http"},
headers={"Authorization": "Bearer " + key},
timeout=30,
).text
self.pool = itertools.cycle(["http://" + l.strip() for l in text.splitlines() if l.strip()])
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.get("SPX_API_KEY"))
def process_request(self, request, spider):
if "proxy" not in request.meta: # keep a proxy that was set on purpose (sticky sessions)
request.meta["proxy"] = next(self.pool)SPX_API_KEY = "YOUR_API_KEY"
DOWNLOADER_MIDDLEWARES = {
"shop.middlewares.RotatingProxyMiddleware": 740,
}
CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 16
DOWNLOAD_DELAY = 0.25
AUTOTHROTTLE_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504, 522, 524, 408]
DOWNLOAD_TIMEOUT = 30Wie optimiere ich Geschwindigkeit und Wiederholungsversuche?
CONCURRENT_REQUESTS_PER_DOMAIN ist die Anzahl der gleichzeitigen Anfragen, die an dieselbe Domain gesendet werden können. Je mehr Proxy-IPs Sie haben, desto höher können Sie diesen Wert setzen, ohne die Belastung einer einzelnen IP zu erhöhen. Beispielsweise werden bei 500 IPs und 50 gleichzeitigen Anfragen jede IP im Durchschnitt nur einmal pro 10 Anfragen verwendet.
Wenn Sie AUTOTHROTTLE aktivieren, wird das Anfrageintervall automatisch an die Antwortgeschwindigkeit angepasst. Wenn 429-Antworten zunehmen, können Sie mit RETRY_HTTP_CODES erneut versuchen, aber Sie können auch die Proxy-Einstellung in der Meta-Daten löschen, damit die Middleware den nächsten Proxy verwendet.
Eine Pipeline-Prüfung auf echte Seiten (keine Bestätigungsbildschirme) verbessert Datenqualität. Fehlende Elemente? Neue Anfrage mit anderer IP.
- Passen Sie die Anzahl der gleichzeitigen Anfragen pro Domain entsprechend der Anzahl der IPs an.
- AUTOTHROTTLE für Antwortgeschwindigkeit angepasste Intervalle
- 429 und 5xx: Mit einer anderen IP erneut versuchen
- CAPTCHAs durch Antwortprüfung filtern
Was ändert sich, wenn Sie sich über die IP-Autorisierung verbinden?
Wenn Sie die IPv4-Adresse des Servers, auf dem Scrapy ausgeführt wird, im Dashboard registrieren, können Sie die Proxy-Adresse wie http://198.51.100.23:8000 ohne Benutzername und Passwort verwenden. Sie können die Liste auch im Format ip:port erhalten. Wenn Sie Spider auf mehreren Servern ausführen, registrieren Sie bitte die IP-Adressen aller Server. Sie können bis zu 10 IPs registrieren.
Wie bindet man Anfragen, die Sitzungen erfordern, an eine IP?
Für Login-/Warenkorb-Flows mit Cookies: Tragen Sie den Proxy direkt in meta ein und übergeben Sie response.meta['proxy'] im Callback. Scrapy's cookiejar trennt Cookies pro Session.
Wenn Sie einer Sitzung einen Proxy und einen Cookie-Satz zuordnen, können Sie mehrere Sitzungen gleichzeitig ausführen, ohne dass sie sich vermischen.
import scrapy
PROXIES = [
"http://spx_user:spx_pass@198.51.100.23:8000",
"http://spx_user:spx_pass@198.51.100.24:8000",
]
class SessionSpider(scrapy.Spider):
name = "sessions"
def start_requests(self):
for i, proxy in enumerate(PROXIES):
yield scrapy.Request("https://example.com/", meta={"proxy": proxy, "cookiejar": i}, dont_filter=True)
def parse(self, response):
# follow-up request keeps the same proxy and the same cookie jar
yield response.follow("/account", meta={"proxy": response.meta["proxy"], "cookiejar": response.meta["cookiejar"]}, callback=self.parse_account)
def parse_account(self, response):
self.logger.info("status %s via %s", response.status, response.meta["proxy"])Wie pausiere ich fehlerhafte Proxys?
Wenn Sie in der process_response-Middleware eine 403- oder 429-Antwort erhalten, können Sie den Proxy für einige Minuten pausieren und die Anfrage mit einem anderen Proxy wiederholen. Entfernen Sie den Proxy aus den Meta-Daten, aktivieren Sie dont_filter und geben Sie die Anfrage zurück, damit der nächste Proxy übernimmt.
Verwalten Sie Pausenlisten mit Wiederverwendungszeiten - so vermeiden Sie Website-Beschränkungen.
Welche Einstellungen sparen in Scrapy Bandbreite?
Scrapy lädt standardmäßig nur HTML und verbraucht daher viel weniger Bandbreite als Browser-Tools. Mit der standardmäßig aktiven HttpCompressionMiddleware wird die Datenmenge weiter reduziert. Daher können Sie mit einem Shared-Plan viele Seiten sammeln.
Aktivieren Sie HTTPCACHE_ENABLED während der Entwicklung, um doppelte Anfragen zu vermeiden. In Produktion bleibt Deduplizierung aktiv, und dont_filter wird nur für notwendige Anfragen verwendet.
Es ist wichtig, den Umfang der Links, denen Sie folgen, zu begrenzen, um unnötige Unterseiten zu vermeiden. Eine klare Definition des Sammelbereichs reduziert Zeit, Bandbreite und die Belastung der Zielseite.
Wie löse ich häufige Probleme?
Wenn eine 407-Antwort erscheint, überprüfen Sie den Benutzernamen und das Passwort in der Adresse. Wenn das Passwort Sonderzeichen enthält, müssen Sie es URL-kodieren. TunnelError bedeutet, dass der Proxy die CONNECT-Anforderung nicht erhalten hat. Überprüfen Sie, ob der Port der HTTP-Port ist.
Wenn alle Anfragen dieselbe IP nutzen, liegt die Middleware-Reihenfolge hinter HttpProxyMiddleware oder der Spider setzt meta proxy direkt. Prüfen Sie die Reihenfolge in settings.py und Spider-Code.