您的位置: 首页 > 新闻资讯 > 常见问题 > 正文

万变ip代理软件免费构建IP代理池

发布时间:2019年11月22日 来源:

ip代理

写在前面

最近无意中看到一个开源代理词项目,在GitHub上有近5000的Star,我试用了一下,感觉还不错,也发现了一些小问题,让其更加可用,由此在这里做个分享。

\"2小时构建IP代理池\"

github项目截图

代理来源

我们平常都会抓西刺,或者一些提供免费代理的网站,本项目的IP来源也是如此,在他的项目内有这样的注释:

\"\"\"
 66ip.cn
 data5u.com
 xicidaili.com
 goubanjia.com
 xdaili.cn
 kuaidaili.com
 cn-proxy.com
 proxy-list.org
 www.mimiip.com to do
\"\"\"

上面都是都是可以爬免费代理的网站。免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存。代码里已经有了,我这里就不多做说明,贴上部分抓取代码

@staticmethod
 def freeProxyTen():
 \"\"\"
 云代理 http://www.ip3366.net/free/
 :return:
 \"\"\"
 urls = ['http://www.ip3366.net/free/']
 request = WebRequest()
 for url in urls:
 r = request.get(url, timeout=10)
 proxies = re.findall(r'[\s\S]*?', r.text)
 for proxy in proxies:
 yield \":\".join(proxy)
 @staticmethod
 def freeProxyEleven():
 \"\"\"
 IP海 http://www.iphai.com/free/ng
 :return:
 \"\"\"
 urls = [
 'http://www.iphai.com/free/ng',
 'http://www.iphai.com/free/np',
 'http://www.iphai.com/free/wg',
 'http://www.iphai.com/free/wp'
 ]
 request = WebRequest()
 for url in urls:
 r = request.get(url, timeout=10)
 proxies = re.findall(r'[\s\S]*?',
 r.text)
 for proxy in proxies:
 yield \":\".join(proxy)

以上是两个网站代理池的解析。感兴趣的可以试试看,大佬直接用正则匹配出来了。

验证代理

可以肯定免费的代理IP大部分都是不能用的,不然别人为什么还提供付费的(不过事实是很多代理商的付费IP也不稳定,也有很多是不能用)。所以采集回来的代理IP不能直接使用,可以写检测程序不断的去用这些代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。

存储和使用代理

项目提供了SSDB,和Redis来做校验IP队列,和可用IP队列,并用flask把代理做成服务。这样我们可以通过API来获取,更新,删除IP,甚至在实现个人的定制化时更加灵活。下面贴一部分flask的内容:

\"2小时构建IP代理池\"

flask的一些接口信息

通过这个文档我们可以看出作者提供了4个API,分别为:

  • get:随机获得一个可用的代理

  • get_all:获得所有的可用代理

  • delete: 删除一个代理

  • get_status:获得状态

基本可以覆盖大部分的使用情况。

项目设计

根据项目分包,可以看出代理池由四部分组成:

  • ProxyApi:用flask写的接口,功能是给爬虫提供get/delete/refresh等接口,方便爬虫直接使用。

  • ProxyGetter: 爬取免费代理

  • Schedule:调度。定时检测DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理。看代码好像是5分钟跑一次ProxyGetter。

  • DB:存储模块。使用SSDB,或者redis做可用代理队列的存储。

\"2小时构建IP代理池\"

大佬个人博客抄来的架构图

使用

我直接把项目拉下来,根据readme设置了配置,直接把我MAC本机的redis做了DB,就可以跑起来了。看项目windows更推荐用Docker拉镜像跑,我这里都不多说了。

遇到的问题

由于整个项目的校验机制延时比较长,代码如下:

def run():
 scheduler = BackgroundScheduler()
 # 不用太快, 网站更新速度比较慢, 太快会加大验证压力, 导致raw_proxy积压
 scheduler.add_job(fetchAll, 'interval', minutes=10, id=\"fetch_proxy\")
 scheduler.add_job(batchRefresh, \"interval\", minutes=1) # 每分钟检查一次
 scheduler.start()
 fetchAll()
 while True:
 time.sleep(3)

每分钟校验一次可用代理,10分钟爬一次免费网站的代理。我个人感觉校验代理的世界太长了,可以看看我的测试。

跑了一天,代理池记录的代理如图

\"2小时构建IP代理池\"

一天内的可用代理

我特别写的校验机制,循环20次校验拿到的代理可用数,如图:

\"2小时构建IP代理池\"

校验结果

第一次校验通过24个代理可用,第二次只有18,中间耗时4s

\"2小时构建IP代理池\"

校验20次的结果

20次校验后,得到的可用代理只有13个

\"2小时构建IP代理池\"

redis存储的代理

由于项目校验可用代理延时为1分钟,最初可用代理76个。当我使用脚本校验20次后,可用的只有13个。意味着在这段时间内,可用的稳定的代理只有13/76,不到20%的稳定率。

在实际使用中,不管使用何种代理,校验都是必不可少的,但是不到20%的代理可用,这会对爬虫造成巨大的干扰,至少在我看来,在这种机制下,校验的IP还具有很大的提升空间。

解决思路

由于是爬取其他网站的活动代理,我们并不在乎我们单位时间的请求数,只需要在当下的代理可用即可。解决核心:76个IP其实还不如5个较为稳定的IP,我们如何让这76个IP变成5个可用的稳定的IP成为这个项目可以应用在实际工程中的核心。

我后面会单独依托这个项目,加入一个新的校验队列的机制,并通过新的API获得它,以在实际的项目中,获得更好的体验。

欢迎关注我的头条,以获得最新的近况。

最后

通过代理绕过很多网站的确是很好的办法,但是高端的反爬虫越来越依托于秘钥校验等等,硬实力越来越重要。代理永远都只是一个工具,爬虫工程师的核心永远都是自己的对抗能力。

\"2小时构建IP代理池\"


相关文章内容简介

1 普通,高级,超级,至尊专区介绍

专区介绍:1.普通专区(普通会员使用,可用静态2000线路)静态线路是指IP固定的线路,每条线路固定一个IP。2.高级专区(高级会员使用,可用静态,动态时效线路)动态时效线路是指线路IP会在1到20分钟内自动切换3.超级专区(超级会员使用,可用静态,动态时效,动态,混拨)混拨线路是指随机选择线路进行连接4.至尊专区(至尊会员使用,可用独享高速在内所有,网速更优) 独享线路为单人连接使用的线路,高速线路是电脑端的网速最快的线路... [阅读全文]

2 万变IP功能简介

地区覆盖全国258个城市,8000万条IP地址库 多平台支持,支持电脑windows、苹果iOS、安卓Android 支持多种IP混拨模式,全国混拨+单地区混拨+指定地区混拨 支持静态固定线路,动态高网速线路 高匿名ip,保护隐私,防追踪 多协议支持,支持L2TP/SE驱动/open协议 极速的切换体验,更换速度低于100ms 网速保证您的工作效率,自建服务器网速更快 自动切换IP,支持任意时长定时自动切换 自动清理:清理缓存cookie,提升运行速度... [阅读全文]

因为专业! 所以简单! 产品至上,价格实惠 是我们服务追求的宗旨

免费试用