首页 > 编程知识 正文

代理IP提取,抓取代理ip

时间:2023-05-06 00:32:32 阅读:197780 作者:3759

系统开发环境:

操作系统 :Windows
Python版本 :Python 3.X
开发工具 :Pycharm 2019
第三方模块 :requests, parsel

难度系数:⭐

一、先上图看最终效果

二、需要了解的知识点:

1.导入库

import requestsimport parsel

如果导入库下面有红线,说明你还没有安装这个库,pycharm下找到最下方的Terminal 进行库的安装

下面看到有successful就是安装成功了,我这里因为先前安装过,所以他会显示已经存在不会显示安装成功,对了安装这里还涉及到一个超时问题,因为请求的是国外的服务器速度很慢可能会安装不成功,需要借助国内的镜像安装,可以参考我另一篇文章的1.3 如何永久换源
2.找出每页的ip地址的规律

2.1 如图

这里可以看到快代理的网址规律为 https://www.kuaidaili.com/free/inha/每页页数/
即:“https://www.kuaidaili.com/free/inha/{}/”.format(page)

2.2 通过for循环可以得到每页的网址(注意下range范围不要写太大写成1000多,如果你用的是自己的ip的话,你请求太快自已的ip也可能被封,可以通过拿到已经测试成功的ip池去爬取网站剩余的ip)
即:for page in range(1, 11):

for page in range(1, 11): print("=======正在爬取{}页数据=======".format(page)) # 初始网址 base_url = "https://www.kuaidaili.com/free/inha/{}/".format(page) # print(base_url) # 伪装请求头 headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/lydld) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36"} response = requests.get(url=base_url, headers=headers) # text返回的是文本内容,而content返回的是能请求到的所有内容以二进制数据展示,content.decode()返回所有内容,默认是utf-8解码 data = response.text # print(response) # 3.解析数据 -- parsel 转换Selector对象,Selector对象封装了xpath,re的方法,能够对转化的数据进行处理 html_data = parsel.Selector(data) # 打印的 <> 在python中表示对象 # print(html_data) parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr') # print(parse_list) # 代理ip的结构 {‘ip的协议’:'ip:ip端口'} for tr in parse_list: http_type = tr.xpath('./td[4]/text()').extract_first() # 协议类型 ip_num = tr.xpath('./td[1]/text()').extract_first() # ip地址 ip_port = tr.xpath('./td[2]/text()').extract_first() # ip端口 # print(http_type, ip_num, ip_port) proxies_dict = {} proxies_dict[http_type] = ip_num + ":" + ip_port print("保存成功: ", proxies_dict) proxies_list.append(proxies_dict)

3.检测ip是否可用
这里以请求百度为例,timeout超过0.06秒响应的会报错,即为请求失败,需要捕获异常,你也可以自行更改timeout上的响应时间
通过判断状态码是否为200(200即为请求成功)筛选出可用ip

def check_ip(proxies_list): headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/lydld) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36"} can_use = [] for ip in proxies_list: # 通过请求百度查看当前ip的响应速度,在0.06秒内返回响应,否则就会报错 try: response = requests.get(url="https://www.baidu.com/", headers=headers, proxies=ip, timeout=0.06) if response.status_code == 200: can_use.append(ip) print("当前代理ip: ", ip, "=====合格可用=====") except Exception: print("当前代理ip: ", ip, "请求超时,检测不合格") return can_use 三、全部代码 import requestsimport parsel"""可用ip代理的获取"""def check_ip(proxies_list): headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/lydld) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36"} can_use = [] for ip in proxies_list: # 通过请求百度查看当前ip的响应速度,在0.06秒内返回响应,否则就会报错 try: response = requests.get(url="https://www.baidu.com/", headers=headers, proxies=ip, timeout=0.06) if response.status_code == 200: can_use.append(ip) print("当前代理ip: ", ip, "=====合格可用=====") except Exception: print("当前代理ip: ", ip, "请求超时,检测不合格") return can_useproxies_list = []# range左闭右开for page in range(1, 11): print("=======正在爬取{}页数据=======".format(page)) # 初始网址 base_url = "https://www.kuaidaili.com/free/inha/{}/".format(page) # print(base_url) # 伪装请求头 headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/lydld) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36"} response = requests.get(url=base_url, headers=headers) # text返回的是文本内容,而content返回的是能请求到的所有内容以二进制数据展示,content.decode()返回所有内容,默认是utf-8解码 data = response.text # print(response) # 3.解析数据 -- parsel 转换Selector对象,Selector对象封装了xpath,re的方法,能够对转化的数据进行处理 html_data = parsel.Selector(data) # 打印的 <> 在python中表示对象 # print(html_data) parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr') # print(parse_list) # 代理ip的结构 {‘ip的协议’:'ip:ip端口'} for tr in parse_list: http_type = tr.xpath('./td[4]/text()').extract_first() # 协议类型 ip_num = tr.xpath('./td[1]/text()').extract_first() # ip地址 ip_port = tr.xpath('./td[2]/text()').extract_first() # ip端口 # print(http_type, ip_num, ip_port) proxies_dict = {} proxies_dict[http_type] = ip_num + ":" + ip_port print("保存成功: ", proxies_dict) proxies_list.append(proxies_dict)print(proxies_list)print('获取到的代理ip数量', len(proxies_list))print("=========================正在检测ip质量=========================")can_use = check_ip(proxies_list)print("质量高的代理ip", can_use)print('质量高的代理ip数量', len(can_use))

说明:检测是否成功和你自己的网速也有关系的,如果你那边的网速太慢,即他请求百度的时间也会很长,也会不通过,所以最好在网速正常的时候测试(国内的代理拿国外的网址如Quora,facebook测试肯定也很多不通过的)

还没学到MongoDB,暂时还不能用数据库存储可用ip,学到了会更新

如果觉得对你有帮助欢迎点赞,关注,评论哦,发现写的有问题也可以指出来哈,谢谢各位大佬~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  •  标签:  
  • IP   ip