Kurzantwort
Wie verwende ich Proxys in Python?
Übergeben Sie eine Proxy-URL wie http://USERNAME-country-ae:[email protected]:7777 an Ihren HTTP-Client. Nameless Proxy, ein datenschutzorientierter Proxy-Anbieter ohne KYC, funktioniert mit requests, httpx, aiohttp und Scrapy sowie mit socks5h:// auf Port 7778. Targeting steckt im Benutzernamen. Residential-Traffic beginnt bei 0,53 $/GB. Ohne KYC — keine ID, kein Selfie, keine Dokumente. Mit Krypto bezahlen.
Python-Setup auf einen Blick
| Proxy-URL | http://USER-country-xx:[email protected]:7777 |
|---|---|
| SOCKS5 | socks5h://…:7778 mit requests[socks] |
| requests | proxies={"http": url, "https": url} |
| httpx 0.26+ | httpx.Client(proxy=url) und httpx.AsyncClient(proxy=url) |
| aiohttp | session.get(url, proxy=proxy_url) (HTTP Residential-Proxys) |
| Scrapy | request.meta["proxy"], eingestellt durch eine Downloader-Middleware |
| Sticky IP | Füge -session-{id}-ttl-{minutes} nach der Stadt hinzu, für bis zu 60 Minuten |
Wie nutze ich einen Residential-Proxy mit requests?
Gib requests für beide Schlüssel http und https dieselbe Proxy-URL. HTTPS-Ziele laufen über einen CONNECT-Tunnel, sodass die TLS-Verbindung zwischen deinem Skript und der Website bleibt. Setze immer ein Timeout.
# pip install requests
import requests
USERNAME = "USERNAME" # base proxy username from the client area
PASSWORD = "PASSWORD" # proxy password (not your account password)
HOST = "gw.namelessproxy.com"
HTTP_PORT = 7777
SOCKS_PORT = 7778
proxy = f"http://{USERNAME}-country-ae:{PASSWORD}@{HOST}:{HTTP_PORT}"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
print(r.json()) # {'ip': '...'}Wie erstelle ich gezielte und Sticky Residential-Proxy-URLs?
Verwende einen Helfer für jede Bibliothek. Der Benutzername folgt USERNAME-country-{cc}-city-{city}-session-{id}-ttl-{minutes}, daher fügt der Helfer die Teile in dieser Reihenfolge hinzu: Land, dann Stadt, dann Session und TTL. Ohne Session erhältst du eine rotierende IP; mit Session bleibt die IP gleich, solange die TTL gilt.
import uuid
def proxy_url(country, city=None, session=None, ttl=30, scheme="http"):
"""Build a gateway URL. Targeting lives in the username, in this order:
country -> city -> session -> ttl."""
user = f"{USERNAME}-country-{country.lower()}"
if city:
user += f"-city-{city.lower().replace(' ', '_')}"
if session:
user += f"-session-{session}-ttl-{ttl}"
port = SOCKS_PORT if scheme.startswith("socks") else HTTP_PORT
return f"{scheme}://{user}:{PASSWORD}@{HOST}:{port}"
def new_session():
"""A fresh session ID = a fresh sticky IP."""
return uuid.uuid4().hex[:10]
# Rotating IP in Egypt, and a sticky IP in Abu Dhabi for 30 minutes
rotating = proxy_url("eg")
sticky = proxy_url("ae", city="Abu Dhabi", session=new_session(), ttl=30)Wie nutze ich SOCKS5 in Python?
Installiere das SOCKS-Extra und verwende das socks5h://-Schema. Der h lässt den Proxy Hostnamen auflösen, sodass DNS-Abfragen ebenfalls im Zielland ausgeführt werden. Einfaches socks5:// löst DNS auf deinem Gerät auf.
# pip install "requests[socks]"
# socks5h:// = the proxy resolves DNS, so lookups also exit in the target country
proxy = proxy_url("ke", scheme="socks5h")
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=30)
print(r.text)Wie wiederhole ich fehlgeschlagene Anfragen mit neuer IP?
Wiederhole bei Verbindungsfehlern und bei 429- und 5xx-Antworten mit exponentiellem Backoff und etwas zufälliger Verzögerung. Mit rotierendem Benutzernamen kann jede neue Verbindung über eine neue IP laufen, sodass ein Retry auch eine frische IP bedeutet. Für Sticky-Arbeit starte eine neue Session-ID, wenn eine IP fehlschlägt.
import random
import time
RETRY_STATUS = {429, 500, 502, 503, 504}
def fetch(url, country="ae", attempts=4):
"""Retry with exponential backoff. Each attempt opens a new connection,
so a rotating username exits from a new IP."""
for attempt in range(attempts):
proxy = proxy_url(country)
try:
r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
if r.status_code not in RETRY_STATUS:
return r
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
pass # ProxyError is a ConnectionError: retry on a new IP
time.sleep(min(2 ** attempt + random.random(), 30))
raise RuntimeError(f"Giving up on {url} after {attempts} attempts")Wie nutze ich httpx, synchron und asynchron?
Seit httpx 0.26 nimmt ein Client ein einzelnes proxy=-Argument; das alte proxies= wurde in 0.28 entfernt. Ein Client hält Verbindungen offen, und Anfragen über eine offene Verbindung teilen sich eine Exit-IP. Öffne einen neuen Client oder nutze gezielt eine Sticky-Session, je nachdem, was du brauchst.
# pip install httpx (0.26 or later: the argument is "proxy", not "proxies")
import asyncio
import httpx
# Sync: one sticky IP in Nairobi for 10 minutes
with httpx.Client(proxy=proxy_url("ke", city="nairobi", session=new_session(), ttl=10), timeout=30) as client:
print(client.get("https://api.ipify.org").text)
# Async: 20 connections at most, rotating IPs in Nigeria
async def main(urls):
limits = httpx.Limits(max_connections=20)
async with httpx.AsyncClient(proxy=proxy_url("ng"), timeout=30, limits=limits) as client:
results = await asyncio.gather(*(client.get(u) for u in urls), return_exceptions=True)
for url, res in zip(urls, results):
print(url, res.status_code if isinstance(res, httpx.Response) else repr(res))
asyncio.run(main(["https://api.ipify.org"] * 5))Wie führe ich viele Anfragen mit aiohttp aus?
aiohttp verwendet den Residential Proxy pro Anfrage, mit den Zugangsdaten in der URL. Es werden nur HTTP-Proxys unterstützt; für SOCKS5 benötigen Sie ein zusätzliches Paket wie aiohttp-socks. Begrenzen Sie die Parallelität mit einem Semaphore: Starten Sie mit etwa 10 bis 20 parallelen Anfragen und erhöhen Sie diese, solange Ihre Fehlerrate niedrig bleibt.
# pip install aiohttp (HTTP proxies only; the credentials can sit in the proxy URL)
import asyncio
import aiohttp
async def fetch(session, url, sem):
async with sem:
async with session.get(url, proxy=proxy_url("eg")) as r:
return r.status, await r.text()
async def main(urls):
sem = asyncio.Semaphore(20) # concurrency cap
timeout = aiohttp.ClientTimeout(total=30)
async with aiohttp.ClientSession(timeout=timeout) as session:
results = await asyncio.gather(*(fetch(session, u, sem) for u in urls), return_exceptions=True)
print(results)
asyncio.run(main(["https://api.ipify.org"] * 5))Wie füge ich den Residential Proxy zu Scrapy hinzu?
Schreiben Sie eine kleine Downloader-Middleware, die request.meta["proxy"] setzt. Scrapy's eingebaute HttpProxyMiddleware wandelt dann die Zugangsdaten in einen Proxy-Authorization-Header um. Geben Sie Ihrer Middleware eine Nummer unter 750, damit sie zuerst ausgeführt wird. Pro-Anfrage Meta-Schlüssel erlauben einem Spider, Länder und Sticky Sessions zu mischen.
# myproject/middlewares.py
USERNAME = "USERNAME"
PASSWORD = "PASSWORD"
GATEWAY = "gw.namelessproxy.com:7777"
class NamelessProxyMiddleware:
"""Set the proxy per request from request.meta:
country (default 'ae'), optional city, optional session + ttl."""
def process_request(self, request, spider):
meta = request.meta
user = f"{USERNAME}-country-{meta.get('country', 'ae')}"
if meta.get("city"):
user += f"-city-{meta['city']}"
if meta.get("session"):
user += f"-session-{meta['session']}-ttl-{meta.get('ttl', 10)}"
# Scrapy's HttpProxyMiddleware turns the credentials into Proxy-Authorization
meta["proxy"] = f"http://{user}:{PASSWORD}@{GATEWAY}"# myproject/settings.py
DOWNLOADER_MIDDLEWARES = {
# Below 750 so it runs before Scrapy's built-in HttpProxyMiddleware
"myproject.middlewares.NamelessProxyMiddleware": 350,
}
CONCURRENT_REQUESTS = 16
DOWNLOAD_TIMEOUT = 30
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504, 408]
AUTOTHROTTLE_ENABLED = True
ROBOTSTXT_OBEY = True
# In a spider:
# yield scrapy.Request(url, meta={"country": "sa", "city": "riyadh", "session": "cart01"})Häufig gestellte Fragen
Warum erhalte ich in Python einen 407 oder ProxyError?
Ein 407 bedeutet, dass das Gateway die Zugangsdaten abgelehnt hat. Überprüfen Sie den Basis-Benutzernamen und das Proxy-Passwort im Kundenbereich, die Reihenfolge der Zielteile und Sonderzeichen im Passwort, die URL-codiert sein müssen. Ein ProxyError ohne 407 bedeutet meist falschen Port oder Firewall. Testen Sie dieselbe URL mit curl aus der Schnellstart-Anleitung.
Warum ändert sich meine IP zwischen den Anfragen nicht?
Ihr Client verwendet wahrscheinlich eine Keep-Alive-Verbindung erneut. Ein requests.Session, ein httpx Client oder eine aiohttp Session hält Verbindungen offen, und eine Verbindung nutzt eine Exit-IP. Für eine neue IP pro Anfrage rufen Sie requests.get ohne Session auf oder öffnen einen neuen Client. Wenn Sie eine Session-ID hinzugefügt haben, ist die IP absichtlich sticky.
Soll ich requests, httpx oder aiohttp verwenden?
Verwenden Sie requests für einfache Skripte und kleine Aufgaben. Nutzen Sie httpx, wenn Sie eine Bibliothek für synchronen und asynchronen Code oder HTTP/2 wollen. aiohttp eignet sich für große asynchrone Crawls, bei denen Sie die Parallelität selbst steuern. Scrapy verwenden Sie, wenn Sie einen vollständigen Crawler mit Scheduling, Wiederholungen und Pipelines brauchen. Alle vier funktionieren mit derselben Proxy-URL.
Kann ein Skript mehrere Länder gleichzeitig nutzen?
Ja. Das Targeting ist Teil jeder Proxy-URL, bauen Sie also pro Anfrage oder Client eine andere URL: proxy_url("ae") für die VAE und proxy_url("ng") für Nigeria zum Beispiel. Der Traffic wird vom selben Guthaben abgebucht, egal welches Land, und der Preis pro GB ändert sich nicht nach Land.
Wie viel Traffic verbraucht ein Scraper?
Das hängt von den Seiten ab: Eine HTML-Seite ist oft einige zehn bis hunderte Kilobyte groß, während Bilder und Skripte viel mehr hinzufügen. Traffic wird in dezimalen GB gezählt (1 GB = 1.000.000.000 Bytes), und der Kundenbereich zeigt die tägliche Nutzung pro Abo und Sub-User. Laden Sie nur, was Sie parsen, und überspringen Sie Bilder, um Kosten zu sparen.
Funktioniert der Python-Code mit dedizierten mobilen 4G-Ports?
Ja, mit dem eigenen Host, Port, Benutzernamen und Passwort des Ports aus dem Kundenbereich statt der Gateway-Werte. Das Land und der Carrier eines dedizierten Ports werden bei der Anmietung gewählt und können später geändert werden. Um die IP aus Python zu wechseln, siehe die mobile IP-Rotationsanleitung.
Führen Sie Ihren Python-Code über Residential-Proxys aus
Ab 0,53 $/GB, mit Krypto bezahlen. Ohne KYC — keine ID, kein Selfie, keine Dokumente.