尽管知道免费代理IP有效率并不怎么好,但毕竟是天上掉下来的馅饼。还是有很多人去爬取免费代理IP用来做爬虫的,不过也得减缓爬取速度,避免影响人家网站的正常运行。
那么问题来了,如何抓取免费代理IP呢?又如何多线程验证代理IP是否有效呢?
一、抓取代理IP
首先找一个提供免费代理IP的网站,这个网上有很多,这里就不举例说明了。
import urllib.request
import urllib
import re
import time
import random
#抓取代理IP
ip_totle=[] #所有页面的内容列表
for page in range(2,6):
url='http:www.***.com/***/'+str(page)
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"}
request=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(request)
content=response.read().decode('utf-8')
print('get page',page)
pattern=re.compile('<td>(\d.*?)</td>') #截取<td>与</td>之间第一个数为数字的内容
ip_page=re.findall(pattern,str(content))
ip_totle.extend(ip_page)
time.sleep(random.choice(range(1,3)))
#打印抓取内容
print('代理IP地址 ','\t','端口','\t','速度','\t','验证时间')
for i in range(0,len(ip_totle),4):
print(ip_totle[i],' ','\t',ip_totle[i+1],'\t',ip_totle[i+2],'\t',ip_totle[i+3])
二、验证代理IP是否有效
免费代理IP的有效率很低,所以在使用前还是需要验证下代理IP是否有效比较好,这样比较节省时间。
import urllib.request
url = "http://www.***.com/***" #打算抓取内容的网页
proxy_ip={'http': '37.27.32.42:80'} #想验证的代理IP
proxy_support = urllib.request.ProxyHandler(proxy_ip)
opener = urllib.request.build_opener(proxy_support)
opener.addheaders=[("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64)")]
urllib.request.install_opener(opener)
print(urllib.request.urlopen(url).read())
三、多线程快速验证
按顺序逐个验证代理IP的有效性速度比较慢,python中有多线程模块,多线程类似于同时执行多个不同程序,使用多线程可以把占据长时间的程序中的任务放到后台去处理,在一些需要等待的任务实现上线程就比较有用了,由于篇幅原因,这里就不贴多线程的代码了,各位自己琢磨下就明白了。
最后多嘴一句,免费代理IP虽然是免费,但时间成本更昂贵,为了提升工作效率,还是建议去付费,站大爷的短效优质代理IP和一手私密代理IP都很适合用来做爬虫不妨咨询一二。