python step by step 实现IP代理池

教程大全  / 倒序浏览   ©

#楼主# 2020-2-12

跳转到指定楼层

马上注册,分享更多源码,享用更多功能,让你轻松玩转云大陆。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

python step by step 实现IP代理池

[TOC]

step1 实现代理IP的模子类

  • 目标:定义代理IP的数据模子类

  • 步骤:

    • 定义Proxy类, 继承object
    • 实现
      1. __init__
      复制代码
      方法,负责初始化,包含如下字段:
      • ip: 代理的IP地点
      • port:代理IP的端口号
      • protocol:代理IP支持的协议类型,http是1,https是0,https和http都支持是2
      • nick_type:代理IP的匿名程度,高匿:0, 匿名:1, 透明:2
      • speed:代理IP的相应速度,单位s
      • area:代理IP所在地区
      • score:代理IP的评分,用于衡量代理的可用性;默认分值可以通过配置文件进行配置,在进行代理可用性检查的时间,每遇到一次请求失败就减1分,减到0的时间从池中删除,如果检查代理可用,就规复默认分值
      • disable_domains:不可用域名列表,有些代理IP在某些域名下不可用,但是在其他域名下可
    • 在配置文件:settings.py 中定义MAX_SCORE = 50, 表示代理IP的默认最高分数
    • 提供
      1. __str__
      复制代码
      方法,返回数据字符串
    1. 代码
    复制代码

step2 实现代理IP的工具模块

  • 步骤
    • 实现日志模块
    • http模块

2.1日志模块

2.1.1 为什么要实现日志模块

  • 能够方便的对步伐进行调试
  • 能够方便记录步伐的运行状态
  • 能够方便记录错误信息

2.1.2 日志的实现

  • 目标:实现日志模块,用于记录日志
  • 前提:日志模块再网上有很多的现成的实现,我们开发的时间,通常不会自己写;而是拿来直接用
  • 步骤:
    • 拷贝日志代码到utils/log.py中
    • 把日志相关配置信息放到settings.py中
    • 修改日志代码,利用配置文件中的配置信息
  • 把日志相关配置信息放到settings.py中
  • 修改日志代码,利用配置文件中的配置信息

2.2 http模块

  • 目标:获取User-Agent的列表
  • 步骤:
    • 1.准备User-Agent的列表
    • 2.实现一个随机获取User-Agent的请求头
    1. 代码:
    复制代码

step3 实现代理池的校验模块

  • 目标:检查代理IP速度,匿名程度以及支持的协议类型
  • 步骤:
    • 检查代理IP速度 和 匿名程度:
      • 代理IP速度:就是从发送请求到获取响应的时间间隔
      • 匿名程度检查:
          1. http://httpbin.org/get
          复制代码
          1. https://httpbin.org/get
          复制代码
          发送请求
        • 如果 响应的
          1. origin
          复制代码
          中有',' 分割的两个IP就是透明代理IP
        • 如果 响应的
          1. headers
          复制代码
          中包含
          1. Proxy-Connection
          复制代码
          说明是匿名代理IP
        • 否则就是高匿代理IP
    • 检查代理IP协议类型
      • 如果
        1. http://httpbin.org/get
        复制代码
        发送请求可以成功, 说明支持http协议
      • 如果
        1. https://httpbin.org/get
        复制代码
        发送请求可以成功, 说明支持https协议
  • 代码

setp 4 实现代理池的数据库模块

  • 作用: 用于对

    1. proxies
    复制代码
    集合进行数据库的相关操作

  • 目标:实现对数据库增编削查相关操作

  • 步骤:

    1.再

    1. init
    复制代码
    中,建立数据毗连,获取要操作的集合,再
    1. del
    复制代码
    方法中关闭数据库毗连

    2.提供基础的增编削查功能

    ​ i.实现插入功能

    ​ ii.实现修改功能

    ​ iii.实现删除功能:根据代理的IP删除代理

    ​ iv.查询所有代理IP的功能

    3.提供代理API模块利用的功能

    ​ i.实现查询功能:根据条件进行查询,可以指定查询数量,先分数降序,速度升序排,保证优质的代理IP

    ​ 再上面

    ​ ii.实现根据协议类型 和 要访问网站的域名, 获取代理IP列表

    ​ iii.实现根据协议类型 和 要访问网站的域名,随机获取一个代理IP

    ​ iv.实现把指定域名添加到指定IP的disable_domain列表中。

