Selenium Wire, Selenium'u, standart Selenium'un yapamayacağı bir şey olan HTTP isteklerini engelleme ve değiştirme yeteneğiyle genişletir. Bu, güçlü CAPTCHA çözme iş akışlarının kilidini açar: API çağrılarından site anahtarlarının çıkarılması, engellenen yanıtlara belirteçlerin eklenmesi ve isteklerin proxy'ler aracılığıyla yönlendirilmesi.
Bu kılavuz, istek müdahalesini, ağ trafiğinden CAPTCHA algılamayı, proxy entegrasyonunu ve CaptchaAI ile otomatik çözmeyi kapsar.
Selenyum Tel Neleri Katar?
| Özellik | Standart Selenyum | Selenium Wire |
|---|---|---|
| İstekleri oku | Hayır | Evet |
| Başlıkları değiştirin | Sınırlı | Tam kontrol |
| Yanıtları kes | Hayır | Evet |
| Proxy desteği | Temel | Kimlik doğrulama proxy desteği |
| Ağ günlüğü | Yalnızca Geliştirici Araçları | Python nesneleri |
| HAR ihracatı | Hayır | Evet |
Kurulum
pip install seleniumwire selenium webdriver-manager requests
Temel Entegrasyon
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import requests
import time
import json
class SeleniumWireCaptchaSolver:
BASE_URL = "https://ocr.captchaai.com"
def __init__(self, api_key, proxy=None):
self.api_key = api_key
self.proxy = proxy
self.driver = None
def create_driver(self, headless=True):
options = webdriver.ChromeOptions()
if headless:
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
wire_options = {}
if self.proxy:
wire_options["proxy"] = {
"http": self.proxy,
"https": self.proxy,
}
self.driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options,
seleniumwire_options=wire_options,
)
return self.driver
def detect_captcha_from_requests(self):
"""Detect CAPTCHA type from intercepted network requests."""
for request in self.driver.requests:
url = request.url
if "recaptcha/api2/anchor" in url or "recaptcha/enterprise/anchor" in url:
# Extract sitekey from reCAPTCHA iframe URL
import re
match = re.search(r"k=([A-Za-z0-9_-]+)", url)
if match:
return {
"type": "recaptcha_v2",
"sitekey": match.group(1),
"page_url": self.driver.current_url,
}
if "recaptcha/api2/reload" in url or "recaptcha/enterprise/reload" in url:
return {
"type": "recaptcha_v3",
"sitekey": self._extract_v3_sitekey(),
"page_url": self.driver.current_url,
}
if "challenges.cloudflare.com" in url:
sitekey = self._extract_turnstile_sitekey()
if sitekey:
return {
"type": "turnstile",
"sitekey": sitekey,
"page_url": self.driver.current_url,
}
return None
def _extract_v3_sitekey(self):
for request in self.driver.requests:
if "recaptcha" in request.url and "render=" in request.url:
import re
match = re.search(r"render=([A-Za-z0-9_-]+)", request.url)
if match:
return match.group(1)
return self.driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
def _extract_turnstile_sitekey(self):
return self.driver.execute_script(
"return document.querySelector('.cf-turnstile[data-sitekey]')?.getAttribute('data-sitekey')"
)
def solve_captcha(self, captcha_info):
"""Solve detected CAPTCHA via CaptchaAI API."""
params = {"key": self.api_key, "json": 1}
if captcha_info["type"] == "recaptcha_v2":
params.update({
"method": "userrecaptcha",
"googlekey": captcha_info["sitekey"],
"pageurl": captcha_info["page_url"],
})
elif captcha_info["type"] == "recaptcha_v3":
params.update({
"method": "userrecaptcha",
"googlekey": captcha_info["sitekey"],
"pageurl": captcha_info["page_url"],
"version": "v3",
"action": "verify",
})
elif captcha_info["type"] == "turnstile":
params.update({
"method": "turnstile",
"key": captcha_info["sitekey"],
"pageurl": captcha_info["page_url"],
})
# Submit
resp = requests.post(f"{self.BASE_URL}/in.php", data=params)
data = resp.json()
if data["status"] != 1:
raise Exception(f"Submit: {data['request']}")
task_id = data["request"]
# Poll
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{self.BASE_URL}/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": 1,
})
data = resp.json()
if data["request"] == "CAPCHA_NOT_READY":
continue
if data["status"] != 1:
raise Exception(f"Solve: {data['request']}")
return data["request"]
raise Exception("Timeout")
def inject_token(self, captcha_type, token):
"""Inject solved token into the page."""
if captcha_type in ("recaptcha_v2", "recaptcha_v3"):
self.driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
// Try hidden textareas in iframes
document.querySelectorAll('[name="g-recaptcha-response"]').forEach(
el => el.value = '{token}'
);
""")
elif captcha_type == "turnstile":
self.driver.execute_script(f"""
const input = document.querySelector('[name="cf-turnstile-response"]');
if (input) input.value = '{token}';
""")
def close(self):
if self.driver:
self.driver.quit()
İş Akışını Tamamlayın
def automate_login():
solver = SeleniumWireCaptchaSolver(
api_key="YOUR_API_KEY",
proxy="http://user:pass@proxy.example.com:8080"
)
try:
driver = solver.create_driver(headless=True)
# Navigate and wait for CAPTCHA resources to load
driver.get("https://staging.example.com/qa-login")
time.sleep(3)
# Fill form
driver.find_element("id", "email").send_keys("user@example.com")
driver.find_element("id", "password").send_keys("password123")
# Detect CAPTCHA from network requests
captcha = solver.detect_captcha_from_requests()
if captcha:
print(f"Found {captcha['type']} (sitekey: {captcha['sitekey'][:20]}...)")
token = solver.solve_captcha(captcha)
solver.inject_token(captcha["type"], token)
print(f"Token injected: {token[:50]}...")
# Submit
driver.find_element("id", "submit").click()
time.sleep(3)
print(f"Current URL: {driver.current_url}")
finally:
solver.close()
automate_login()
İstekleri Ele Geçirme ve Değiştirme
Özel Başlıklar Ekle
def add_headers_interceptor(request):
request.headers["X-Custom-Header"] = "value"
request.headers["Accept-Language"] = "en-US,en;q=0.9"
driver = solver.create_driver()
driver.request_interceptor = add_headers_interceptor
İzleme Komut Dosyalarını Engelle
def block_trackers(request):
blocked = ["analytics", "tracking", "ads", "facebook.net", "doubleclick"]
if any(b in request.url for b in blocked):
request.abort()
driver.request_interceptor = block_trackers
Yanıt İçeriğini Değiştir
def modify_response(request, response):
if "captcha-config" in request.url:
# Modify CAPTCHA configuration response
import json
body = json.loads(response.body.decode("utf-8"))
body["difficulty"] = "easy"
response.body = json.dumps(body).encode("utf-8")
driver.response_interceptor = modify_response
CAPTCHA Parametrelerini API Çağrılarından Çıkarma
Bazı siteler CAPTCHA parametrelerini AJAX aracılığıyla yükler. Selenium Wire şunları yakalar:
def extract_captcha_from_api(driver, timeout=10):
"""Watch network for CAPTCHA configuration API calls."""
start = time.time()
while time.time() - start < timeout:
for request in driver.requests:
if request.response and "captcha" in request.url.lower():
try:
data = json.loads(request.response.body.decode())
if "sitekey" in str(data) or "siteKey" in str(data):
return data
except (json.JSONDecodeError, UnicodeDecodeError):
pass
time.sleep(0.5)
return None
İstek Başına Vekalet Rotasyonu
from seleniumwire import webdriver
proxies = [
"http://user:pass@proxy1.example.com:8080",
"http://user:pass@proxy2.example.com:8080",
"http://user:pass@proxy3.example.com:8080",
]
current_proxy = [0]
def rotate_proxy(request):
proxy = proxies[current_proxy[0] % len(proxies)]
request.headers["Proxy-Authorization"] = None # Reset
current_proxy[0] += 1
wire_options = {
"proxy": {
"http": proxies[0],
"https": proxies[0],
}
}
driver = webdriver.Chrome(seleniumwire_options=wire_options)
Ağ Trafiği Analizi
def analyze_captcha_traffic(driver):
"""Analyze all CAPTCHA-related network traffic."""
captcha_requests = []
for request in driver.requests:
if any(k in request.url for k in ["recaptcha", "turnstile", "hcaptcha", "geetest"]):
captcha_requests.append({
"url": request.url,
"method": request.method,
"status": request.response.status_code if request.response else None,
"content_type": request.response.headers.get("Content-Type") if request.response else None,
"size": len(request.response.body) if request.response and request.response.body else 0,
})
print(f"\nCAPTCHA Network Traffic ({len(captcha_requests)} requests):")
for req in captcha_requests:
print(f" [{req['status']}] {req['method']} {req['url'][:80]}...")
return captcha_requests
Hata Ayıklama için HAR Dışa Aktarma
from seleniumwire.utils import decode
def export_har(driver, filename="captcha_traffic.har"):
"""Export HAR file for debugging CAPTCHA issues."""
import json
har = {
"log": {
"version": "1.2",
"entries": []
}
}
for request in driver.requests:
if not request.response:
continue
entry = {
"request": {
"method": request.method,
"url": request.url,
"headers": [{"name": k, "value": v} for k, v in request.headers.items()],
},
"response": {
"status": request.response.status_code,
"headers": [{"name": k, "value": v} for k, v in request.response.headers.items()],
},
}
har["log"]["entries"].append(entry)
with open(filename, "w") as f:
json.dump(har, f, indent=2)
print(f"HAR exported: {filename} ({len(har['log']['entries'])} entries)")
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
seleniumwire içe aktarma hatası |
Kurulu değil | pip install seleniumwire |
| Yakalanan istek yok | Sayfa çok hızlı yüklendi | Gezinmeden sonra time.sleep(3)'yi ekleyin |
| Proxy ile SSL hataları | Sertifika sorunları | seleniumwire_options['verify_ssl'] = False'yi ayarlayın |
| Bellek sızıntısı | Talep depolama alanı büyüyor | del driver.requests'yi periyodik olarak arayın |
| Yavaş sayfa yükleniyor | Tüm trafik proxy'lendi | Kablo seçeneklerinde exclude_hosts kullanın |
| CAPTCHA algılanmadı | iframe aracılığıyla yüklendi | iframe URL'leri için driver.requests'yi kontrol edin |
SSS
Selenium Wire ile standart Selenyum arasındaki fark nedir?
Selenium Wire, HTTP isteği/response müdahalesini eklemek için Selenium WebDriver'ı sarar. Bu, anında değiştirilebilen bir özelliktir; ekstra ağ özelliklerine sahip aynı API'dir.
Selenium Wire ve Puppeteer'ı ne zaman kullanmalıyım?
İstek müdahalesine ihtiyaç duyan Python projeleri için Selenium Wire'ı kullanın. Zaten JavaScript ekosistemindeyseniz Puppeteer'ı (Node.js) kullanın.
Selenium Wire algılanmayan krom sürücüyle çalışır mı?
Evet. Selenium Wire'ın müdahale özelliklerini korurken webdriver.Chrome'yi tespit edilemeyen krom sürücüden uc.Chrome ile değiştirin.
Talep müdahalesi CAPTCHA'lara nasıl yardımcı olur?
CAPTCHA türlerini ağ trafiğinden tespit etmenize (DOM ayrıştırmasından daha güvenilir), API yanıtlarından parametreler çıkarmanıza ve engellenen isteklere belirteçler eklemenize olanak tanır.
İlgili Kılavuzlar
- Python Selenyum + CaptchaAI Tam Kılavuz
- Chrome DevTools Protokolü + CaptchaAI
- Proxy Kalitesi ve CAPTCHA Çözme Oranları
CAPTCHA otomasyonu için ana istek müdahalesi -CaptchaAI anahtarınızı alınve Selenium Wire ile oluşturun.