Fast jedes Scraping-Framework erlaubt es, einen Proxy zu setzen. Deutlich weniger verwalten Proxys auch für Sie: sie rotieren sie, ziehen gesperrte aus dem Verkehr und halten eine Session auf einer IP. Wenn Sie residential proxies verwenden, spart es viel Klebe-Code zu wissen, welchen Teil das Framework übernimmt und welchen das Gateway.
Dieser Leitfaden vergleicht sechs gängige Tools anhand von drei Fragen: wie Sie den Proxy setzen, ob das Tool selbst Proxys rotiert und ob es eine Session an einen Proxy bindet. Anschließend zeigt er, wie wenig Code jedes davon hinter einem rotierenden Gateway benötigt.
Die kurze Antwort
| Tool | Sprache | Wie Sie den Proxy setzen | Rotiert von selbst | Bindet eine Session an einen Proxy |
|---|---|---|---|---|
| Crawlee | Node.js | ProxyConfiguration | Ja: Round Robin, eigene Funktion, Stufen | Ja, über seinen Session-Pool |
| Scrapy | Python | request.meta["proxy"] oder Umgebungsvariablen | Nein, benötigt eigene Middleware | Nein |
| Colly | Go | SetProxy oder SetProxyFunc | Ja: Round-Robin-Switcher | Nein |
| Playwright | Node.js, Python, Java, .NET | Beim Start oder pro Browser-Kontext | Nein | Pro Kontext |
| Puppeteer | Node.js | Start-Flag oder pro Browser-Kontext | Nein | Pro Kontext |
| Selenium | Viele | Browserweite Option | Nein | Nein |
Crawlee ist das einzige Tool, das Proxys als etwas behandelt, das verwaltet werden muss, statt als bloße Einstellung. Die Browser-Tools bieten Isolation pro Kontext, was der Baustein für Sessions ist, aber die Rotationslogik liegt bei Ihnen.
Crawlee: Proxys als verwaltete Ressource
Crawlees ProxyConfiguration nimmt eine Liste von Proxy-URLs entgegen und rotiert durch sie “in a round-robin fashion”. Statt einer Liste können Sie eine Funktion übergeben, die den Proxy für jede Anfrage auswählt. Ein dritter Modus, gestufte Proxys, beginnt mit der günstigsten Stufe (oft gar kein Proxy), wechselt eine Stufe höher, wenn eine Website den Crawler blockiert, und fällt zurück, sobald die niedrigere Stufe wieder funktioniert.
Der wichtigste Teil sind Sessions. Wenn der Crawler mit seinem Session-Pool läuft, behält jede Session denselben Proxy: in den Worten der Dokumentation geben spätere Aufrufe “with the same sessionId” immer dieselbe “proxyUrl” zurück. Wenn Crawlee entscheidet, dass eine Session blockiert ist, zieht es sie zurück, und die nächste Session erhält einen anderen Proxy. Cookies folgen der Session, sodass IP und Cookies zusammenbleiben.
Scrapy: ein Proxy pro Anfrage, Rotation liegt bei Ihnen
Scrapys HttpProxyMiddleware liest den Proxy aus request.meta["proxy"] und greift sonst auf die Umgebungsvariablen http_proxy und https_proxy zurück. Zugangsdaten können in der URL stehen, wie in http://username:password@host:port. Das ist alles, was sie tut. Für jede Anfrage einen anderen Proxy auszuwählen, Sperren zu erkennen und tote Proxys ruhen zu lassen, bleibt Ihnen überlassen oder einer Erweiterung wie scrapy-rotating-proxies, die eine Liste von Proxys einliest und standardmäßig Antworten ohne 200 oder leere Antworten als Sperren behandelt.
Unser Scrapy-Integrationsleitfaden deckt die Grundeinrichtung ab, und der Beitrag über rotierende residential proxies in Scrapy geht tiefer auf Middleware ein.
Colly: ein einfacher Round-Robin-Switcher
Colly, das Go-Framework, hat SetProxy für einen Proxy und SetProxyFunc für eine Funktion, die pro Anfrage einen auswählt. Sein proxy-Paket enthält RoundRobinProxySwitcher, das “rotates ProxyURLs on every request” und http-, https- und socks5-URLs akzeptiert. Es gibt kein Session-Konzept: Wenn zwei Anfragen sich eine IP teilen müssen, entscheiden Sie das in Ihrer eigenen Funktion.
Playwright und Puppeteer: Isolation pro Kontext
Browser-Automatisierungstools rotieren nichts, aber sie erlauben jedem Browser-Kontext, seinen eigenen Proxy zu verwenden, womit Sie viele separate Sessions in einem Browser betreiben können.
- Playwright nimmt eine
proxy-Option mitserver,usernameundpassword, entweder beim Start für den gesamten Browser oder beinewContext()für einen einzelnen Kontext. Siehe unseren Playwright-Integrationsleitfaden für die vollständige Einrichtung. - Puppeteer setzt einen Proxy mit dem Start-Flag
--proxy-serveroder pro Kontext mitcreateBrowserContext({ proxyServer }). Keines von beiden nimmt Zugangsdaten entgegen: Sie beantworten die Login-Abfrage des Proxys mitpage.authenticate().
Geben Sie jedem Kontext seine eigene Session, und Sie erhalten eine IP und ein Cookie-Set pro Kontext, was ein eingeloggter Ablauf benötigt.
Selenium: browserweit, und umständlich bei Passwörtern
Selenium setzt den Proxy über Browser-Optionen, sodass er für den gesamten Browser gilt. Bei Chrome ist der übliche Weg der Schalter --proxy-server, der keinen Platz für Benutzername und Passwort bietet. Die üblichen Umgehungen sind eine kleine Browser-Erweiterung, die die Login-Abfrage beantwortet, oder ein lokaler Weiterleitungsproxy ohne Passwort, der den Traffic mit Zugangsdaten an Ihren Anbieter weiterreicht. Selenium Wire, einst die beliebte Lösung, wurde im Januar 2024 archiviert und wird nicht mehr gepflegt.
Was ein rotierendes Gateway ändert
Framework-Rotation wurde für Proxy-Listen entwickelt: hundert IP:Port-Paare, die Sie durchlaufen, testen und aussortieren. Ein rotierendes residential Gateway arbeitet anders. Sie verbinden sich mit einem Host und Port, und das Gateway wählt die Austritts-IP. Das verlagert den größten Teil der Arbeit aus Ihrem Code heraus:
- Rotation geschieht am Gateway, sodass eine einzige Proxy-URL ausreicht. Eine Round-Robin-Liste mit einem Eintrag ist nur eine Einstellung.
- Sessions werden über den Benutzernamen angefordert. Bei Shifter fügen Sie
sid-<id>hinzu, um eine Austritts-IP beizubehalten, undttl-<seconds>, um festzulegen, wie lange sie gehalten werden soll, wie in sticky vs. rotierende Proxys erklärt. - Standort ist ebenfalls Teil des Benutzernamens, sodass ein Crawler pro Anfrage ein Land oder eine Stadt ansteuern kann, ohne eine zweite Proxy-Liste.
Damit schrumpft die Aufgabe des Frameworks auf eine Sache: die eigene Vorstellung von einer Session auf die Session-ID im Proxy-Benutzernamen abzubilden.
Die Verdrahtung
Crawlee. Übergeben Sie eine Funktion, die den Benutzernamen aus Crawlees Session-ID aufbaut. Session-IDs können Zeichen wie Unterstriche enthalten, also behalten Sie nur Buchstaben und Ziffern:
import { CheerioCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfiguration = new ProxyConfiguration({
newUrlFunction: (sessionId) => {
const sid = sessionId
? `-sid-${String(sessionId).replace(/[^a-zA-Z0-9]/g, '')}-ttl-600`
: '';
return `http://customer-USERNAME${sid}:PASSWORD@p.shifter.io:443`;
},
});
const crawler = new CheerioCrawler({
proxyConfiguration,
useSessionPool: true,
persistCookiesPerSession: true,
async requestHandler({ request, $ }) {
console.log(request.url, $('title').text());
},
});
await crawler.run(['https://example.com/']);
Wenn Crawlee eine blockierte Session zurückzieht, liefert die nächste Session-ID von selbst eine neue sticky IP.
Scrapy. Eine kleine Downloader-Middleware setzt den Proxy, bevor Scrapys eigene Proxy-Middleware läuft. Anfragen, die einen session-Wert in meta tragen, teilen sich eine IP, der Rest rotiert:
# middlewares.py
class GatewayProxyMiddleware:
def process_request(self, request, spider):
sid = request.meta.get("session")
user = "customer-USERNAME"
if sid:
user += f"-sid-{sid}-ttl-600"
request.meta["proxy"] = f"http://{user}:PASSWORD@p.shifter.io:443"
# settings.py
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.GatewayProxyMiddleware": 350,
}
Playwright. Ein Kontext pro Session:
const context = await browser.newContext({
proxy: {
server: 'http://p.shifter.io:443',
username: 'customer-USERNAME-sid-cart1-ttl-600',
password: 'PASSWORD',
},
});
Welches Tool wählen
Wählen Sie das Framework nach der Website und dem Team, nicht nach seinen Proxy-Funktionen. Crawlee ist die stärkste Wahl, wenn Sie Blockierung, Sessions und Proxy-Stufen in Node.js für sich erledigt haben möchten. Scrapy bleibt der schnellste Weg, um große Mengen einfacher HTML-Seiten in Python zu crawlen, und seine Proxy-Lücke ist eine zehnzeilige Middleware. Playwright oder Puppeteer sind die richtigen Werkzeuge, wenn Seiten einen echten Browser brauchen, und Kontexte liefern Ihnen saubere Sessions. Selenium funktioniert ebenfalls, mit mehr Aufwand rund um Zugangsdaten.
Hinter einem rotierenden Gateway reduzieren sich alle sechs auf dasselbe Muster: eine Proxy-URL und eine Session-ID im Benutzernamen überall dort, wo Anfragen sich eine IP teilen müssen. Mehr dazu, wie man dies in einen Produktions-Crawler einbaut, finden Sie in unserem Web-Scraping-Anwendungsfall.
Quellen und Referenzen
- Crawlee, Leitfaden zum Proxy-Management: crawlee.dev
- Scrapy, Referenz zur Downloader-Middleware (HttpProxyMiddleware): docs.scrapy.org
- scrapy-rotating-proxies: github.com
- Colly, Proxy-Paket: pkg.go.dev
- Playwright, Netzwerk und HTTP-Proxy: playwright.dev
- Puppeteer, BrowserContextOptions: pptr.dev
- Selenium-Wire-Repository (archiviert am 3. Januar 2024): github.com