
带过几个做采集的新人,发现一个规律:选服务商的时候大家研究得头头是道,真拿到账号了反而卡住——控制台一堆按钮,鉴权、协议、提取方式,到底先点哪个?
脚本跑不通的原因,十次有八次不在代码,在接入流程的某一步走岔了。这篇按时序把5步拆开讲,配Python示例,基本照着走就能跑通。适合写采集器、拉拓客数据这类需要程序化调代理的场景。
先说清楚一件事:什么时候才需要走API。如果你就是手动换几个IP点点网页,图形化客户端够用了,别折腾。API是给这些场景准备的:
动手前把这几样备齐:代理账号(注册+实名)、服务器公网IP(配白名单要用)、Python 3.7+(本文用requests举例)、还有你的目标站清单——采什么、多高频率、并发多少,心里得有数。
控制台申请套餐,然后二选一:IP白名单 或 账号密码认证。国内主流服务商基本都是这两种。
白名单就是把你程序所在服务器的公网IP加进去,之后请求不用带账密,直接调。账密认证则是每次请求带用户名密码。
怎么选?一句话:服务器IP固定用白名单,其他情况都用账密。
你的环境 | 选哪个 |
|---|---|
固定公网IP的服务器 | 白名单 |
本地开发 / 多机部署 | 账密 |
容器 / 云函数(IP飘的) | 账密 |
内网穿透 / NAT | 账密 |
就想最快跑起来 | 账密,白名单都不用配 |
顺带一提,我们现在用的极安代理两种都支持,控制台改完即时生效。新注册有8小时免费试用额度,正好拿来验证鉴权配没配对——别一上来就充钱,先把链路打通。
协议看目标站。HTTP/HTTPS/SOCKS5三件套主流服务商都有,绝大多数网页采集HTTP代理就够了(HTTPS站也能走,后面FAQ会讲),只有邮件、FTP这类非HTTP协议才需要SOCKS5。
提取方式看你想在程序端管多少事,三种:
这里给个偏心的建议:能用隧道就用隧道。程序里只配一个固定入口地址加鉴权,换IP、剔除坏IP、重试全在云端做完了。自己维护IP池那套代码——健康检查、失效剔除、并发安全——写过一次的人都懂,能不写就不写。
requests最常见,账密认证长这样(IP端口换成你控制台里的实际值):
import requests
proxy_user = "your_username"
proxy_pass = "your_password"
proxy_host = "proxy.example.com"
proxy_port = "8000"
proxies = {
"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
"https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}
url = "https://target-site.example.com/public/data"
try:
response = requests.get(url, proxies=proxies, timeout=10)
print(response.status_code, response.text[:200])
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")白名单方式更简单,URL里不用带账密:
proxies = {
"http": f"http://{proxy_host}:{proxy_port}",
"https": f"http://{proxy_host}:{proxy_port}"
}隧道代理的写法几乎一模一样,就是host换成隧道入口、port换成隧道端口。程序里不用写任何换IP的循环,每次请求出口IP自动换,这是它最舒服的地方。
并发方案按量级选:
场景 | 方案 |
|---|---|
单线程串行 | requests + 手动重试 |
10-100线程 | requests + ThreadPoolExecutor |
高并发异步 | aiohttp + asyncio |
长连接持续采 | 复用Session |
注意一个隐形天花板:隧道代理套餐一般有默认并发上限(每秒几个到十几个请求不等)。压测时突然大量连接失败,先别怀疑代码,去控制台看看是不是撞限流了。要上量就申请提并发或升套餐。
采集脚本最怕的不是单次失败,是失败了没人管,跑一半整个挂掉,第二天早上看日志血压拉满。行业通用做法是三层保护:连接超时、请求失败、代理不可用,分开处理。
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(
total=3,
backoff_factor=0.5,
status_forcelist=[500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("http://", adapter)
session.mount("https://", adapter)
try:
resp = session.get(url, proxies=proxies, timeout=(5, 15))
resp.raise_for_status()
except requests.exceptions.ProxyError:
# 代理不可用,换一个
pass
except requests.exceptions.Timeout:
# 超时,重试或跳过
pass
except requests.exceptions.HTTPError as e:
# 4xx/5xx,按状态码分类处理
pass排查对照表,建议存一份:
异常 | 大概率原因 | 怎么办 |
|---|---|---|
ProxyError | IP失效、鉴权错 | 换IP,查白名单/账密 |
ConnectTimeout | 代理服务没响应 | 缩短超时、换节点 |
ReadTimeout | 目标站响应慢 | 加大超时、降并发 |
SSLError | 证书问题 | 查系统证书、更新CA |
403/429 | 目标站限频了 | 降频、加随机延迟 |
502/503 | 目标站临时抽风 | 指数退避重试 |
隧道和短效在这一步的差别很明显:短效代理你得自己维护IP池,取IP先做健康检查,失效就移除;隧道场景下IP失效云端自动处理,程序侧基本见不到ProxyError。像极安的隧道机制是当前出口IP异常时,下一次请求自动切到可用IP,应用层不用写换IP逻辑,这也是隧道类产品的标准做法。
上线不是终点。三个核心指标:请求成功率、平均响应时间、IP使用效率。任何一个不对劲,回前四步找原因。
指标 | 算法 | 参考线 |
|---|---|---|
请求成功率 | 200数 / 总请求数 | 中长期 >95% |
平均响应时间 | 采样均值 | 网页 <3s、API <1s |
代理连通率 | 代理层无异常率 | >99% |
IP使用效率 | 有效IP / 提取IP | >90% |
日志别偷懒:每条记目标URL、状态码、耗时、代理IP尾号,按业务模块分开。成功率跌破阈值直接推企业微信/钉钉告警,别等第二天人肉翻日志。每天出个汇总和历史基线比一比,趋势比单点重要。
指标劣化了往这三个方向查:
以上。流程不复杂,坑都在细节里。有别的踩坑经历欢迎评论区交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。