import requests
import parsel
import time
def chenk_ip(proxies_list):
'''检测代理 IP 的可用性'''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
can_user = []
for proxie in proxies_list:
try:
requests.get('http://www.baidu.com',headers=headers,proxies=proxie,timeout=0.2)
can_user.append(proxie)
except Exception as e:
print(e)
return can_user
# 进行一个翻页
# 构建一个空列表 ,用于将 ip (类似字典)存入此列表
proxies_list = []
for page in range(1,6):
print("======正在爬取第{}页数据======".format(page))
# 1.分析目标网页,确定 URL headers 参数
link = 'https://www.kuaidaili.com/free/inha/{}/'.format(str(page))
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
# 2.发送请求,或取响应数据
r = requests.get(link,headers=headers)
# print(r.status_code)
data = r.text
#print(data)
# 3.解析数据---parser,转换为 Selector对象,Selector对象具有xpath方法,能够对转换的数据进行
# 3.1 数据转换
html_data = parsel.Selector(data)
# 3.2 数据提取
# 找出包含数据的最小父级标签
# 一层一层的找到数据的具体位置
parsel_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')
# print(parser_list) .extract() 取出数据通常两个以上
# 代理 IP 的格式 {"ip协议":"ip地址:port"}
# 3.3 数据二次提取(保证还是 Selector 的对象--故将 .extract() 剔除 ) 循环遍历
# 构建一个空列表 ,用于将 ip (类似字典)存入此列表
for tr in parsel_list:
parsel_dict = {}
# 用于将 ip 存入当中 ,方便存入空列表中
#print(tr)
htpp_type = tr.xpath('./td[4]/text()').extract_first()
# 数据只有一个时 可以使用
# 此数据的类型是 HTTP 也就是 ip 协议
# ./ 表示当前节点 在 html 列表索引 从1 开始
#此为 第 4 个数据
#print(htpp_type)
ip_num= tr.xpath('./td[1]/text()').extract_first()
# 此数据的类型是 IP 也就是ip地址
# print(ip_num)
ip_port = tr.xpath('./td[2]/text()').extract_first()
# 此数据类型 是 PORT 也就是 port
#print(ip_port)
#print(htpp_type,ip_num,ip_port)
# 构建ip的字典
parsel_dict[htpp_type] = ip_num+':'+ip_port
#print(parsel_dict)
# 将 ip的 字典内容 存入定义好的 空列表中
proxies_list.append(parsel_dict)
time.sleep(0.5) # 针对于静态网页翻页时需要等待时间
print(proxies_list)
print("获取到的 IP 数量: ",len(proxies_list),'个')
# 调用检测代理 IP 的函数
can_user = chenk_ip(proxies_list)
print("能用的IP: ",can_user)
print("能用的IP数量: ",len(can_user),'个')
运行代码结果截图:
——————————END