[python3]自动化构建ip代理池

前段时间学习python爬取拉钩网的职位信息但是ip封锁只能爬到很少部分的职位信息,只好从代理入手,构建一个较为只能化的ip代理池。实现了从ip代理的网页中爬取代理ip当代理失效或被封的时候从网页爬取一个新的ip代理并验证有效后添加进ip代理池

1.先提供三个ip代理的网页:

https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list

https://www.ipip.net/

https://www.xicidaili.com/nn/

这里我用的是第一个,其他网页获取代理ip的网页解析会稍有不同,根据html自行修改。

2.获取ip代理的方法

def getProxyIp():
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    proxy = []
    try:
        #html解析获取ip代理
        url1 = 'https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list'
        resq = requests.get(url1, headers=header)
        res = '[' + resq.replace('}\n{','},{') + ']'

        _s = json.loads(res)
        ips = []
        for i in _s:
            if i['type'] == 'https':
                ip = str(i['host']) + ':' + str(i['port'])
                ips.append(ip)

        #验证每一个ip代理的有效性,然后加入到代理池中
        for x in ips:
            try:
                requests.get(url2, proxies={'http':'http://'+x},timeout = 2)
                proxy.append(x)
            except Exception as e:
                print(str(e))
    except Exception as e:
        print(str(e))
    return proxy

3.在爬虫中使用代理时先检查代理ip的可用性,若可用则该ip代理爬取网页,若不可用则从代理池中剔除,调用获取代理池方法加入新代理ip。

#调用之前的ip代理获取函数能用的ip代理进行下一步流程,不能用的剔除代理池,加入新的ip代理
def getHrefInfo(url, a):

    url_h = url 
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
    proxy_list = getProxyIp()
    proxy_ip = proxy_list[a]
    #获取新的有效ip  当原来的ip连接不上的时候删除并获得新的ip加入到代理池中
    while True:
        #ip代理验证,如果http请求回应为200,则ip代理可用。
        try:
            resq = requests.get(url_h,headers=headers,proxies={'https':'https://' + proxy_ip})
            if resq.status_code == 200:
                break
            #删除不能获取正确http回应的ip代理,并新加入不在代理池中的代理
            else:
                proxy_list.remove(proxy_ip)
                _new_ip = getProxyIp()
                for ip in _new_ip:
                    if ip not in proxy_list:
                        proxy_list.append(ip)
                        break
        #删除不能获取http回应的ip代理,并新加入不在代理池中的代理
        except Exception as e:
            proxy_list.remove(proxy_ip)
            _new_ip = getProxyIp()
            for ip in _new_ip:
                if ip not in proxy_list:
                    proxy_list.append(ip)
                    break
            proxy_ip = random.choice(proxy_list)
            print(proxy_ip + "已从代理池中移除" + '已添加新ip进入代理池' + str(e))
        time.sleep(3)

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值