需要准备什么?
需要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端口。HTTP端口不可填入SOCKS5地址,请注意每行两个端口的区别。
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对象固定分配一个代理。在会话对象的proxies属性中设置地址后,该会话的所有请求都会通过同一IP发出。流程结束后关闭会话,再用新代理创建新会话即可。
为会话设置固定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后,可直接使用无认证的代理地址。避免密码出现在代码或配置文件中,便于多服务器部署相同代码。获取列表时选择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端口
- 为所有请求设置超时