简易灵活的Ipproxypool检测机制
致敬经典:https://github.com/qiyeboy/IPProxyPool 。这里提供了经典的IP代理使用方案,需要的小伙伴可蹲点到此项目,但使用过程中发现对python3版本支持的并不友好,问题较多。于是,这里提供了简易灵活的Ipproxypool检测机制。源码我发布到了github:https://github.com/SimonWang00/ez_IPProxyPool
致敬经典:https://github.com/qiyeboy/IPProxyPool 。这里提供了经典的IP代理使用方案,需要的小伙伴可蹲点到此项目,但使用过程中发现对python3版本支持的并不友好,问题较多。于是,这里提供了简易灵活的Ipproxypool检测机制。源码我发布到了github:https://github.com/SimonWang00/ez_IPProxyPool
1、获取IP
一般人获取IP的渠道:购买IP和免费网站提供。
花钱买的IP代理不靠谱,良莠不齐,好用的IP也非常少。自己获取,推荐的网站:无忧代理,西刺代理等网站,写个小爬虫获取即可。
def get_ip():
## 获取IP,此处是购买的API,这里做了修改,不可用
url = 'http://tvp.daxiangdaili.com/ip/?num=100&format=json&tid=55892564567477'
resp = requests.get(url=url).content
proxies = json.loads(resp)
return proxies
2、检测IP
检测的网站可以自己定义嘛!默认是百度翻译,爬什么网站就用什么网站检测,帮助我们筛选出自己爬虫契合度最高的IP。
def baidu_check(proxies,url='http://fanyi.baidu.com/'):
'''
检测代理的类型
:param 用来需要检测的网站,建议爬什么网站就用什么网站检测IP
:return: speed是IP的响应速度
'''
try:
start = time.time()
r = requests.get(url,timeout=5, proxies=proxies)
if r.status_code == 200:
speed = round(time.time() - start, 2)
protocol= 0
types=0
else:
print('检测失败!',r.status_code)
speed = 10000
protocol = -1
types = -1
except Exception as e:
print('访问错误:',e)
speed = 10000
protocol = -1
types = -1
return protocol, types, speed
3、实施检测
日常用的分布式爬虫,IP池子存到了redis中,池子大小200,可满足数百个爬虫同时使用是没问题的。后台启动脚本,nohup python ez_IPproxypool.py & ,就会实现不断检测IP,补充IP。
flag = True
while flag:
pool = redis.ConnectionPool(host='10.101.3.178', port=6379, db=8)
r = redis.StrictRedis(connection_pool=pool)
nums = r.scard("proxies")
# time.sleep(0.2)
while nums <200:
print('########## ***添加IP*** ###########')
proxies = get_ip()
for proxy in proxies:
time.sleep(0.1)
protocol, types, speed = baidu_check(proxy)
if speed <= 0.3:
print('IP:%s , TYPE:%s , SPEED:%s'%(proxy,types,speed))
r.sadd('proxies',proxy)
nums = r.scard("proxies")
while nums >= 200:
print('########## ***开始检测IP*** ###########')
time.sleep(3)
menbers = r.smembers('proxies')
for IP in menbers:
time.sleep(0.3)
IP = IP.decode('utf-8')
protocol, types, speed = baidu_check(IP)
print('正在检测的IP:%s , 检测结果是:%s'%(IP,speed))
if speed > 0.35:
r.srem('proxies',IP)
nums = r.scard("proxies")
print('检测后删除IP:%s ' %IP)
这里抛砖引玉,需要的功能可根据需要自己丰富完善!欢迎到我的GitHub:https://github.com/SimonWang00/ez_IPProxyPool start一下
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)