网站被封,自己写的只能获取一页数据,老师写的,不能检测是否正确
自己:
# -*- coding:utf-8 -*-
import re
from urllib import request, parse
import xlwt
from fake_useragent import UserAgent
agent = UserAgent()
class IPSpider(object):
def __init__(self):
self.url = 'https://www.kuaidaili.com/free/inha/1/'
self.headers = {'User-Agent': agent.random}
# 记录html源代码
self.html = ''
# 创建好工作簿
self.workbook = xlwt.Workbook(encoding='utf-8')
# 添加数据表
self.sheet = self.workbook.add_sheet('代理ip')
# 写入表头s
self.sheet.write(0, 0, 'ip')
self.sheet.write(0, 1, '端口号')
self.sheet.write(0, 2, '代理ip')
# 声明写入数据时记录行数的属性
self.count = 1
# 请求函数 max_time='1520296373'缺省参数
def get_html(self):
# 根据max_time拼接完整的url地址
# url = self.url + next_page
# print(url)
req = request.Request(self.url, headers=self.headers)
# 发起请求,接收响应
response = request.urlopen(req)
# 转换html utf-8 gbk gb2312 记录拿到的html源代码
self.html = response.read().decode('utf-8')
def get_next_page(self):
# pattern = re.compile('<div id="listnav.*?<li>第</li><li>.*?<a href="(.*?)">.*?</a>', re.S)
pattern = re.compile('<li><a href="(.*?)".*?>.*?</a></li>', re.S)
res = re.findall(pattern, self.html)
print(res)
# for r in res:
# link = r[0].split('"')[1]
# print(link)
# 获取数据
def get_data(self):
pattern = re.compile('<td data-title="IP">(.*?)</td>.*?<td data-title="PORT">(.*?)</td>', re.S)
res = re.findall(pattern, self.html)
print(res)
def start(self):
self.get_html()
self.get_next_page()
self.get_data()
if __name__ == '__main__':
dlip = IPSpider()
dlip.start()
老师:
思想:
1.初始化函数 urlheaders html result_ip(存放可用ip)
2.start函数 for 循环遍历前十页的ip 调用请求函数和解析函数
3.请求函数 url ip 如果ip为None ,不使用代理ip发起请求获取html源代码,ip不为None说明这次请求是用来测试代理ip是否可用的
4.解析函数 根据正则匹配ip_port数据,for循环遍历每一个ip_port,使用get_html请求函数检测该ip_port是否可用,如果可用判断result_ip是否已有,如果没有添加到列表中
5.检测已有是否可用函数 for循环遍历已有ip,使用get_html检测是否可用,将不可用的去除,如果可用ip小于5个,重新爬取
# -*- coding:utf-8 -*-
import re
from urllib import request, parse
import time
from fake_useragent import UserAgent
agent = UserAgent()
"""
1.初始化函数 urlheaders html result_ip(存放可用ip)
2.start函数 for 循环遍历前十页的ip 调用请求函数和解析函数
3.请求函数 url ip 如果ip为None ,不使用代理ip发起请求获取html源代码,ip不为None说明这次请求是用来测试代理ip是否可用的
4.解析函数 根据正则匹配ip_port数据,for循环遍历每一个ip_port,使用get_html请求函数检测该ip_port是否可用,如果可用判断result_ip是否已有,如果没有添加到列表中
5.检测已有是否可用函数 for循环遍历已有ip,使用get_html检测是否可用,将不可用的去除,如果可用ip小于5个,重新爬取
"""
class IpSpider(object):
def __init__(self):
self.url = 'https://www.kuaidaili.com/free/inha/'
self.headers = {'User-Agent': agent.random}
self.html = ''
# 保存筛选后的可用 ip
self.result_ip = []
def get_html(self, url, ip=None):
"""
:param url: 访问的地址
:param ip: 代理ip 若为None 则不使用代理ip
:return:
"""
req = request.Request(url, headers=self.headers)
# 如果ip不为None
if ip:
# 测试ip是否可用
proxy_h = request.ProxyHandler({
'http': ip
})
openner = request.build_opener(proxy_h)
request.install_opener(openner)
response = openner.open(req, timeout=0.5)
else:
res = request.urlopen(req)
self.html = res.read().decode('utf-8')
# 解析函数
def parse_ip(self):
pattern = re.compile('<tr.*?<td.*?>(.*?)</td>.*?<td.*?>(.*?)</td>', re.S)
res = re.findall(pattern, self.html)
# print(detail_res)
# for循环遍历找到ip
for ip, port in res:
ip_port = ip + ':' + port
try:
self.get_html('http://www.baidu.com', ip)
except Exception as e:
print('{},{}不可用'.format(e, ip_port))
else:
# 判断可用的代理ip是否在列表中
if ip_port not in self.result_ip:
# 将可用ip放入列表中
self.result_ip.append(ip_port)
# 检测列表中的ip是否还可以使用
def check_ip(self):
ip_list = []
for ip in self.result_ip:
try:
self.get_html('http://www.baidu.com', ip)
except Exception as e:
# ip_list.remove(ip)
pass
else:
ip_list.append(ip)
self.result_ip = ip_list
# 如果剩余的可用代理ip少于5个,重新爬取
if len(self.result_ip) < 5:
self.start()
# 启动爬虫
def start(self):
for x in range(1, 11):
while True:
try:
# 拼接完整的url地址
url = self.url + str(x)
self.get_html(url)
self.parse_ip()
time.sleep(1)
except Exception as e:
print(e)
else:
break
if __name__ == '__main__':
ip = IpSpider()
ip.start()