Hızlı cevap
Selenium’da kullanıcı adı ve şifre ile proxy nasıl kullanılır?
Kimlik bilgisi başlığını (Proxy-Authorization) ekleyen küçük bir yerel yönlendirici çalıştırın ve Chrome’u ona --proxy-server=http://127.0.0.1:8899 ile yönlendirin. Chrome o bayraktaki kimlik bilgilerini yok sayar ve Selenium’un proxy şifreleri için taşınabilir seçeneği yoktur. CrawlRelay konut proxyleri gw.crawlrelay.com:7777 üzerinde böyle çalışır, $0,50/GB’ten gelir. KYC olmadan ve kripto ile ödenir.
Selenium kurulumu hızlı bakış
| Neden yerel yönlendirici? | Chrome’un --proxy-server bayrağı kullanıcı adı veya şifre kabul etmez |
|---|---|
| Yönlendirici | 127.0.0.1:8899 üzerinde dinler, Proxy-Authorization ekler, gw.crawlrelay.com:7777’e iletir |
| Chrome seçeneği | --proxy-server=http://127.0.0.1:8899 |
| Rotasyon | Her yeni CONNECT tüneli yeni bir bağlantıdır ve genellikle yeni çıkıştır; tek IP için bir oturum kimliği ekleyin |
| Daha basit alternatif | Playwright kullanıcı adı ve şifreyi doğrudan alır |
Yerel yönlendirici nasıl çalışır?
Tarayıcının proxy isteğini kabul eder, kimlik bilgilerinizi içeren bir başlık ekler ve ardından her iki yönde baytları kopyalar. HTTPS sitesi için tarayıcı CONNECT host:443 gönderir, gateway 200 Connection established yanıtlar ve TLS Chrome ile web sitesi arasında uçtan uca çalışır. Yönlendirici sayfa içeriğini hiç açık metin olarak görmez.
Bu minimal versiyon HTTPS sitelerini yönetir, her bağlantı için bir CONNECT tüneli içerir. Bu, bugün neredeyse her web sitesini kapsar. Kimlik bilgilerinizin başka bir makine tarafından kullanılmaması için onu 127.0.0.1 ile sınırlandırın.
import asyncio
import base64
import os
UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())
async def pipe(reader, writer):
try:
while True:
data = await reader.read(65536)
if not data:
break
writer.write(data)
await writer.drain()
except ConnectionError:
pass
finally:
writer.close()
async def handle(client_reader, client_writer):
try:
head = await client_reader.readuntil(b"\r\n\r\n") # request line and headers from the browser
except asyncio.IncompleteReadError:
client_writer.close()
return
lines = head.split(b"\r\n")
lines.insert(1, AUTH) # add the credentials right after the request line
up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
up_writer.write(b"\r\n".join(lines))
await up_writer.drain()
await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))
async def main():
server = await asyncio.start_server(handle, "127.0.0.1", 8899)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())Selenium'u yönlendiriciye nasıl bağlarım?
Bir terminalde forwarder.py başlatın, ardından Selenium betiğinizi yerel proxy adresiyle çalıştırın. Selenium 4.6 ve sonrası ile gelen Selenium Manager, eşleşen ChromeDriver'ı indirir, böylece başka bir şey yüklemenize gerek kalmaz.
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899") # the local forwarder
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.set_page_load_timeout(60)
driver.get("https://api.ipify.org")
print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
driver.quit()Her Selenium oturumu için bir IP veya sayfa başına yeni IP nasıl alırım?
Yönlendirici size verdiğiniz kullanıcı adını gönderir, bu nedenle oturum davranışı bu kullanıcı adına bağlıdır:
- Bağlantı başına dönen: oturum kısmını (
USERNAME-country-us) çıkarın. Chrome sayfa başına birden fazla bağlantı açar, böylece tek bir sayfa birkaç farklı çıkış üzerinden yüklenebilir. - Her Selenium oturumu için tek IP: başlatmadan önce
CRAWLRELAY_USERdeğeriniUSERNAME-country-us-session-run42-ttl-30yapın. Her bağlantı aynı IP üzerinden 30 dakikaya kadar çıkar, IP daha erken de değişebilir. - Paralel birden fazla oturum: her oturum için farklı yerel portlarda (örneğin 8899 ve 8900) bir yönlendirici çalıştırın ve her WebDriver’a kendi portunu verin.
selenium-wire veya tarayıcı eklentileri nasıl?
selenium-wire, trafiği yakalayarak proxy kimlik doğrulaması ekleyen popüler bir paket, Ocak 2024’te yazarı tarafından arşivlendi ve güncelleme almıyor. Proxy'nin kimlik doğrulama isteğine yanıt veren bir tarayıcı eklentisi de çalışır, ancak her profil için paketlenip yüklenmelidir. Yukarıdaki yönlendirici bağımlılık içermez ve Selenium ile kullanılan herhangi bir tarayıcıyla uyumludur. Yeni projeler için, Playwright daha da basittir: proxy kullanıcı adı ve şifresini doğrudan alır.
Selenium ve proxyler: sorular
Neden Chrome, Selenium'da proxy için giriş penceresi gösteriyor?
Çünkü proxy kimlik bilgisi istedi ve Chrome’da yoktu: --proxy-server bayrağı yalnızca host ve port alır. Headless modda aynı sorun ERR_TUNNEL_CONNECTION_FAILED olarak ortaya çıkar. Kimlik bilgileri ekleyen yerel bir yönlendirici kullanın veya kullanıcı adı ve şifre kabul eden Playwright’a geçin.
Yönlendirici kazımamı yavaşlatır mı?
Neredeyse hiç. İki yerel soket ile bir uzak soket arasında bayt kopyalar, hiçbir şeyi şifre çözmez. Bir sayfanın süresi konut çıkışına ve hedef siteye bağlıdır, aynı makinede çalışan yönlendiriciye değil.
Selenium ile Chrome yerine Firefox kullanabilir miyim?
Evet. Firefox proxy tercihlerini FirefoxOptions aracılığıyla ayarlayın: network.proxy.type değerini 1 yapın, ve network.proxy.http ile network.proxy.ssl'ü 8899 portu ile 127.0.0.1 yapın. Yönlendiriciyi önde tutun: Firefox, Selenium’un güvenilir dolduramadığı bir diyalogda proxy kimlik bilgisi ister.
Şifrem yönlendiricide güvende mi?
Yönlendirici örnekte olduğu gibi 127.0.0.1 dinlediği sürece şifreniz makinenizde kalır. Çevre değişkenlerinden okuyun, asla kod deposuna kaydetmeyin ve her kazıyıcı için trafik limiti olan ayrı bir alt kullanıcı kullanın, böylece sızan şifre tüm planınızı tüketemez.
Selenium’a konut proxy çıkışı verin
$1,50 den 1 GB test için, $0,50/GB ise 50 GB’ten.