Python 爬虫代理 IP 在 Requests 里的正确接法-易代理

本站 · 2026-10-15 最新资讯 6

为什么 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代理

微信客服

微信客服

扫码添加客服

QQ 咨询

新用户专享 注册免费送 IP 5000个 高质量 IP 免费领取 立即领取