需要準備什麼?
需要Python 3.8以上同requests庫。用SOCKS5要安裝SOCKS支持套件。安裝requests[socks]會一併安裝PySocks,就可以用socks5同socks5h地址。
代理信息可在控制台的「我的代理」頁面查看。示例:IP 198.51.100.23、HTTP端口8000、SOCKS5端口1080、用戶名spx_user、密碼spx_pass。請替換為實際值。
pip install "requests[socks]"如何連接 HTTP 代理?
requests透過proxies字典設定代理地址時,務必同時為http與https鍵設定相同HTTP代理地址。若缺少https鍵,HTTPS請求將直接連線而不經代理。
HTTPS 網站請求通過 CONNECT 方式通過代理傳輸,內容從頭到尾都是加密的。以下代碼是通過 IP 確認地址請求並檢查響應中是否顯示代理 IP 的示例。
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 IP如何連接 SOCKS5 代理?
建議在地址前使用socks5h。socks5h會由代理端進行域名解析,避免您的伺服器DNS請求外洩,且解析結果基於代理所在國家。若使用socks5,則由您的伺服器解析域名後僅轉發IP給代理。
必須使用 SOCKS5 端口。若將 SOCKS5 地址填入 HTTP 端口將無法連接,請注意區分每行中的兩個端口。
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())如何循環使用多個代理發送請求?
採集大量頁面時,建議下載代理列表並輪換使用。以下代碼通過API獲取SOCKS5列表輪詢使用,失敗請求會切換其他代理重試最多3次。並設置間隔避免對同一域名請求過快。
失敗代理暫停後重試比直接棄用更好,臨時錯誤多因目標網站狀態引起。
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)如何保持會話和 Cookie?
像登入或翻頁這樣需要保持Cookie連續的流程,請使用一個requests.Session固定一個代理。將地址放入session對象的proxies屬性中,該session的所有請求都會從同一IP發出。流程結束後關閉session,並使用下一個代理創建新session即可。
每個會話固定 User-Agent 和 Accept-Language 標頭,使目標網站看到的內容保持一致。
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 授權連接?
在儀表板中註冊運行此代碼的伺服器的IPv4地址,這樣就可以在地址中省略用戶名和密碼。無需將密碼放在代碼或配置文件中,這樣更容易在多台伺服器上部署相同的代碼。獲取列表時也可以選擇format為ip:port。
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)如何同時快速發送多個請求?
requests屬同步請求庫,需搭配concurrent.futures的ThreadPoolExecutor實現並發。建議任務數少於代理IP數量,避免單一IP負載過高。
以下代碼將地址列表分成 20 個工作線程處理,每個工作線程從列表中選擇下一個代理使用。itertools.cycle 在多線程中使用時也能順利取出下一個值,但如果需要精確順序,請使用鎖定機制。
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或aiohttp等非同步函式庫?
是的,httpx創建客戶端時通過proxy參數設置地址,安裝httpx[socks]後可支持socks5地址。異步客戶端AsyncClient也接受相同參數。
aiohttp需在每個請求嘅proxy參數填入HTTP代理地址,並向proxy_auth傳遞aiohttp.BasicAuth。aiohttp默認不支援SOCKS,如需使用SOCKS5需採用aiohttp-socks套件嘅連接器。
異步方式可用少量資源同時處理數千請求,但若未限制並發請求數會導致目標網站和代理瞬間負載過高。建議使用asyncio.Semaphore設定並發請求上限。
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)如何解決常見錯誤?
「Missing dependencies for SOCKS support」錯誤表示未安裝requests[socks]。請喺同一個虛擬環境重新安裝。
407 Proxy Authentication Required表示用戶名或密碼錯誤,或使用IP授權但服務器IP未註冊。若密碼包含特殊字符,需使用urllib.parse.quote轉換後輸入。
連接超時通常是由於端口不匹配。請確保HTTP地址使用HTTP端口,socks5h地址使用SOCKS5端口。設置timeout值可以防止無響應的請求導致整個任務停滯。
- SOCKS 錯誤:pip install "requests[socks]"
- 407:檢查用戶名·密碼或註冊IP
- 超時:區分HTTP端口與SOCKS5端口
- 為所有請求設置timeout