Python requests proxy ayarları, SOCKS5 ve HTTP proxy'lerini bağlama
Bu rehber, Python requests kütüphanesine Socks5Proxy'nin HTTP ve SOCKS5 proxy'lerini bağlama yöntemini, kullanıcı adı ve şifre doğrulamasını, liste döndürme ve yeniden deneme kodlarını adım adım açıklar.
Hazırlanması Gerekenler Nelerdir?
Python 3.8+ ve requests kütüphanesi gerekir. SOCKS5 kullanmak için SOCKS desteği olan paketi de yüklemeniz gerekir. requests[socks] yüklediğinizde PySocks da kurulur ve socks5 ile socks5h adreslerini kullanabilirsiniz.
Proxy bilgilerini dashboard'da 'Proxylerim' ekranından görebilirsiniz. Bu örnekte IP 198.51.100.23, HTTP port 8000, SOCKS5 port 1080, kullanıcı adı spx_user, şifre spx_pass kullanılmıştır. Kendi değerlerinizle değiştirin.
pip install "requests[socks]"HTTP proxy nasıl bağlanır?
requests, proxies sözlüğüne adresi eklediğinizde o proxy ile istek gönderir. http ve https için aynı HTTP proxy adresini eklemek önemlidir. https anahtarı yoksa HTTPS adres istekleri proxy'den geçmeden doğrudan gider.
HTTPS site istekleri CONNECT yöntemi ile proxy üzerinden geçer ve içerik baştan sona şifrelenmiş olarak iletilir. Aşağıdaki kod IP kontrol adresine istek göndererek yanıtta proxy IP'nin görünüp görünmediğini kontrol eden bir örnektir.
import requests
proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json()) # the "ip" field should show the proxy IPSOCKS5 proxy nasıl bağlanır?
SOCKS5 için adres ön ekini socks5h olarak kullanmanızı öneririz. socks5h, DNS çözümlemesini proxy tarafında yaparak kendi sunucunuzun DNS isteklerinin dışarı sızmasını engeller ve proxy'nin bulunduğu ülkeye göre adres çözümlenir. socks5 kullanırsanız DNS çözümlemesi kendi sunucunuzda yapılır ve yalnızca IP proxy'ye iletilir.
Port olarak SOCKS5 portunu kullanmalısınız. HTTP portuna SOCKS5 adresi girerseniz bağlantı kurulamaz, bu nedenle her satırdaki iki portu ayırt edin.
import requests
proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())Birden fazla proxy ile dönüşümlü istek gönderme yöntemi
Çok sayfalı toplamalarda, liste alıp her istekte bir sonraki proxy'yi kullanmak temel yöntemdir. Aşağıdaki kod, API ile SOCKS5 listesini alıp sırayla kullanır, başarısız istekleri farklı bir proxy ile en fazla 3 kez yeniden dener. Aynı alan adına çok hızlı istek göndermemek için kısa bekleme süreleri de eklenmiştir.
Başarısız proxy'leri hemen atmak yerine bir süre bekletip tekrar kullanmak daha iyidir. Geçici hatalar genellikle hedef sitenin durumundan kaynaklanır.
import itertools
import time
import requests
API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"
lines = requests.get(
API + "/proxies/download",
params={"format": "user:pass@ip:port", "protocol": "socks5"},
headers={"Authorization": "Bearer " + KEY},
timeout=30,
).text.split()
pool = itertools.cycle(lines)
def fetch(url, tries=3):
for _ in range(tries):
p = "socks5h://" + next(pool)
try:
r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
if r.status_code == 200:
return r.text
except requests.RequestException:
pass
time.sleep(1)
return None
for page in range(1, 6):
html = fetch("https://example.com/list?page=" + str(page))
print(page, "ok" if html else "failed")
time.sleep(0.5)Oturum ve çerezleri sürdürmek için ne yapmalıyım?
Giriş veya sayfa geçişi gibi çerezlerin devam etmesi gereken akışlar için requests.Session'a bir proxy sabitleyin. Oturum nesnesinin proxies özelliğine adresi eklediğinizde, o oturumdaki tüm istekler aynı IP'den çıkar. Akış bittiğinde oturumu kapatıp bir sonraki proxy ile yeni bir oturum başlatabilirsiniz.
Her oturum için User-Agent ve Accept-Language başlıklarını da ayarlarsanız, hedef sitede görünen görünüm tutarlı olur.
import requests
s = requests.Session()
s.proxies = {
"http": "http://spx_user:spx_pass@198.51.100.23:8000",
"https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})
s.get("https://example.com/", timeout=20) # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20) # same IP, same cookies
print(r.status_code)
s.close()IP yetkilendirme ile bağlanırken nasıl kullanılır?
Bu kodu çalıştıran sunucunun IPv4 adresini kontrol paneline eklediğinizde, adreste kullanıcı adı ve şifre olmadan kullanabilirsiniz. Şifreleri kodda veya yapılandırma dosyalarında saklamanıza gerek kalmaz, bu da aynı kodu birden fazla sunucuya dağıtmayı kolaylaştırır. Listeyi alırken formatı ip:port olarak seçebilirsiniz.
import requests
proxy = "http://198.51.100.23:8000" # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)Çoklu isteği eşzamanlı hızlı gönderme yöntemi
requests, bir istek bitene kadar bekleyen bir yöntemdir, bu yüzden birçok sayfayı hızlıca almak için birden çok işlemi aynı anda çalıştırmanız gerekir. En kolay yöntem concurrent.futures'ın ThreadPoolExecutor'udur. İşlem sayısını proxy sayısından az tutarsanız, bir IP'ye istekler yığılmaz.
Aşağıdaki kod, 20 işçi ile adres listesini bölüştürür ve her iş için listeden sıradaki proxy'yi seçer. itertools.cycle, birden fazla thread'de birlikte kullanıldığında bile bir sonraki değeri almakta sorun çıkarmaz, ancak kesin sıralama gerekiyorsa kilit mekanizması kullanmalısınız.
import itertools
from concurrent.futures import ThreadPoolExecutor
import requests
lines = open("proxies.txt").read().split() # user:pass@ip:port per line
pool = itertools.cycle(lines)
def get(url):
p = "http://" + next(pool)
try:
return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
except requests.RequestException as e:
return url, type(e).__name__
urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
for url, result in ex.map(get, urls):
print(url, result)httpx veya aiohttp gibi asenkron kütüphaneleri de kullanabilir miyim?
Evet. httpx'te istemci oluştururken proxy parametresine adres yazılır, SOCKS5 için httpx[socks] kurulumu yaparak socks5 adresini kullanabilirsiniz. AsyncClient da aynı parametreleri alır.
aiohttp, her istekte proxy parametresine HTTP proxy adresini ve proxy_auth'a aiohttp.BasicAuth geçirir. aiohttp varsayılan olarak SOCKS desteklemez, SOCKS5 gerekiyorsa aiohttp-socks paketinin bağlayıcısını kullanmalısınız.
Asenkron yöntem, binlerce isteği az kaynakla aynı anda işleyebilir, ancak eşzamanlı istek sayısını sınırlamazsanız hedef site ve proxy'ye aynı anda yüklenir. asyncio.Semaphore ile eşzamanlı istek sayısını belirleyin.
import httpx
with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
print(client.get("https://api.ipify.org").text)Sık karşılaşılan hatalar nasıl çözülür?
'Missing dependencies for SOCKS support' hatası, requests[socks] paketinin kurulu olmadığı anlamına gelir. Aynı sanal ortama yeniden kurun.
407 Proxy Authentication Required, kullanıcı adı veya şifrenin yanlış olduğu veya IP yetkilendirmesi kullanılırken sunucu IP'nin kayıtlı olmadığı durumlarda ortaya çıkar. Şifrenizde özel karakterler varsa, urllib.parse.quote ile değiştirmelisiniz.
Zaman aşımı genellikle yanlış port kullanımından kaynaklanır. HTTP adresleri için HTTP portunu, socks5h adresleri için SOCKS5 portunu kullandığınızdan emin olun. timeout değeri ekleyerek yanıtsız isteklerin tüm işlemi durdurmasını engelleyebilirsiniz.
- SOCKS hatası: pip install "requests[socks]"
- 407: Kullanıcı adı/şifre veya kayıtlı IP'yi kontrol edin
- Zaman aşımı: HTTP portu ve SOCKS5 portu ayrımı
- Tüm isteklere timeout ekle