Patchright Proxy Setup: Start, Contexten, Authenticatie en Docker

Patchright dicht de CDP-lekken die Playwright blootlegt voordat de browser start. Het tast je IP-reputatie niet aan — en de aanbevolen stealth-instelling verandert stilletjes hoe je proxies roteert.

Patchright is een gepatchte, onopgemerkte versie van Playwright die werkt als een drop-in vervanging: verander de import, behoud de code. De patches worden toegepast voordat het browserproces start — ze verwijderen de automatiseringsvlaggen en de Chrome DevTools Protocol-aanroepen die een site in staat stellen een Playwright-sessie in de eerste paar milliseconden te fingerprinten. Wat ze niet aanraken is het netwerk. Elke Patchright proxyvraag komt terug op die splitsing, en op één detail dat de README verbergt: de opstelling die het project aanbeveelt voor maximale stealth is een persistent context, wat stilletjes verandert hoe je exits roteert. Dit is de proxy-gerichte gids — start versus context, geauthenticeerde gateways, Docker, en een eerlijke beschrijving van het plafond.

Installatie en de drop-in proxy

Patchright wordt geleverd voor Python, Node en .NET, en patcht alleen Chromium — Firefox en WebKit worden expliciet niet ondersteund. Installeer het en haal echte Google Chrome in plaats van de meegeleverde Chromium, wat het project aanbeveelt voor stealth:

pip install patchright
patchright install chrome
# Node: npm i patchright && npx patchright install chrome

De proxy-API is die van Playwright, ongewijzigd, omdat proxies een van de weinige dingen zijn die Patchright bewust met rust laat. Inloggegevens gaan in speciale velden, nooit in de server-URL — daarom hebben geauthenticeerde proxies hier geen extensieshim nodig, in tegenstelling tot Selenium of ruwe Puppeteer:

from patchright.sync_api import sync_playwright

PROXY = {
    "server": "http://gate.quantumproxies.io:PORT",
    "username": "USER",
    "password": "PASS",
}

with sync_playwright() as p:
    browser = p.chromium.launch(channel="chrome", proxy=PROXY)
    page = browser.new_page()
    page.goto("https://httpbin.org/ip")
    print(page.text_content("body"))   # the exit IP
    browser.close()

Dat is het hele "ondersteunt Patchright proxies"-antwoord: ja, identiek aan upstream Playwright, inclusief de bypass-lijst en de Chromium-kronkel dat loopback-adressen de proxy volledig overslaan — dus testen tegen een lokale mock-server zal altijd lijken alsof de proxy wordt genegeerd. Als je nieuw bent in het onderliggende model, behandelt onze Playwright proxy-integratiegids het basisgedrag, en vergelijkt de anti-detect framework proxy map welke stacks inloggegevens native accepteren.

Per-context proxies en de globale stub

Contexten zijn de goedkope rotatie-eenheid: aparte cookies, opslag en cache, gecreëerd in milliseconden in plaats van de seconden die een browserstart kost. Elk neemt zijn eigen proxy-optie, zodat één proces een Amerikaanse identiteit en een Duitse identiteit tegelijk kan bevatten. Er is één gedocumenteerde Playwright-valkuil die mensen hier in de problemen brengt — de browser moet worden gestart met een globale proxy voor per-context proxies om te werken op Chromium. Als elke context deze overschrijft, wordt de globale waarde nooit gebruikt en kan het elke tijdelijke string zijn:

const { chromium } = require('patchright');

(async () => {
  // the global proxy is never used — it only enables the per-context option
  const browser = await chromium.launch({
    channel: 'chrome',
    proxy: { server: 'http://per-context' },
  });

  for (const job of jobs) {
    const context = await browser.newContext({
      proxy: {
        server: 'http://gate.quantumproxies.io:PORT',
        username: 'USER-country-' + job.country,   // geo in the username
        password: 'PASS',
      },
    });
    const page = await context.newPage();
    try {
      await page.goto(job.url, { timeout: 30000 });
      // ...extract...
    } finally {
      await context.close();   // burns the cookies with the exit
    }
  }
  await browser.close();
})();

Gericht op een roterende gateway, vertrekt elke context vanaf een ander adres in een pool van meer dan 90 miljoen residentiële adressen zonder lijstbeheer aan jouw kant — dat is wat roterende proxies server-side doen. Let op waar de geo- en sessiecontroles zich bevinden in dat fragment: in de gebruikersnaam, niet in een aangepaste header. Dat is belangrijker in Patchright dan in gewone Playwright, omdat de eigen richtlijnen van het project zijn om aangepaste headers en user-agent overschrijvingen te vermijden, aangezien geïnjecteerde waarden zelf een detectieoppervlak zijn. Gebruikersnaam-parametercontrole houdt de vorm van het verzoek van de browser onaangetast.

