Python requests proxy setup, pagkonekta ng SOCKS5 at HTTP proxy
Ang gabay na ito ay nagpapaliwanag nang step-by-step kung paano ikonekta ang HTTP proxy at SOCKS5 proxy ng Socks5Proxy sa Python requests library, username/password authentication, at code para i-rotate at i-retry ang listahan.
Ano ang mga kailangang ihanda?
Kailangan mo ng Python 3.8 o mas bago at requests library. Para sa SOCKS5, kailangan mong i-install ang SOCKS support bundle. Kapag nag-install ka ng requests[socks], kasama na ang PySocks para magamit ang socks5 at socks5h addresses.
Makikita ang proxy info sa 'My Proxies' page ng dashboard. Halimbawa: IP 198.51.100.23, HTTP port 8000, SOCKS5 port 1080, username spx_user, password spx_pass. Palitan ng actual values.
pip install "requests[socks]"Paano ikonekta ang HTTP proxy?
Kapag naglagay ng address sa proxies dictionary ng requests, ipapadala ang request sa pamamagitan ng proxy na iyon. Mahalagang ilagay ang parehong HTTP proxy address sa parehong http at https key. Kung wala ang https key, ang HTTPS address request ay hindi dadaan sa proxy at diretso itong lalabas.
Ang HTTPS site request ay dumadaan sa proxy gamit ang CONNECT method, kung saan ang mga nilalaman ay ipinapasa nang naka-encrypt mula simula hanggang katapusan. Ang code sa ibaba ay nagre-request sa IP check address at sinusuri kung ang proxy IP ay makikita sa response.
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 IPPaano kumonekta sa SOCKS5 proxy?
Inirerekomenda ang paggamit ng socks5h sa harap ng address. Ang socks5h ay nagpa-resolve ng domain name sa proxy side, kaya hindi lumalabas ang DNS request ng iyong server, at ang domain ay na-resolve batay sa lokasyon ng proxy. Kung gagamit ng socks5, ang domain name ay na-resolve sa iyong server bago ipadala ang IP sa proxy.
Dapat gamitin ang SOCKS5 port. Hindi gagana ang SOCKS5 address sa HTTP port, kaya tandaan ang pagkakaiba ng dalawang port per line.
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())Paano i-rotate ang maraming proxy habang nagre-request?
Kapag nagco-collect ng maraming page, ang default na paraan ay kunin ang proxy list at gamitin ang susunod na proxy sa bawat request. Ang code sa ibaba ay kumukuha ng SOCKS5 list mula sa API at gumagamit ng mga ito nang sunud-sunod, at sinusubukan ang failed requests sa ibang proxy hanggang 3 beses. May kasama ring short delay para hindi masyadong mabilis ang requests sa parehong domain.
Mas mabuting pahinga muna ang failed proxy bago gamitin ulit kaysa agad itapon. Madalas ay dahil sa estado ng target site ang pansamantalang error.
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)Paano panatilihin ang session at cookie?
Para sa mga flow na tuloy-tuloy ang cookies tulad ng pag-log in o pag-navigate sa mga pahina, gumamit ng isang proxy bawat requests.Session. Ilagay ang proxy address sa proxies attribute ng session object para lahat ng request mula sa session na iyon ay gagamit ng parehong IP. Kapag tapos na ang flow, isara ang session at gumawa ng bago sa susunod na proxy.
Kung itatakda mo rin ang User-Agent at Accept-Language header bawat session, magiging pare-pareho ang itsura mo sa target site.
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()Paano gamitin ang IP authorization para kumonekta?
Kapag nairehistro mo ang IPv4 ng server na nagpapatakbo ng code na ito sa dashboard, maaari mong gamitin ang address nang walang username at password. Hindi mo kailangang ilagay ang password sa code o config file, kaya mas madaling i-deploy ang parehong code sa maraming server. Maaari ring piliin ang format=ip:port kapag kumukuha ng listahan.
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)Paano magpadala ng maraming request nang sabay-sabay at mabilis?
Ang requests ay naghihintay hanggang matapos ang isang request, kaya para mabilis na makuha ang maraming page, kailangan mong patakbuhin ang maraming gawain nang sabay-sabay. Ang pinakamadaling paraan ay ang ThreadPoolExecutor ng concurrent.futures. Panatilihing mas kaunti ang bilang ng gawain kaysa sa bilang ng proxy para hindi magkumpulan ang mga request sa isang IP.
Ang code sa ibaba ay hinahati ang listahan ng mga address sa 20 worker, at sa bawat trabaho, pipili ng susunod na proxy mula sa listahan para gamitin. Ang itertools.cycle ay walang problema sa pagkuha ng susunod na value kahit gamitin ng maraming thread nang sabay, pero kung kailangan ng eksaktong pagkakasunud-sunod, gumamit ng lock.
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)Pwede bang gamitin ang mga asynchronous library tulad ng httpx o aiohttp?
Oo. Sa httpx, maaari mong ilagay ang proxy address sa proxy argument kapag gumagawa ng client, at para sa SOCKS5, i-install ang httpx[socks] para magamit ang socks5 address. Ang AsyncClient ay tumatanggap din ng parehong argument.
Sa aiohttp, ilagay ang HTTP proxy address sa proxy parameter at aiohttp.BasicAuth sa proxy_auth sa bawat request. Hindi supported ang SOCKS5 sa aiohttp by default - kailangan ang aiohttp-socks package connector para dito.
Ang async approach ay kayang i-handle ang libo-libong request gamit ang kaunting resources, pero kung walang concurrency limit, maaaring magkaroon ng sudden surge sa target site at proxy. Gamitin ang asyncio.Semaphore para magtakda ng limit sa concurrent requests.
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)Paano malulutas ang mga common errors?
Ang error na 'Missing dependencies for SOCKS support' ay nangangahulugang hindi naka-install ang requests[socks]. Pakireinstall ito sa parehong virtual environment.
407 Proxy Authentication Required ay nangyayari kapag mali ang username o password, o kung gumagamit ng IP authorization pero hindi nakarehistro ang server IP. Kung may special characters ang password, kailangan itong i-encode gamit ang urllib.parse.quote.
Ang connection timeout ay kadalasang dahil sa maling port. Siguraduhing HTTP port ang ginamit sa HTTP address at SOCKS5 port sa socks5h address. Lagyan ng timeout value para maiwasan ang mga request na walang response na nagpapahinto sa buong trabaho.
- SOCKS error: pip install "requests[socks]"
- 407: Tignan ang username/password o rehistradong IP
- Timeout: Pagkakaiba sa pagitan ng HTTP port at SOCKS5 port
- Lagyan ng timeout ang lahat ng request