完整代码

step5 实现代理池的爬虫模块

5.1 爬虫模块的需求

  • 需求:抓取各个代理IP网站上的免费代理IP,进行检测,如果可用存储到数据库中

  • 需要抓取的代理IP页面如下:

    • 西刺代理爬虫:http://www.xicidaili.com/nn/1

    • ip3366代理爬虫:http://www.ip3366.net/free/?stype=1&page=1

    • 实现快代理https://www.kuaidaili.com/free/inha/1/

    • proxylistplus:https://list.proxylistplus.com/Fresh-HTTP-Proxy-List-1

    • 66ip:http://www.66ip.cn/1.html5.2

5.2爬虫模块的设计思路

  • 通用爬虫:通过指定URL列表,分组XPATH和组内XPATH,来提取不同网站的代理IP
    • 原因:代理IP网站的页面结构都是table,页面结构雷同
  • 具体爬虫:用于抓取具体代理IP网站
    • 通过继承通用爬虫实现具体网站的抓取,一般只需要指定爬取的URL列表,分组的XPATH和组内的XPATH就可以了,
    • 如果该网站有特殊的反爬手段,可用通过重写某些方法实现反爬
  • 爬虫运行模块:启动爬虫,抓取代理IP, 进行检测,如果可用,就存储到数据库中;
    • 通过配置文件来控制启动那些爬虫,增加扩展性;如果将来我们遇到返回json格式的代理网站,单独写下一个爬虫配置下就好了

5.3实现通用爬虫

  • 目标:实现一个可以通过指定不同URL列表,分组的XPATH和详情的XPAHT,从不同页面上提取数据的通用爬虫

  • 步骤:

    1.在base_spider.py文件中,定义一个BaseSpider类, 继承object

    2.提供三个类成员变量:

    • urls:代理IP网址的URL的列表
    • group_xpath:分组XPATH, 获取包含代理IP信息标签列表的XPATH
    • detail_xpath:组内XPATH, 获取代理IP详情的信息XPATH,格式为{'ip':'xx', 'port':}

    3.提供初始化方法,传入爬虫URL列表,分组XPATH,详情(组内)XPATH

    4.对外提供一个获取代理IP的方法

    • 遍历URL列表,获取URL
    • 根据发送请求,获取页面数据
    • 解析页面,提取数据,封装Proxy对象
    • 返回Proxy对象列表
  • 代码:

5.4实现具体的爬虫类

  • 目标:通过继承通用爬虫,实现多个具体爬虫,方便从各个免费代理IP网站上抓取代理IP

  • 步骤:

​ 1.实现 西刺代理爬虫:http://www.xicidaili.com/nn/1

  • 定义一个类,继承通用爬虫类(BasicSpider)
  • 提供uls, group_xpath和 detail_xpath
    2.实现ip3366代理爬虫:http://www.ip3366.net/free/?stype=1&page=1
  • 定义一个类,继承通用爬虫类(BasicSpider)
  • 提供uls, group_xpath和 detail_xpath
    3.实现快代理https://www.kuaidaili.com/free/inha/1/
  • 定义一个类,继承通用爬虫类(BasicSpider)
  • 提供uls, group_xpath和 detail_xpath
    4.实现proxylistplus:https://list.proxylistplus.com/Fresh-HTTP-Proxy-List-1
  • 定义一个类,继承通用爬虫类(BasicSpider)
  • 提供uls, group_xpath和 detail_xpath

5.5实现运行爬虫模块

  • 目标:根据配置文件信息,加载爬虫,抓取代理IP,进行校验,如果可用,写入到数据库中
  • 思路:
    • 在run_spider.py中,创建RunSipder类
    • 提供一个运行爬虫的 run 方法,作为运行爬虫的人口,实现核心的处理逻辑
      • 根据配置文件信息,获取爬虫对象列表
      • 遍历爬虫对象列表,获取爬虫对象,遍历爬虫对象的get_proxies方法,获取代理IP
      • 检测代理IP(代理IP检测模块)
      • 如果可用,写入数据库
      • 处理异常,防止一个爬虫内部出错了,影响其他爬虫
    • 利用异步来执行每个爬虫任务,以提高抓取代理IP服从
        1. int
        复制代码
        方法中创建协程池对象
      • 把处理一个代理爬虫的代码抽到一个方法
      • 利用异步执行这个方法
      • 利用协程的
        1. join
        复制代码
        方法,让当前线程等待队列任务的完成
    • 利用
      1. schedule
      复制代码
      模块,实现每个一定的时间,执行当前对象的run方法
    1. 步骤
    复制代码
      1. run_spider.py
      复制代码
      中,创建RunSpider类
    • 修改
      1. setting.py
      复制代码
      增加代理IP爬虫的配置信息

