Python_01_IP代理池_实现代理池的检测模块

    目的:检测代理ip的可用性,保证代理池中代理ip基本可用

    思路:

      1.在proxy_test.py中,创建ProxyTester类

      2.提供一个run方法,用于处理检测代理ip的核心逻辑

        1)从数据库中获取所有代理ip

        2)遍历代理ip列表

        3)检查代理ip可用性

          如果不可用,代理分数-1,如果代理分数=0则删除该代理,否则更新代理ip

          如果可用,恢复代理ip的分数,更新到数据库中

      3.为了提高检查的速度,使用异步来执行检测任务

        1)把要检测的代理ip放到队列中

        2)把检查一个代理可用性的代码抽取到一个方法中,从队列中获取代理ip,进行检查,检查完毕,调用队列的task_done方法

        3)通过异步回调,是用死循环不断执行这个方法

        4)开启多个异步任务,来处理代理ip的检测,可以通过配置文件指定异步数量

      4.使用schedule模块,每隔一定时间,执行一次检测任务

        1)定义类方法start,用于启动检测模块

        2)在start方法中,

          a.创建本类对象

          b.调用run\方法

          c.每隔一定时间,执行一下run方法

代码:

from gevent import monkey
monkey.patch_all()
from gevent.pool import Pool
from queue import Queue
import schedule
import time

from core.db.mongo_pool import MongoPool
from core.proxy_validate.httpbin_validator import check_proxy
from settings import MAX_SCORE, TEST_PROXIES_ASYNC_COUNT, TEST_PROXIES_INTERVAL

"""
9. 实现代理池的检测模块
目的: 检查代理IP可用性, 保证代理池中代理IP基本可用
思路
    1. 在proxy_test.py中, 创建ProxyTester类
    2. 提供一个 run 方法, 用于处理检测代理IP核心逻辑
        2.1 从数据库中获取所有代理IP
        2.2 遍历代理IP列表
        2.3 检查代理可用性
        2.4 如果代理不可用, 让代理分数-1, 如果代理分数等于0就从数据库中删除该代理, 否则更新该代理IP
        2.5 如果代理可用, 就恢复该代理的分数, 更新到数据库中
    3. 为了提高检查的速度, 使用异步来执行检测任务
        3.1 在`init`方法, 创建队列和协程池
        3.2 把要检测的代理IP, 放到队列中
        3.3 把检查一个代理可用性的代码, 抽取到一个方法中; 从队列中获取代理IP, 进行检查; 检查完毕, 调度队列的task_done方法
        3.4 通过异步回调, 使用死循环不断执行这个方法,
        3.5 开启多个一个异步任务, 来处理代理IP的检测; 可以通过配置文件指定异步数量
   4. 使用schedule模块, 每隔一定的时间, 执行一次检测任务
        4.1 定义类方法 start, 用于启动检测模块
        4.2 在start方法中
            4.2.1 创建本类对象
            4.2.2 调用run方法
            4.2.3 每间隔一定时间, 执行一下, run方法
"""

class ProxyTester(object):

    def __init__(self):
        # 创建操作数据库的MongoPool对象
        self.mongo_pool = MongoPool()
        # 3.1 在`init`方法, 创建队列和协程池
        self.queue = Queue()
        self.coroutine_pool = Pool()

    def __check_callback(self, temp):
        self.coroutine_pool.apply_async(self.__check_one_proxy, callback=self.__check_callback)

    def run(self):
        # 提供一个 run 方法, 用于处理检测代理IP核心逻辑
        # 2.1 从数据库中获取所有代理IP
        proxies = self.mongo_pool.find_all()
        # 2.2 遍历代理IP列表
        for proxy in proxies:
            #  3.2 把要检测的代理IP, 放到队列中
            self.queue.put(proxy)

        #  3.5 开启多个一个异步任务, 来处理代理IP的检测; 可以通过配置文件指定异步数量
        for i in range(TEST_PROXIES_ASYNC_COUNT):
            #  3.4 通过异步回调, 使用死循环不断执行这个方法,
            self.coroutine_pool.apply_async(self.__check_one_proxy, callback=self.__check_callback)

        # 让当前线程, 等待队列任务完成
        self.queue.join()

    def __check_one_proxy(self):
        # 检查一个代理IP的可用性
        #  3.3 把检查一个代理可用性的代码, 抽取到一个方法中;
        # 从队列中获取代理IP, 进行检查; 检查完毕
        proxy = self.queue.get()
        #  2.3 检查代理可用性
        proxy = check_proxy(proxy)
        # 2.4 如果代理不可用, 让代理分数-1,
        if proxy.speed == -1:
            proxy.score -= 1
            # 如果代理分数等于0就从数据库中删除该代理
            if proxy.score == 0:
                self.mongo_pool.delete_one(proxy)
            else:
                # 否则更新该代理IP
                self.mongo_pool.update_one(proxy)
        else:
            # 2.5 如果代理可用, 就恢复该代理的分数, 更新到数据库中
            proxy.score = MAX_SCORE
            self.mongo_pool.update_one(proxy)
        # 调度队列的task_done方法
        self.queue.task_done()

    @classmethod
    def start(cls):
        #  4.2.1 创建本类对象
        proxy_tester = cls()
        #  4.2.2 调用run方法
        proxy_tester.run()

        # 4.2.3 每间隔一定时间, 执行一下, run方法
        schedule.every(TEST_PROXIES_INTERVAL).hours.do(proxy_tester.run)
        while True:
            schedule.run_pending()
            time.sleep(1)