Vergelijkingsdiagram van Patchright proxyconfiguratie bij start met per-context rotatie versus een persistent context met één proxy per proces
De afweging die niemand noemt: snelle rotatie leeft in contexten, maximale stealth leeft in een persistent profiel — en een persistent profiel heeft precies één context.

De persistent-context afweging

Patchright's aanbevolen stealth-configuratie is niet launch(). Het is launch_persistent_context() met een echt Chrome-kanaal, een gebruikersgegevensdirectory, geen viewport-overschrijving en headed-modus — en expliciet zonder aangepaste headers of een gespoofde user agent. Die opstelling behoudt ook alle vrijstellingscookies die een uitdaging je geeft, zodat een opgeloste uitdaging herbruikbaar is over runs. Het proxygevolg is structureel: een persistent context is de context. Er is geen newContext() om een tweede proxy aan op te hangen, dus één proces betekent één exit-identiteit.

from patchright.sync_api import sync_playwright

with sync_playwright() as p:
    ctx = p.chromium.launch_persistent_context(
        user_data_dir="profiles/it-01",   # one profile per identity
        channel="chrome",
        headless=False,
        no_viewport=True,
        proxy={
            "server": "http://gate.quantumproxies.io:PORT",
            "username": "USER-country-it-session-it01",   # sticky, pinned to the profile
            "password": "PASS",
        },
        # do NOT pass user_agent or extra_http_headers here
    )
    page = ctx.new_page()
    page.goto("https://example.com")
    ctx.close()

Dus rotatie wordt een procesniveau-beslissing: één profieldirectory per identiteit, één sticky sessie eraan gekoppeld, en een werkpool in plaats van een contextlus. Houd de koppeling stabiel — een profiel dat cookies heeft verzameld achter een Italiaanse exit en vervolgens opnieuw verschijnt achter een Braziliaanse is een tegenstrijdigheid die geen CDP-patch kan verbergen. Praktische regel: noem de directory naar de sessie-id, verwijder de directory wanneer je de sessie verbrandt, en deel nooit een profiel over twee exits.

Patchright in Docker achter een proxy draaien

Het containeriseren van een stealth-browser heeft twee valkuilen, en beide hebben proxygevolgen. De eerste is --no-sandbox: de gebruikelijke oplossing voor Chrome die weigert te starten als root, en een vlag die anti-bot-leveranciers graag lezen. Voer uit als een niet-root gebruiker in plaats daarvan. De tweede is headless-modus — het project beveelt headed aan, dus gebruik een virtueel display in plaats van de headless-schakelaar:

# Dockerfile
FROM python:3.12-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
      xvfb ca-certificates && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir patchright \
 && patchright install --with-deps chrome

RUN useradd -m app
USER app
WORKDIR /home/app
COPY --chown=app:app scrape.py .

# headed under a virtual display: no --no-sandbox, no HeadlessChrome tell
CMD ["xvfb-run", "-a", "python", "scrape.py"]

# build & run:
#   docker build -t patchright-worker .
#   docker run --ipc=host --shm-size=1g patchright-worker

De --ipc=host en grotere /dev/shm zijn de standaard Chromium-in-Docker oplossingen voor tab-crashes onder belasting, rechtstreeks uit de Playwright containerdocumentatie. Eén proxy-specifieke valkuil: als je een lokale relay draait om inloggegevens toe te voegen aan een SOCKS5-eindpunt, is 127.0.0.1 binnen de container de container, niet je host. Plaats de relay ofwel in dezelfde container, adresseer de host expliciet, of draai de relay als een sidecar op een gedeeld netwerk. En houd de profieldirectory op een volume als je persistente contexten gebruikt, anders gooit elke containerherstart de vrijstellingscookies weg waarvoor je bandbreedte hebt betaald.

Wat de patches dekken, en wat ze nooit zullen doen

