Python 爬虫代理 IP 在 Requests 里的正确接法-易代理
为什么 Requests 项目迟早要接代理
写 Python 爬虫的人,前期大多直接用本机网络请求。代码能跑,页面能下,看起来没问题。等到任务一上量,目标站开始限流,返回码从 200 变成 403,再后来直接弹验证页,这时候才想起来要接 Python 爬虫代理 IP,就已经有点晚了。
Requests 是 Python 里最基础的 HTTP 客户端。它不自带代理池,也不管你被没被封,只会老老实实发出去。业务要稳,就得在请求层前面加一层出口管理。Python 爬虫代理 IP 解决的就是“所有请求都从同一个公网地址出去”这个隐患。
Requests 配置代理的最简结构
核心就一个参数:proxies。HTTP 请求走 http 键,HTTPS 请求走 https 键。很多新手只配 http,结果抓 https 站点还是走真实网络,白接了。
pythonimport requests
proxies = { "http": "http://用户名:密码@网关地址:端口", "https": "http://用户名:密码@网关地址:端口",
}
resp = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)print(resp.text)这段代码跑通以后,返回里的 origin 不再是本机公网地址,而是代理通道分配的出口。到这里,Python 爬虫代理 IP 才算真正接进来了。
代理地址格式别写错
账号密码型一般是:
texthttp://user:pass@host:port
白名单型一般是:
texthttp://host:port
白名单模式要在服务商后台把本机公网 IP 绑进去,不然请求一过去就被网关拒绝。很多项目上线后半夜报错,查半天发现是服务器换公网地址了,白名单没更新。Python 爬虫代理 IP 用得不顺,一半是格式问题,一半是环境变更没同步。
单 IP 不够,要写重试封装
生产里不能只发一次请求。超时、连接重置、502、503 都可能来。简单封装一个重试函数,比在业务代码里到处写 try 清爽得多。
pythonimport requestsimport timedef fetch_with_retry(url, proxies, max_retries=3, timeout=10): for attempt in range(1, max_retries + 1): try:
resp = requests.get(url, proxies=proxies, timeout=timeout) if resp.status_code == 200: return resp.text print(f"第{attempt}次请求,状态码:{resp.status_code}") except requests.RequestException as e: print(f"第{attempt}次请求异常:{e}")
time.sleep(2) return None这里要注意,动态转发类通道重发就可能换新出口,不需要你手动再拉 IP。Python 爬虫代理 IP 的“动态”价值,就体现在这种失败自愈上。
请求头也要像正常客户端
只换出口不换请求头,还是像机器。User-Agent 要有,Accept-Language 要对,Referer 该带就带。目标站看的是整体画像,不是只有一个 IP 维度。
pythonheaders = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0 Safari/537.36", "Accept-Language": "zh-CN,zh;q=0.9",
}
resp = requests.get(url, proxies=proxies, headers=headers, timeout=10)Python 爬虫代理 IP 负责换网络身份,请求头负责补客户端身份。两层一起做,采集才像正常访客。
日志里必须记出口信息
出了事要能复盘。至少记:请求 URL、状态码、耗时、使用的代理网关、是否触发验证、重试次数。
pythonimport time
start = time.time()
resp = requests.get(url, proxies=proxies, timeout=10)
cost = round(time.time() - start, 3)print(f"url={url} status={resp.status_code} cost={cost}s proxy={proxies['https']}")没有日志的爬虫,跑一周你都不知道是哪类页面拖慢了整体,也不知道 Python 爬虫代理 IP 的失败率到底高不高。
小结
Requests 接代理不难,难的是把代理当成系统层而不是临时参数。出口管理、重试、请求头、日志、超时,这五件事补齐,Python 爬虫代理 IP 才从“能换 IP”变成“能让采集任务连续跑”。
相关标签:代理ip,ip代理,http代理,代理服务器ip,开放代理,文档中心,新闻,动态住宅ip,ip池,socks5代理