系统开发环境:
操作系统 :Windows Python版本 :Python 3.X 开发工具 :Pycharm 2019 第三方模块 :requests, parsel
难度系数:⭐
1.导入库
import requests import 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/MRA58N) 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/MRA58N) 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说明:检测是否成功和你自己的网速也有关系的,如果你那边的网速太慢,即他请求百度的时间也会很长,也会不通过,所以最好在网速正常的时候测试(国内的代理拿国外的网址如Quora,facebook测试肯定也很多不通过的)
还没学到MongoDB,暂时还不能用数据库存储可用ip,学到了会更新
如果觉得对你有帮助欢迎点赞,关注,评论哦,发现写的有问题也可以指出来哈,谢谢各位大佬~