介绍
每次爬网站的时候总是被一些网站的反爬机制给封IP,所以就需要一些代理IP,但是很多代理IP都要钱,不要钱的很多不能用,所以就写了这么个代码来爬取代理IP
思路
- 确定爬取的url路径,headers参数
- 发送请求 – requests 模拟浏览器发送请求,获取响应数据
- 解析数据 – parsel 转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
- 保存数据
准备
- PYthon3.7
- pycharm (其他的编辑器也可以)
- 模块 requests parsel time(安装模块指令
pip install requests && pip install parsel
)
目标网站
https://www.kuaidaili.com/free
步骤
第一步
导入模块,确定爬取的url路径,headers参数
1 2 3 4 5 6 7
| import requests import parsel import time
base_url = 'https://www.kuaidaili.com/free/inha/1/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
|
第二步
发送请求 – requests 模拟浏览器发送请求,获取响应数据
1 2
| response = requests.get(base_url, headers=headers) data = response.text
|
第三步
解析数据 – parsel 转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
1 2
| html_data = parsel.Selector(data) parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')
|
第四步
循环遍历,二次提取,构建代理ip字典
1 2 3 4 5 6 7 8 9 10 11
| for tr in parse_list: proxies_dict = {} http_type = tr.xpath('./td[4]/text()').extract_first() ip_num = tr.xpath('./td[1]/text()').extract_first() port_num = tr.xpath('./td[2]/text()').extract_first() proxies_dict[http_type] = ip_num + ':' + port_num print(proxies_dict) proxies_list.append(proxies_dict) time.sleep(0.5) print(proxies_list) print("获取到的代理ip数量:", len(proxies_list), '个')
|
第五步
检测代理ip可用性,用获取到的IP访问百度或者其他网站,就可以检测其可用性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| def check_ip(proxies_list): """检测ip的方法""" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'} can_use = [] for proxy in proxies_list: try: response = requests.get('http://www.baidu.com', headers=headers, proxies=proxy, timeout=0.1) if response.status_code == 200: can_use.append(proxy) except Exception as error: print(error) finally: print("当前ip:", proxy, '检测完成') return can_use
|
打印出数据
1 2 3
| can_use = check_ip(proxies_list) print("能用的代理:", can_use) print("能用的代理数量:", len(can_use))
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import requests import parsel import time def check_ip(proxies_list): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'} can_use = [] for proxy in proxies_list: try: response = requests.get('http://www.baidu.com', headers=headers, proxies=proxy, timeout=0.1) if response.status_code == 200: can_use.append(proxy) except Exception as error: print(error) finally: print("当前ip:", proxy, '检测完成') return can_use proxies_list = [] for page in range(1, 10): print('++++++++++++++++++++++++++++正在爬取第{}页数据+++++++++++++++++++++++++++++'.format(page)) base_url = 'https://www.kuaidaili.com/free/inha/{}/'.format(page) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
response = requests.get(base_url, headers=headers) data = response.text html_data = parsel.Selector(data) parse_list = html_data.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr') for tr in parse_list: proxies_dict = {} http_type = tr.xpath('./td[4]/text()').extract_first() ip_num = tr.xpath('./td[1]/text()').extract_first() port_num = tr.xpath('./td[2]/text()').extract_first() proxies_dict[http_type] = ip_num + ':' + port_num print(proxies_dict) proxies_list.append(proxies_dict) time.sleep(0.5) print(proxies_list) print("获取到的代理ip数量:", len(proxies_list), '个') can_use = check_ip(proxies_list) print("能用的代理:", can_use) print("能用的代理数量:", len(can_use))
|
使用代理访问的食用方法
就拿我们经常使用的 requests 库来说
使用代理 ip 方法如下
- 定义代理IP
1 2 3 4 5
| proxies = { 'http' : 'http://xx.xxx.xxx.xxx:xxxx', 'http' : 'http://xxx.xx.xx.xxx:xxx', .... }
|
- 使用代理
1
| response = requests.get(url,proxies=proxies)
|
和请求头放一起
接下来就可以创建一个属于自己的IP池了