if __name__ == ‘__main__‘:
    # pt = ProxyTester()
    # pt.run()
    ProxyTester.start()

原文地址:https://www.cnblogs.com/tkg1314/p/12634621.html

时间: 2024-08-01 11:19:51

Python_01_IP代理池_实现代理池的检测模块的相关文章

代理模式_静态代理

一.代理模式_静态代理 来到北京.首先第一件事就是租房子.然而北京租房子80%的都要通过中介,中介获得房屋出租的权限,出租房屋给房客.我们以这个很现实很亲近我们生活的例子来认识代理模式中的静态代理. 二.代理模式中的角色划分 2.1抽象角色:把真实角色和代理角色所共有的行为抽成一个接口或者抽象类. 2.2真实角色:被代理角色所代理的角色. 2.3代理角色:代理真实角色做某些工作. 三.静态代理示例 3.1抽象角色(把真实角色房东和代理角色中介所共有的行为出租房屋抽象成一个接口) package

Python_01_IP代理池_实现代理池的爬虫模块的执行方法

目标:根据配置问价内心戏,加载爬虫,抓取代理ip,进行校验,如果可用写入到数据库中 思路: 1.在run_spider.py中,创建RunSpider类 2.提供一个运行爬虫的run方法,作为运行爬虫的入口,实现核心的处理逻辑 根据配置文件信息,获取爬虫对象列表 遍历爬虫对象列表,获取爬虫对象,遍历爬虫对象的get_proxies方法,获取代理ip 检测代理ip 如果可用则写入数据库 处理异常,防止一个爬虫内部出错,影响其他爬虫的使用 3.使用异步来执行每一个爬虫任务,以提高抓取代理ip的效率

Python_01_IP代理池_实现代理池的校验模块

目标:检验代理ip速度,匿名程度以及支持的协议类型 步骤: 1.检查代理ip速度和匿名程度: a.代理IP速度就是从发送请求到获取相应的时间间隔 b.匿名程度检查 对http://httpbin.org/get或https://httpbin.org/get发送请求如果相应的origin中有'.'分割的两个ip就是透明代理ip,如果相应的headers包含proxy-connection说明是匿名代理ip,否则就是高匿代理ip c.检查代理ip的协议类型 如果http://httpbin.org

Python_01_IP代理池_实现代理池的爬虫模块的及具体爬虫

目标:通过继承通用爬虫,实现多个具体爬虫,分别从各个免费代理ip网站上抓取代理ip 步骤 1.实现西刺代理,ip3366代理和快代理还有proxylistplus代理 定义一个类,继承通用爬虫类 提供urls,group_xpath和detail_xpath 2.实现66ip爬虫 定义一个类,继承通用爬虫类 提供urls,group_xpath和detail_xpath 由于ip66网页进行js+cookie反爬,需要重写父类的get_page_from_url()方法 代码: import t

设计模式_代理模式_动态代理

转自:https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/index.html 动态代理是指在运行时动态生成代理类.即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader.与静态处理类相比,动态类有诸多好处.首先,不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦.如果接口有变动,则真实主题和代理类都要修改,不利于系统维护:其次,使用一些动态代理的生成

总结代理模式 并根据数据库连接池原理来模拟实现自己的数据库连接池工具类

代理模式 需求:对系统中已有的某个类的功能,进行扩展(增强) 要求:在不修改源码的情况下,对已有的功能进行增强 静态代理 抽象接口:保证包含增强功能的对象和原有功能的对象,对外提供相同的方法 目标对象:封装了原有功能 代理对象:封装了增强功能和原有功能(通过持有一个目标对象的引用实现) 问题:代码不够灵活,产生大量冗余工作 动态代理 动态代理的实现API: Proxy : 帮助程员产生代理对象,提供产生代理类和代理对象的静态方法 InvocationHandler : 句柄接口,拦截到,所有代理

Spring之AOP原理_动态代理

面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programming).声明式编程是和命令式编程(Imperative Programming)相对的概念.我们平时使用的编程语言,比如C++.Java.Ruby.Python等,都属命令式编程.命令式编程的意思是,程序员需要一步步写清楚程序需要如何做什么(How to do What).声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么

Apache2.4+Tomcat集群_反向代理配置

Apache2.4+Tomcat集群_反向代理配置 测试环境:Apache反代做为前端反向代理,后端任意,此处我用做windwos,其实linux与windwos配置原理都一样,只是根据公司需求来做. 需求:        要求基于ssl访问, 301域名跳转, session sticky方式来接收请求, 有故障隔离的作用,以至于在其中一台上线时可以把用户请求转发到另一台. 1.资源下载: Apache(windows安装包)下载路径 http://www.apachelounge.com/d

.net core使用HttpClient发送代理请求_程序内抓包_Fiddler抓包

原文:.net core使用HttpClient发送代理请求_程序内抓包_Fiddler抓包 前言:  通过Fiddler抓取浏览器请求数据,相信大家已经都会用了,我们知道Fiddler是通过在本机计算器添加一个默认的代理服务器来实现的抓包数据的,端口号为:8888. 其实当我们打开Fiddler的设置也可以看到: 然后查看本地计算器的网络代理设置: 基于上面的原理,Fiddler就实现了经过本机计算器请求的数据抓包了... 那么,我们通过C#代码,在.net Core中使用HttpClient