社区讨论LinuxDo 最新
折腾了个开源代理池,聊聊免费 IP 池实际能用到什么程度
最近在做一个小采集项目,目标站限流挺狠,单 IP 一天几百请求就给你弹验证码。找了圈现成方案,最后用 jhao104/proxy pool(GitHub 上搜就有)搭了一套,跑了两周,把实际情况记录一下,给有同样需求的人参考。 先说结论:免费代理池能用,但只能用在“对成功率要求不高的场景”。如果你的业务丢一条数据就心疼,别用免费的,真的。下面细说。 GitHub 上搜 proxy pool 出来一堆,大多年久失修。jhao104 这个项目 star 两万多,最近还有提交,issues 里提问也有人回,文档写得算清…
内容摘要
作者:#Thordata
板块:#开发调优
最近在做一个小采集项目,目标站限流挺狠,单 IP 一天几百请求就给你弹验证码。找了圈现成方案,最后用 jhao104/proxy_pool(GitHub 上搜就有)搭了一套,跑了两周,把实际情况记录一下,给有同样需求的人参考。
先说结论:免费代理池能用,但只能用在“对成功率要求不高的场景”。如果你的业务丢一条数据就心疼,别用免费的,真的。下面细说。
GitHub 上搜 proxy pool 出来一堆,大多年久失修。jhao104 这个项目 star 两万多,最近还有提交,issues 里提问也有人回,文档写得算清楚。核心逻辑很直接:
定时从十几个免费代理网站抓 IP(free-proxy-list.net、proxyscrape 这些)
存进 Redis,给每个 IP 打分
定时校验,挂了就扣分,分数低于阈值就删掉
对外暴露一个 HTTP 接口,你的爬虫随取随用
代码量不大,Python 写的,想改逻辑随时能改,这点我很喜欢。
部署
机器是台 2C4G 的小鸡,装的 Docker,整个过程十分钟。
先起 Redis:
docker run -d --name redis -p 6379:6379 redis
再起代理池:
docker run -d --name proxy_pool -p 5010:5010 \
--env DB_CONN=redis://redis:6379/0 \
--link redis:redis \
jhao104/proxy_pool:latest
起来之后访问 http://127.0.0.1:5010/get 能拿到一个代理就算成功:
{"proxy": "1.2.3.4:8080"}
我用的 requests,写了个简单的包装:
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get").json()["proxy"]
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete", params={"proxy": proxy})
def fetch(url, retry=3):
proxy = get_proxy()
for i in range(retry):
try:
resp = requests.get(
url,
proxies={"http": f"http://{proxy}", "https": f"http://{proxy}"},
timeout=8,
)
if resp.status_code == 200:
return resp.text
except Exception:
pass
# 这个代理不行,换下一个
delete_proxy(proxy)
proxy = get_proxy()
return None
请求失败就把代理踢掉重新取,池子会自动补充新的进来。
这是我两周里观察到的情况,样本不大但趋势应该靠谱:
池子平时维持在 100~300 个“活”代理,高峰期能到 500
单个免费代理平均存活时间不到半小时,很多抓回来十几分钟就死了
真实可用率(能成功请求目标站)大概 10%~20%,也就是说平均要试 5 到 10 个代理才成一次
HTTPS 站点比 HTTP 站点可用率明显更低
所以我的爬虫最后是这么跑的:并发开 20,每个请求失败自动换代理重试 3 次,整体任务成功率能压到 95% 以上。代价是总请求量放大了五六倍,对目标站来说等于每小时几千次请求……做采集的都懂,这里不展开。
踩过的几个坑
别把重要请求走免费代理。免费代理有个说不清的问题:你不知道流量经过了谁。登录态、cookie、API key 这类东西绝对不要从免费代理过,中间人攻击是真实存在的风险。我只用它抓公开页面。
Redis 记得加密码或者只监听 127.0.0.1。我一开始 -p 6379:6379 直接映射出去,第二天一看里面多了几个奇怪的 key,应该是被扫描器写垃圾了。公网机器务必注意。
免费源的质量分时段波动很大。国内白天池子小、死得快,后半夜反而稳定些,估计和国内外免费源更新频率有关。任务不急的话可以错峰跑。
某些免费源会返回机房 IP 甚至蜜罐。项目本身不带检测能力,需要质量的话得自己在校验环节加一步(比如请求 ip-api.com 判断代理类型再过滤)。
适合:课程作业、个人练手项目、抓一些不怕丢数据的公开页面、给自己的付费代理做备份池。
不适合:生产环境采集、任何带账号体系的目标站、对数据完整性有要求的任务。生产环境老老实实上付费住宅代理或者自建 VPS 池,这个免费池子的定位就是“聊胜于无”。
代码我就不贴全了,项目 README 写得挺细,照着跑就行。
资讯来源
LinuxDo