正则的应用--快代理网站

网站被封,自己写的只能获取一页数据,老师写的,不能检测是否正确

自己:

# -*- 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值