Socks5Proxy

Python requests代理設置,SOCKS5同HTTP代理連接方法

本指南逐步解說Python requests函式庫連接Socks5Proxy的HTTP/SOCKS5代理、帳密認證、IP清單輪替與重試機制實作。

需要準備什麼?

需要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
Python requests代理設置,SOCKS5·HTTP連接 | Socks5Proxy