Het is de moeite waard precies te weten wat je koopt. Patchright's belangrijkste oplossing is het Runtime.enable-lek — het voert JavaScript uit in geïsoleerde uitvoeringscontexten in plaats van het domein in te schakelen dat het spel weggeeft. Het schakelt de Console API uit om Console.enable te sluiten (dus page.on("console") logging verdwijnt, wat een echt nadeel is wanneer je een proxyfout aan het debuggen bent). Het herschrijft Playwright's standaardvlaggen: voegt --disable-blink-features=AutomationControlled toe, verwijdert --enable-automation, en zet --disable-popup-blocking, --disable-component-update, --disable-default-apps en --disable-extensions terug. Het bereikt ook gesloten schaduwwortels met gewone locators.

Lees die vlaggenlijst ook als een bandbreedte-item. Het herstellen van componentupdates en standaardapps betekent een browser die op de achtergrond naar huis belt — via je gemeten exit. Meet de overdracht van een sessie voordat je opschaalt, en blokkeer afbeelding-, lettertype- en mediaresource-typen op de context om de kosten per pagina laag te houden. Niets ervan raakt de andere muur: een gepatchte browser op een verbrande datacenter-IP is nog steeds een verbrande IP, en het verzoek wordt geweigerd op reputatie voordat een van deze slimheden wordt geëvalueerd. Controleer een adres met de gratis IP-kwaliteitschecker voordat je concludeert dat de patches hebben gefaald, en plaats residentiële proxies onder de browser zodat de twee lagen verschillende problemen oplossen.

Wanddiagram dat Patchright's CDP-patches toont die de automatiseringscontrole doorstaan, maar een gemarkeerde exit-IP die nog steeds wordt geblokkeerd op reputatie
Patches bepalen wat de browser over zichzelf zegt. Proxies bepalen waar het vandaan lijkt te komen. Het ene oplossen en het andere negeren eindigt nog steeds in een blokkade.

Veelgestelde vragen

Hoe stel ik een proxy in Patchright in?

Precies zoals in Playwright: geef proxy={"server": "http://host:port", "username": "USER", "password": "PASS"} door aan chromium.launch(), launch_persistent_context() of new_context(). Patchright patcht de proxylaag niet, dus elk upstream-gedrag — de bypass-lijst, de loopback-uitzondering — geldt ongewijzigd.

Ondersteunt Patchright SOCKS5 proxy authenticatie?

Nee, en het is een beperking van Chromium in plaats van Patchright: Chromium heeft geen mechanisme voor SOCKS-inloggegevens, dus geauthenticeerde SOCKS5-eindpunten falen. Gebruik de HTTP-poort van dezelfde gateway met de gebruikersnaam- en wachtwoordvelden, of authenticeer via IP-whitelist en behoud het SOCKS5-schema — elk QuantumProxies-plan ondersteunt whitelisting als alternatief voor user:pass. De volledige set oplossingen staat in onze Playwright SOCKS5 authenticatiegids, die hier ongewijzigd van toepassing is.

Kan Patchright een andere proxy per context gebruiken?

Ja, als je de browser hebt gestart met een globale proxywaarde — zelfs een tijdelijke — omdat Chromium alleen per-context proxies inschakelt wanneer er bij de start een aanwezig is. De uitzondering is de persistent-context opstelling die Patchright aanbeveelt voor stealth: dat geeft je een enkele context, dus rotatie betekent een apart proces met zijn eigen profieldirectory.

Is Patchright alleen voor Chromium?

Ja. Het project stelt duidelijk dat alleen op Chromium gebaseerde browsers worden gepatcht; Firefox en WebKit worden niet ondersteund. Als je stealth op Firefox-engine nodig hebt met geo afgeleid van de proxy-exit, is dat een ander hulpmiddel — zie onze Camoufox proxy en geoip gids.

Word ik nog steeds geblokkeerd met Patchright?

Op harde doelen, ja. Onafhankelijke tests tonen aan dat headless-modus nog steeds een HeadlessChrome-kenmerk lekt, en uitdagingpagina's die een gepatchte browser bereikt maar niet kan oplossen. De patches sluiten de goedkope automatiseringscontroles; IP-reputatie, TLS-vingerafdrukken en het oplossen van uitdagingen zijn afzonderlijke problemen die afzonderlijke antwoorden nodig hebben.

Behandel Patchright als wat het is: een zeer goede oplossing voor een specifieke klasse van lekken, geleverd zonder dat je een regel van Playwright hoeft te herschrijven. Combineer het met exits die schoon zijn, sticky waar identiteit belangrijk is, en geverifieerd voor de run — dan gaan de resterende mislukkingen eigenlijk over het doel, niet over je opstelling. Dit is technische begeleiding, geen juridisch advies: automatiseer binnen de wet en de voorwaarden van de site.

Plaats Patchright op schone residentiële exits