前段时间学习python爬取拉钩网的职位信息但是ip封锁只能爬到很少部分的职位信息,只好从代理入手,构建一个较为只能化的ip代理池。实现了从ip代理的网页中爬取代理ip当代理失效或被封的时候从网页爬取一个新的ip代理并验证有效后添加进ip代理池
1.先提供三个ip代理的网页:
https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list
https://www.ipip.net/
这里我用的是第一个,其他网页获取代理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)