Python requests-Proxy-Einstellungen, Verbinden von SOCKS5- und HTTP-Proxys
Diese Anleitung erklärt Schritt für Schritt die Verbindung von Socks5Proxy-HTTP- und SOCKS5-Proxys mit Python requests, Authentifizierung, Listenrotation und Wiederholungscode.
Was muss vorbereitet werden?
Sie benötigen Python 3.8 oder höher und die requests-Bibliothek. Um SOCKS5 zu verwenden, müssen Sie das SOCKS-Support-Paket installieren. Wenn Sie requests[socks] installieren, wird PySocks mitinstalliert, sodass Sie socks5- und socks5h-Adressen verwenden können.
Proxy-Informationen finden Sie im Dashboard unter "Meine Proxys". Beispiel: IP 198.51.100.23, HTTP-Port 8000, SOCKS5-Port 1080, Benutzername spx_user, Passwort spx_pass. Ersetzen Sie diese mit Ihren Werten.
pip install "requests[socks]"Wie verbinde ich mich mit einem HTTP-Proxy?
requests nutzt proxies-Dictionary für HTTP/HTTPS-Verkehr. Wichtig: https-Schlüssel nicht vergessen, sonst umgeht HTTPS-Traffic den Proxy.
HTTPS-Anfragen verwenden die CONNECT-Methode, um den Proxy zu durchlaufen, wobei der Inhalt von Anfang bis Ende verschlüsselt bleibt. Der folgende Code sendet eine Anfrage an eine IP-Überprüfungsadresse und überprüft, ob die Proxy-IP in der Antwort angezeigt wird.
import requests
proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json()) # the "ip" field should show the proxy IPWie verbinde ich mich mit einem SOCKS5-Proxy?
Wir empfehlen, Adressen mit socks5h zu beginnen. socks5h führt die DNS-Auflösung auf der Proxy-Seite durch, sodass Ihre DNS-Anfragen nicht sichtbar sind und die Auflösung basierend auf dem Proxy-Land erfolgt. Bei socks5 wird die Auflösung lokal durchgeführt und nur die IP wird über den Proxy gesendet.
Verwenden Sie den SOCKS5-Port. HTTP-Ports funktionieren nicht mit SOCKS5-Adressen.
import requests
proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())Wie kann ich Anfragen mit mehreren Proxys rotieren?
Bei umfangreichem Scraping rotieren Sie idealerweise durch eine Proxy-Liste. Dieser Code holt SOCKS5-Proxys per API, rotiert bei Fehlern (max. 3 Retries) und fügt Delays ein, um Domänen nicht zu überlasten.
Statt fehlerhafte Proxys sofort zu verwerfen, pausieren Sie sie kurz. Oft liegen temporäre Fehler an der Zielseite.
import itertools
import time
import requests
API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"
lines = requests.get(
API + "/proxies/download",
params={"format": "user:pass@ip:port", "protocol": "socks5"},
headers={"Authorization": "Bearer " + KEY},
timeout=30,
).text.split()
pool = itertools.cycle(lines)
def fetch(url, tries=3):
for _ in range(tries):
p = "socks5h://" + next(pool)
try:
r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
if r.status_code == 200:
return r.text
except requests.RequestException:
pass
time.sleep(1)
return None
for page in range(1, 6):
html = fetch("https://example.com/list?page=" + str(page))
print(page, "ok" if html else "failed")
time.sleep(0.5)Wie behält man Sitzungen und Cookies bei?
Für Cookie-basierte Flows (Login/Pagination): Fixieren Sie einen Proxy pro requests.Session. session.proxy = {'http': proxy_url} sendet alle Anfragen über dieselbe IP. Nach Abschluss: Session schließen, neue starten.
Wenn Sie pro Sitzung auch den User-Agent und den Accept-Language-Header festlegen, bleibt das Erscheinungsbild auf der Zielwebsite konsistent.
import requests
s = requests.Session()
s.proxies = {
"http": "http://spx_user:spx_pass@198.51.100.23:8000",
"https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})
s.get("https://example.com/", timeout=20) # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20) # same IP, same cookies
print(r.status_code)
s.close()Wie verwendet man die IP-Autorisierung für die Verbindung?
Wenn Sie die IPv4-Adresse des Servers, auf dem dieser Code ausgeführt wird, im Dashboard registrieren, können Sie die Adresse ohne Benutzername und Passwort verwenden. Da Sie das Passwort nicht im Code oder in Konfigurationsdateien speichern müssen, ist die Bereitstellung des gleichen Codes auf mehreren Servern einfacher. Sie können die Liste auch im Format ip:port erhalten.
import requests
proxy = "http://198.51.100.23:8000" # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)Wie kann ich mehrere Anfragen gleichzeitig schnell senden?
requests arbeitet synchron. Für schnelles Scraping verwenden Sie concurrent.futures.ThreadPoolExecutor. Halten Sie die Threadanzahl unter der Proxy-Anzahl für gleichmäßige Lastverteilung.
Der folgende Code teilt eine Adressliste auf 20 Worker auf und wählt für jede Aufgabe den nächsten Proxy aus der Liste. itertools.cycle kann auch in mehreren Threads problemlos verwendet werden, aber für eine genaue Reihenfolge sollte eine Sperre verwendet werden.
import itertools
from concurrent.futures import ThreadPoolExecutor
import requests
lines = open("proxies.txt").read().split() # user:pass@ip:port per line
pool = itertools.cycle(lines)
def get(url):
p = "http://" + next(pool)
try:
return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
except requests.RequestException as e:
return url, type(e).__name__
urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
for url, result in ex.map(get, urls):
print(url, result)Funktioniert das auch mit asynchronen Bibliotheken wie httpx oder aiohttp?
Ja. httpx erwartet die Proxy-Adresse im proxy-Parameter beim Client-Setup. Für SOCKS5 installieren Sie httpx[socks]. Der AsyncClient akzeptiert dieselben Parameter.
aiohttp fügt für jede Anfrage die HTTP-Proxy-Adresse in das proxy-Argument und übergibt aiohttp.BasicAuth an proxy_auth. Da aiohttp SOCKS standardmäßig nicht unterstützt, muss für SOCKS5 das aiohttp-socks-Paket verwendet werden.
Asynchrone Verarbeitung ermöglicht tausende gleichzeitige Anfragen mit geringen Ressourcen. Begrenzen Sie die Parallelität mit asyncio.Semaphore, um Überlastung zu vermeiden.
import httpx
with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
print(client.get("https://api.ipify.org").text)Wie behebe ich häufige Fehler?
Der Fehler "Missing dependencies for SOCKS support" bedeutet, dass requests[socks] nicht installiert ist. Bitte installieren Sie es erneut in der gleichen virtuellen Umgebung.
407 Proxy Authentication Required bedeutet, dass der Benutzername oder das Passwort falsch ist oder dass die IP-Autorisierung verwendet wird, aber die Server-IP nicht registriert ist. Wenn das Passwort Sonderzeichen enthält, müssen Sie es mit urllib.parse.quote kodieren.
Zeitüberschreitungen bei der Verbindung treten meistens auf, wenn der Port nicht passt. Stellen Sie sicher, dass Sie den HTTP-Port für HTTP-Adressen und den SOCKS5-Port für socks5h-Adressen verwenden. Das Setzen eines timeout-Werts verhindert, dass nicht reagierende Anfragen den gesamten Job stoppen.
- SOCKS-Fehler: pip install "requests[socks]"
- 407: Benutzername/Passwort oder registrierte IP überprüfen
- Timeout: Unterscheidung zwischen HTTP- und SOCKS5-Port
- Timeout für alle Anfragen setzen