7回答

3收藏

探讨如何高效复用IP代理

信息分享 信息分享 4521 人阅读 | 7 人回复 | 2020-03-22


举个例子:

早上9点,我的10个爬虫同时启动作业,他们都需要代理。




其中爬虫中,我都从代理服务商,取了一个5分钟的IP代理,去相关网站爬取,但是在第3分钟,IP被ban;


这时候代码就需要干2件事情:

1、判断被ban的条件,发出被ban的信号

2、向代理服务商发出请求,更换IP




那么问题来了:

虽然代理IP 111.111.111.111 在网站A被ban,但是他可以在网站B使用,应该考虑复用的问题。




初步想法:


存入Redis的数据:
{
"ip": "122.4.42.131",
"port": 4242,
"expire_time": "2020-03-22 16:16:16",
"city": "山东省济南市",
"isp": "电信"
"ban": ["taobao.com", "baidu.com"] # IP被ban的域名列表
}





所有爬虫初始化的时候,从发送需要`并发值` `检测网址`到代理IP池 API,代理池 根据 `并发值` 向 代理服务商请求 同等数量的IP代理,使用 `检测网址`作为目标网站,进行检测(比如统一请求baidu.com,如果IP访问通,则此时此IP已经计费),如果不可以访问,则在
"ban": ["baidu.com"] # IP被ban的域名列表
添加被ban的域名。




爬虫A 开始第一个请求,从代理池拉取IP,使用 Redis pop,排除被ban的IP;

如果第一个请求,判断出IP被ban,修改json数据,再存入代理池供其他爬虫取用。如果没有被ban,则继续使用







现状:

目前市面上的代理池,大多解决的是免费代理聚合,免费使用的问题,并没有关心这个场景的应用。

如果,像阿布云代理这样的隧道代理,可以循环取用, 变更ip,不用担心代理消耗的问题,但是,包月场景,在高并发的情况下,显得有些贵。







欢迎大家讨论~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
回复

使用道具 举报

回答|共 7 个

clark1203

发表于 2020-3-22 19:56:40 | 显示全部楼层

论坛尽然不能二次编辑。
第二句话,写的不通顺,我改一下:
“我从代理服务商,取了一个时效为5分钟的IP代理,去相关网站爬取,但是在第3分钟,IP被ban”
回复

使用道具 举报

sfhfpc

发表于 2020-3-22 20:25:36 | 显示全部楼层

我的想法是这样的:
1、得确切地知道目标网站的限速阈值
2、每次使用代理时都记录 ip 和目标网站,且每次都判断单 ip 是否达到阈值
3、啥网站都一样,只要有了阈值和事前判断,就不会出现 ip 浪费的情况
4、至于 ip 如何节省,得根据具体业务和需求进行规划
回复

使用道具 举报

clark1203

发表于 2020-3-22 22:31:54 | 显示全部楼层

总结一下,就是一个代理IP的复用:
场景:在A网站被封,可以在他过期前,可以被另外一个爬虫进程使用,去访问B网站,充分利用资源。

这里面有2个常见问题,可以写成一个装饰器 或者 配置中心 之类的东西:
1、如何知道被ban:每个网站的特征是不一样的,可以存储这种规则到 代理或者配置中心
2、一个IP的复用策略设计:数据库,取用方式等等
回复

使用道具 举报

clark1203

发表于 2020-3-22 22:34:58 | 显示全部楼层

你说的,我归纳为“如何知道被ban”这个问题了,每个网站都不一样(403,假数据,没数据等等)
回复

使用道具 举报

jackcoden

发表于 2020-9-15 14:13:54 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

123

发表于 2020-9-15 14:32:23 | 显示全部楼层

我说一下我在用的ip池设计
1.一个总池,这个是不断向ip代理商拉取新ip
2.按网站划分使用的私有池,拉取总池所有ip,私有池定时更新ip可用状态,每次虫子根据id获取可用ip,并释放原先ip,一个ip只能提供一个id使用
回复

使用道具 举报

buging

发表于 2020-11-23 17:43:57 | 显示全部楼层


你这需求我一年前就实现了。
要做的东西挺多的。
首先吧功能拆开,需要做两个模块
1.获取ip模块。(总调度模块,IP的分发和新ip的请求都走这一个模块)
一个部署在服务器的长任务,接管所有代理ip获取信息,统计某一个域名下的请求。
根据某一域名的ip需求获取新的代理ip,新的代理ip拿到后先放入总池,
接收到域名的ip请求时,根据总ip池减去域名的被封ip池,得到可用的ip
2.跟着爬虫文件走的ip请求模块
向总调度模块请求IP,请求的时候把爬虫的域名带上。(其余参数根据需求自行设计,例如一次获取ip的数量, ip的有效时长等等)
爬虫检测到ip被封,把ip的值传给总调度模块

数据库使用redis
1. 总ip池
2. 每个域名的的被封ip池(有多少个域名就有多少个独立的被封池)

(这里有个技巧,为了省去清理过期ip的逻辑,在获取新ip的时候,把一个ip设置为一个键,ip的过期时间设置为redis的key过期时间,利用redis的key过期自动清除机制实现自动清理过期ip。这样占用更多的redis key,但效率非常可观)


基于上面的框架可以加很多功能,例如设置某一域名的单日最大使用ip数量,统计单一域名下的被封频率,某一域名对ip的使用效率,域名的费用消耗。。。等等。

核心就是所有的获取新IP请求都交给总调度模块处理
回复

使用道具 举报