之前快代理都是直接发在网页源码中的,现在它做了一点改变,将ip信息使用js进行填充,将ip信息放到网页中去的
一、对网站进行解析
首先我们使用的是chrom浏览器自带的抓包工具
在进入快代理的网页之后,右键点击,在弹出胡选项框中点击查看网页源代码,然后我们在原网页中复制一条ip在网页源代码使用ctrl+F进行查找,我们可以发现数据出现在js当中
由于我们需要的数据在script当中,所以这时候使用正则表达式进行提取我们所需要的信息是比较方便的。
二、代码编写
思路分析
-
第一步:构造主页url地址,发送请求获取响应
-
第二步:解析数据
-
第三步:将数组的数据提取出来
-
第四步:检测代理IP的可用性
-
第五步:保存到文件中
第一步:构造主页url地址,发送请求获取响应
1.发送请求,获取响应
def send_request(self, page):
print("正在抓取第{}页".format(page))
# 目标网页,添加headers参数
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/95.0.4638.69 Safari/537.36'}
# 模拟浏览器发送请求,获取响应数据
response = requests.get(base_url, headers=headers)
resp = response.content.decode()
time.sleep(1)
return resp
第二步:解析数据
通过图片可以发现我们需要的ip数据在js代码中,所以我们需要用正则表达式来提取数据是比较好的
代码如下:
# 2.解析数据
def parse_data(self, resp):
# 准备匹配规则,这里需要注意不要漏掉"ip":和"port":后面的空格
rule = r'"ip": "(.*?)".*?"port": "(.*?)"'
# 根据规则匹配数据 匹配到的形式是:[(ip,port),(ip,port),...,(ip,port)]
matchs_list = re.findall(rule, resp, re.S)
# 返回[(ip,port)]列表
return matchs_list
第三步:将数组的数据提取出来
我们将通过正则表达式拿到的数据提取出来,将它们放入字典当中
代码如下:
matchs_list = self.parse_data(resp)
# 3.获取数据
for ip, port in matchs_list:
proxies_dict = {ip: port}
proxies_list.append(proxies_dict)
第四步: 检测代理IP的可用性
检测IP的可用性,因为是免费的IP所以有一些可能用不了,有一些访问速度较慢,这里我们让拼接好的ip去访问某度0.1
秒能访问成功的保存在另一个列表中,然后返回有效IP的列表。
代码如下:
# 3.检测代理IP
def check_ip(self, proxies_list):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
effective_ip = []
for proxies in proxies_list:
try:
response = requests.get('https://www.baidu.com/', headers=headers, proxies=proxies, timeout=0.1)
if response.status_code == 200:
effective_ip.append(proxies)
except Exception as e:
print(e)
return effective_ip
第五步:保存到文件中
将可以使用的ip保存在文件中,方便我们调用
代码如下:
# 4.保存到文件
def save(self, can_use):
file = open('IP.txt', 'w')
for i in range(len(can_use)):
s = str(can_use[i]) + '\n'
file.write(s)
file.close()
三、完整代码
完整代码如下:
import requests
import re
import time
class KuaidailiIp:
# 1.发送请求,获取响应
def send_request(self, page):
print("正在抓取第{}页".format(page))
# 目标网页,添加headers参数
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/95.0.4638.69 Safari/537.36'}
# 发送请求:模拟浏览器发送请求,获取响应数据
response = requests.get(base_url, headers=headers)
resp = response.content.decode()
time.sleep(1)
return resp
# 2.解析数据
def parse_data(self, resp):
# 准备匹配规则
rule = r'"ip": "(.*?)".*?"port": "(.*?)"'
# 根据规则匹配数据 匹配到的形式是:[(ip,port),(ip,port),...,(ip,port)]
matchs_list = re.findall(rule, resp, re.S)
# 返回[(ip,port)]列表
return matchs_list
# 3.检测代理IP
def check_ip(self, proxies_list):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
effective_ip = []
for proxies in proxies_list:
try:
response = requests.get('https://www.baidu.com/', headers=headers, proxies=proxies, timeout=0.1)
if response.status_code == 200:
effective_ip.append(proxies)
except Exception as e:
print(e)
return effective_ip
# 4.保存到文件
def save(self, can_use):
file = open('IP.txt', 'w')
for i in range(len(can_use)):
s = str(can_use[i]) + '\n'
file.write(s)
file.close()
# 主要逻辑
def run(self):
proxies_list = []
# 实现翻页,我这里只爬取了四页(可以修改5所在的数字)
for page in range(1, 5):
resp = self.send_request(page)
matchs_list = self.parse_data(resp)
# 3.获取数据
for ip, port in matchs_list:
proxies_dict = {ip: port}
proxies_list.append(proxies_dict)
print("获取到的代理IP数量:", len(proxies_list))
effective_ip = self.check_ip(proxies_list)
print("能用的代理IP数量:", len(effective_ip))
print("能用的代理IP:", effective_ip)
self.save(effective_ip)
time.sleep(1)
if __name__ == "__main__":
dlip = KuaidailiIp()
dlip.run()
通过以上的代码,我们可以爬取快代理前5页代理的ip和port,并且存储在一个文件中。