致敬经典: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一下

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