Hızlı cevap
Playwright'te kimlik doğrulamalı proxyyi nasıl kullanırım?
launch() veya new_context()'a server, username ve password içeren bir proxy nesnesi geçirin: server http://gw.crawlrelay.com:7777'dir ve kimlik bilgileri kendi alanlarına girilir, asla sunucu URL'sine değil. CrawlRelay konut proxy'lerinde, her bağlam için kendi çıkışını vermek adına kullanıcı adına ülke ve oturum kimliği koyun. Trafik ücreti $0,50/GB'den 50 GB ile başlar. KYC olmadan kripto ile ödenir.
Playwright kurulumu hızlı bakış
| Proxy seçeneği | {"server": "http://gw.crawlrelay.com:7777", "username": ..., "password": ...} |
|---|---|
| Nerede | Tüm tarayıcı için launch(proxy=...) veya her bağlam için new_context(proxy=...) |
| Port | HTTP portu 7777; HTTPS siteleri CONNECT üzerinden gider |
| SOCKS5 | Chromium SOCKS5 kimlik doğrulamayı desteklemez: HTTP portunu kullanın |
| Her bağlam için tek IP | Bağlamın kullanıcı adında -session-<id>-ttl-<minutes> |
| Tipik sayfa maliyeti | Her kaynağın dahil olduğu yaklaşık 2 MB; görüntüler, fontlar ve medya engellendiğinde birkaç yüz KB |
Her tarayıcı bağlamına nasıl kendi ülkesini veya oturumunu veririm?
Ülke veya yapışkan oturum başına bir bağlam oluşturun. Bağlamlar, tarayıcılara göre ucuzdur ve her biri kendi çerezleri, depolaması ve proxy kimlik bilgilerini tutar. Bağlamın yolunu çıkış ülkesine eşleştirerek siteye tutarlı bir ziyaretçi gösterin.
from playwright.sync_api import sync_playwright
GATEWAY = "http://gw.crawlrelay.com:7777"
LOCALES = {"us": "en-US", "de": "de-DE", "jp": "ja-JP"}
with sync_playwright() as p:
browser = p.chromium.launch()
for country, locale in LOCALES.items():
context = browser.new_context(
proxy={"server": GATEWAY, "username": "USERNAME-country-%s" % country, "password": "PASSWORD"},
locale=locale,
)
page = context.new_page()
page.goto("https://api.ipify.org", wait_until="domcontentloaded")
print(country, page.inner_text("body"))
context.close()
browser.close()Node.js için Playwright'te proxy'i nasıl ayarlar ve trafiği nasıl keserim?
Seçenek Node.js'te de aynı biçimdedir. Render edilen bir sayfanın ağırlığının çoğu görüntüler, fontlar ve medyadır: HTTP Archive Web Almanac 2025'e göre mobilde ortalama sayfa ağırlığı 2.164 KB'dir. Sadece metin ve bağlantılara ihtiyacınız varsa, bu istekleri route handler'da iptal edin.
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: {
server: "http://gw.crawlrelay.com:7777",
username: "USERNAME-country-us-session-pw1-ttl-30",
password: "PASSWORD",
},
});
const context = await browser.newContext();
// Images, fonts and media are most of a page's bytes
await context.route("**/*", (route) =>
["image", "font", "media"].includes(route.request().resourceType()) ? route.abort() : route.continue()
);
const page = await context.newPage();
const response = await page.goto("https://example.com/", { waitUntil: "domcontentloaded" });
console.log(response.status(), await page.title());
await browser.close();asyncio ile çok sayıda sayfayı paralel çalıştırmayı nasıl yaparım?
Sabit bir bağlam havuzu ile async API kullanın. Her bağlam ömrü boyunca bir yapışkan oturumu tutar, böylece site her istekte bir IP yerine birkaç stabil ziyaretçi görür. Belirli sayıda sayfadan veya hata sonrası yeni oturum kimliği ile bağlamı döngüye alın.
import asyncio
import uuid
from playwright.async_api import async_playwright
GATEWAY = "http://gw.crawlrelay.com:7777"
WORKERS = 4
async def worker(browser, queue):
session = uuid.uuid4().hex[:10]
context = await browser.new_context(proxy={
"server": GATEWAY,
"username": "USERNAME-country-us-session-%s-ttl-30" % session,
"password": "PASSWORD",
})
page = await context.new_page()
while not queue.empty():
url = await queue.get()
try:
response = await page.goto(url, wait_until="domcontentloaded", timeout=45000)
print(session, url, response.status if response else None)
except Exception as exc: # timeouts and network errors: log and move on
print(session, url, type(exc).__name__)
finally:
queue.task_done()
await context.close()
async def main(urls):
queue = asyncio.Queue()
for url in urls:
queue.put_nowait(url)
async with async_playwright() as p:
browser = await p.chromium.launch()
await asyncio.gather(*(worker(browser, queue) for _ in range(WORKERS)))
await browser.close()
asyncio.run(main(["https://example.com/", "https://example.org/"]))Neden ERR_TUNNEL_CONNECTION_FAILED veya ERR_PROXY_CONNECTION_FAILED alıyorum?
- net::ERR_TUNNEL_CONNECTION_FAILED, proxy'nin CONNECT isteğini kabul etmediği anlamına gelir. Genellikle kimlik bilgileri
serveriçinde yazılırkenusernamevepasswordyerine oraya yazıldığı için Chromium hiç göndermedi. Tünel hatasına bakın. - net::ERR_PROXY_CONNECTION_FAILED, tarayıcının gateway'e ulaşamadığı anlamına gelir: host veya port yazım hatası ya da portu engelleyen bir ağ sorunu vardır. Proxy bağlantı hatasına bakın.
gotoüzerinde Zaman aşımı 30000ms aşıldı genellikleloadveyanetworkidleyüklendiği için ve yüklemeye devam eden takipçileri beklediğiniz anlamına gelir. Öncedomcontentloadedsonra da gereken seçiciyi bekleyin.
Playwright scraper ne yapmamalı?
Playwright'i JavaScript gerektiren herkese açık sayfaları render etmek için kullanın, kişileri taklit etmek için değil. CrawlRelay'in Uygun Kullanım Politikası, tarayıcıları gateway üzerinden toplu hesap oluşturmak, hesapları ele geçirmek, CAPTCHA'ları otomatik çözmek ya da sitenin bilinçli engellerini atlatmak için kullanmayı yasaklar. Stealth eklentileri veya parmak izi sahtekarlığı dokümante etmiyoruz. Bir site tarayıcınızı zorladığında yavaşlayın, robots.txt ve kullanım şartlarını kontrol edin, erişim isteyin ya da API'sini kullanın.
Playwright ve proxyler: sorular
Her Playwright bağlamı için farklı proxy kullanabilir miyim?
Evet. Python'da proxy'ı browser.new_context()'a veya Node.js'te browser.newContext()'ye geçirin. Her bağlam kendi çıkışına, çerezlerine ve depolamasına sahip olur. Çok eski Playwright sürümleri Windows'ta başlatmada proxy isterdi; hata alırsanız, her hangi bir yer tutucu proxy ile başlatıp gerçek proxyyi bağlam başına ayarlayın.
Playwright SOCKS5 kimlik doğrulamalı proxyleri destekliyor mu?
Chromium desteklemez, çünkü SOCKS5 kullanıcı adı ve şifre kimlik doğrulamasını desteklemez. Gateway'nin HTTP portunu (7777) kullanın: HTTPS sitelerini CONNECT tünelleriyle işler ve Playwright'ın çalıştırdığı her tarayıcı motorunda kullanıcı adı ve şifreyi destekler.
Playwright sayfasının kullandığı IP ve ülkeyi nasıl kontrol ederim?
Hedefinizden önce aynı bağlamda https://api.ipify.org'ı açıp gövde metnini okuyun, ilk örnekteki gibi. Unutmayın, yapışkan oturum o IP'yi sadece konut cihazı çevrimiçi kaldığı sürece korur; değişiklikleri görebilmek için her bağlam başında IP'yi kaydedin.
Bir Playwright sayfası proxy üzerinden ne kadar trafik kullanır?
Hepsi faturalandırılır: HTML, scriptler, stiller, görüntüler, fontlar ve API çağrıları. Ortalama tam sayfa yaklaşık 2 MB'dir; görüntüler, fontlar ve medya engellenirse birkaç yüz KB'ye düşer. response handler ile 50 sayfa için yanıt boyutlarını toplayarak gerçek sayfalarınızı ölçün.
Scraping için headless mi yoksa geniş ekranlı (headed) tarayıcı mı kullanmalıyım?
Headless, sunucular için normal tercihtir ve daha az kaynak kullanır. Yalnızca bir sayfanın gösterdiklerini hata ayıklamak için headed tarayıcı kullanın. İkisi de kuralları değiştirmez: herkese açık sayfaları kibar bir hızda render edin ve sitenin robots.txt ve şartlarına uyun.
Herkese açık sayfaları konut IP'ler üzerinden render edin
$5,94, 50 GB üzerinden 10 GB, $0,50/GB.