author = ‘li lee’
import requests,re,time
import re
from lxml import etree
from multiprocessing import Process,Pool
import threading
#爬虫类
class Reptile():
#url
url = ''
#定义头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
# 定义空列表
res_list = []
ip_list = []
#定义初始化的方法
def __init__(self,url):
self.url = url
#定义爬取数据方法
def Get_Data(self):
#定义url
url = self.url
#发送请求,获取响应
response = requests.get(url,headers=self.headers)
return response
#定义解析数据的方法
def Prase_HTML(self,content):
#将响应文本放到HMTL中
prase_html = etree.HTML(content.text)
#获取IP
ip_html = prase_html.xpath('//table[@class="layui-table"]/tbody/tr/td[1]/text()')
#获取端口
port_html = prase_html.xpath('//table[@class="layui-table"]/tbody/tr/td[2]/text()')
#数据处理
ip = [i.replace('\n', '').replace('\t', '') for i in ip_html]
port = [i.replace('\n', '').replace('\t', '') for i in port_html]
#将ip port转为字典
vardict = list(zip(ip,port))
return vardict
#检查IP
def Check_IP(self,ip):
#检测的地址
self.url = 'http://httpbin.org/get'
#定义代理Ip
proxy_ip = {
'http':f'{ip[0]}:{ip[1]}',
'https':f'{ip[0]}:{ip[1]}'
}
try:
#发送请求
response = requests.get(self.url,headers = self.headers,proxies = proxy_ip,timeout = 1)
#获取响应
print(response.json()['origin'])
return ip
except:
print(f'ip不好使{ip}')
return False
#获取所有可用ip
def Get_IP(self):
#获取返回的结果
for res in self.res_list:
ip = res.get()
if ip:
self.ip_list.append(ip)
#进程池
def Process_Pool(self,iplist):
#创建进程池
pool = Pool(10)
#调用函数,检测iP是否好用
for i in iplist:
res = pool.apply_async(func=self.Check_IP,args=(i,))
self.res_list.append(res)
#3.关闭进程池,等待进程结束
pool.close()
pool.join()
#执行
if name == ‘main’:
#定义开始时间
start_time = time.time()
# 实例化
re = Reptile('http://www.89ip.cn/')
#调用函数
data = re.Get_Data()
vardict = re.Prase_HTML(data)
re.Process_Pool(vardict)
re.Get_IP()
print(re.ip_list)
#定义结束时间
end_time = time.time()
#总运行时间
print(end_time-start_time)