step6实现代理池的检测模块

  • 目的:检查代理IP的可用性,保证代理池中代理IP基本可用

  • 思路:

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

    2.提供一个

    1. run
    复制代码
    方法,用于处理检测代理IP的核心逻辑

    ​ i.从数据库中获取所有代理IP

    ​ ii.遍历代理IP列表

    ​ iii.检查代理可用性

    ​ iv.如果代理不可用,让代理愤俗-1, 如果代理分数等于0就从数据库中删除

    ​ v.如果代理可用,就规复该代理的分数,跟新到数据库

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

    ​ i.在 init 方法,创建队列和协程池

    ​ ii.把要检测的代理IP,放到队列中

    ​ iii.把检查一个代理可用性的代码抽取到一个方法中,从队列中获取代理IP,进行检查

    ​ iv.通过异步回调,利用死循环不断执行这个方法,

    ​ v.开启多个异步任务,来处理代理IP的检测,可用通过配置文件指定异步数量

    4.利用

    1. schedule
    复制代码
    模块,每隔一定的时间,执行一次检测任务

    ​ i.定义类方法

    1. start
    复制代码
    用于启动检测模块

    ​ ii.在

    1. start
    复制代码
    方法中

    ​ i.创建本类对象

    ​ ii.调用run方法

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

  • 步骤

    • 在proxy_test.py中,创建ProxyTeter类
    • 提供一个 run 方法,用于检查代理IP的可用性
  • 代码:

step7实现代理池的API模块

  • 目标:
    • 为爬虫提供高可用代理IP的服务接口
  • 步骤 :
    • 实现根据协议类型和域名,提供随机的获取高可用代理IP的服务
    • 实现根据协议类型和域名,提供获取多个高可用代理IP的服务
    • 实现给指定的IP追加不可用域名的服务
  • 实现:
    • 在proxy_api.py中,创建
      1. ProxyApi
      复制代码
    • 实现初始方法
      • 初始一个Flask的服务
      • 实现根据协议类型和域名,提供随机的获取高可用代理IP的服务
        • 可用通过
          1. protocol
          复制代码
          1. domain
          复制代码
          参数对IP进行过滤
          1. protocol
          复制代码
          :当前请求的协议类型
          1. domain
          复制代码
          :当前请求域名
      • 实现根据协议类型和域名,提供获取多个高可用代理IP的服务
        • 可用通过
          1. protocol
          复制代码
          1. domain
          复制代码
          参数对IP进行过滤
      • 实现给定的IP追加不可用域名的服务
        • 如果在获取IP的时间,有指定域名参数,将不在获取该IP,从而进一步提高代理IP的可用性。
      • 实现run方法,用于启动Flask的Web服务
      • 实现start的类方法,用于通过类名,启动服务
  • 代码:

step8实现代理池的启动入口

  • 目标:把
    1. 启动爬虫
    复制代码
    ,
    1. 启动检测代理IP
    复制代码
    1. 启动WEB服务
    复制代码
    统一到一起
  • 思路:
    • 开启三个进程,分别用与启动爬虫, 检测代理IP, WEB服务
  • 步骤:
    • 定义一个run 方法用于启动代理池
      • 定义一个列表, 用于存储要启动的进程
      • 创建 启动爬虫 的进程,添加到列表中
      • 创建 启动检测 的进程,添加到列表中
      • 创建 启动提供API服务 的进程, 添加到列表中
      • 遍历进程列表,启动所有进程
      • 遍历进程列表,让主进程等待子进程的完成
      1. if __name__ == '__main__':
      复制代码
      中调用run方法
  • 代码:
分享淘帖
回复

使用道具

您的回复是对作者最大的奖励

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

仄言_8093

新手猿

  • 主题

    4

  • 帖子

    4

  • 关注者

    0

Archiver|手机版|小黑屋|云大陆 | 赣ICP备18008958号-4|网站地图
Powered by vrarz.com!  © 2019-2020版权所有云大陆