做爬虫的人,谁没被封过IP呢?早上刚写好的脚本,跑着跑着就403了,一查发现本地出口IP被拉黑。这时候,代理IP就成了续命的关键。但光有代理还不够,怎么稳定连接、合理轮换,才是服务器能持续采集的核心。
为什么需要代理IP
很多网站对单个IP的请求频率有限制。比如你每秒发5次请求,可能还没拿到数据,对方防火墙就已经把你IP加入黑名单。尤其是电商、社交、招聘这类反爬严格的数据源,直接用本机IP无异于裸奔。
用代理IP,相当于给爬虫“换马甲”。每次请求换个出口IP,让目标服务器以为是不同用户在访问,大大降低被封风险。
选择代理IP服务商要注意什么
市面上代理IP服务商五花八门,价格从几块到几百不等。便宜的按量计费,贵的一般是独享线路。关键看你要爬什么数据。
如果只是小规模采集,可以选HTTP短效代理,成本低,IP池大,缺点是可能多个用户共用一个IP,质量不稳定。如果是长期项目,建议上HTTPS高匿代理,延迟低,成功率高,而且支持会话保持。
代码中如何连接代理IP
以Python的requests库为例,连接代理非常简单:
import requests
proxies = {
"http": "http://用户名:密码@ip:端口",
"https": "http://用户名:密码@ip:端口"
}
response = requests.get("https://example.com", proxies=proxies, timeout=10)
print(response.status_code)
注意格式别写错,特别是协议和端口。有些代理只支持HTTP,强行走HTTPS会失败。另外,超时时间别设太短,避免因网络波动导致请求中断。
动态切换代理的实用技巧
单一代理用久了照样会被封。更靠谱的做法是维护一个代理池,每次请求随机选一个。
你可以自己搭Redis存可用IP,定时检测存活状态。也可以直接调用第三方API获取有效代理:
def get_proxy():
api_url = "https://api.proxy-service.com/get"
resp = requests.get(api_url)
return resp.json().get("proxy")
# 使用时动态获取
proxy = get_proxy()
proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"}
这样即使某个IP失效,下一次也能自动换新的,保证爬虫不停转。
服务器上的注意事项
在Linux服务器上跑爬虫,别忘了设置系统级DNS解析。有些代理IP走的是海外节点,本地DNS可能会解析失败,导致连接超时。
建议在/etc/resolv.conf里加上Google或Cloudflare的公共DNS:
nameserver 8.8.8.8
nameserver 1.1.1.1
同时检查防火墙是否放行了代理端口,尤其是企业云服务器,默认安全组策略可能拦掉非标准端口。
还有一点容易忽略:时间同步。部分代理服务验证token依赖时间戳,服务器时间偏差超过几分钟,直接返回407认证失败。用ntpdate定期校准时间能省不少麻烦。
别把代理当万能药
用了代理也不代表就能为所欲为。目标网站的验证码、行为分析、JS加密越来越强,光靠换IP解决不了根本问题。
合理的请求间隔、模拟真实用户UA、携带Referer和Cookie,这些基础策略得配合上。不然再好的代理池,几天就被耗干了。
爬虫这事儿,拼的不是速度,是持久。稳一点,反而走得更远。