爬虫入门第6课:实现代理池的校验模块

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫入门第6课:实现代理池的校验模块相关的知识,希望对你有一定的参考价值。

爬虫学习知识点及案例篇(汇总):

爬虫入门第1课:代理池概述及开发环境

爬虫入门第2课:代理池的设计

爬虫入门第3课:实现代理池思路

爬虫入门第4课:定义代理IP的数据模型类

爬虫入门第5课:实现代理池工具模块

本阶段带大家从代理池的设计开始,学习Python爬虫及项目实战,详情关注上方专栏 ↑↑↑


  • 目标: 检查指定代理IP的速度,匿名程度以及支持的协议类型.
  • 步骤:

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

import requests
import time
import json
from utils import http
import settings
from domain import Proxy
from utils.log import logger

def check_proxy(proxy):
    '''
    检测代理协议类型, 匿名程度
    :param
    :return:(协议: http和https:2,https:1,http:0, 匿名程度:高匿:0,匿名: 1, 透明:0 , 速度, 单位s )
    '''

    # 根据proxy对象构造, 请求使用的代理
    proxies = 
        'http': "http://:".format(proxy.ip, proxy.port),
        'https':"https://:".format(proxy.ip, proxy.port),
    

    http, http_nick_type, http_speed = _check_http_proxy(proxies)
    https, https_nick_type, https_speed = _check_http_proxy(proxies, False)
    if http and https:
        # 如果http 和 https 都可以请求成功, 说明支持http也支持https, 协议类型为2
        proxy.protocol = 2
        proxy.nick_type = http_nick_type
        proxy.speed = http_speed
    elif http:
        # 如果只有http可以请求成功, 说明支持http协议, 协议类型为 0
        proxy.protocol = 0
        proxy.nick_type = http_nick_type
        proxy.speed = http_speed
    elif https:
        # # 如果只有https可以请求成功, 说明支持https协议, 协议类型为 1
        proxy.protocol = 1
        proxy.nick_type = https_nick_type
        proxy.speed = https_speed
    else:
        proxy.protocol = -1
        proxy.nick_type = -1
        proxy.speed = -1

    logger.debug(proxy)
    return proxy

def _check_http_proxy(proxies, isHttp=True):
    nick_type = -1 # 匿名程度
    speed = -1 # 响应速度
    if isHttp:
        test_url = 'http://httpbin.org/get'
    else:
        test_url = 'https://httpbin.org/get'
    try:
        start = time.time()
        r = requests.get(url=test_url, headers=http.get_request_header(), timeout=settings.TIMEOUT, proxies=proxies)
        if r.ok:
            # 计算响应速度, 保留两位小数
            speed = round(time.time() - start, 2)
            # 把响应内容转换为字典
            content = json.loads(r.text)
            # 获取请求头
            headers = content['headers']
            # 获取origin, 请求来源的IP地址
            ip = content['origin']
            # 获取请求头中 `Proxy-Connection` 如果有, 说明匿名代理
            proxy_connection = headers.get('Proxy-Connection', None)

            if ',' in ip:
                # 如果 `origin` 中有','分割的两个IP就是透明代理IP
                nick_type = 2 # 透明
            elif proxy_connection:
                # 如果 `headers` 中包含 `Proxy-Connection` 说明是匿名代理IP
                nick_type = 1 # 匿名
            else:
                #  否则就是高匿代理IP
                nick_type = 0 # 高匿
            return True, nick_type, speed
        else:
            return False, nick_type, speed
    except Exception as e:
        logger.exception(e)
        return False, nick_type, speed

if __name__ == '__main__':
    proxy = Proxy('118.190.95.35', '9001')
    # proxy = Proxy('150.107.143.33', '9797')
    rs = check_proxy(proxy)
    print(proxy.protocol)
    print(rs)

以上是关于爬虫入门第6课:实现代理池的校验模块的主要内容,如果未能解决你的问题,请参考以下文章

爬虫入门第9课:实现代理池的检测模块

爬虫入门第10课:实现代理池的API模块

爬虫入门第7课:实现代理池的数据库模块

爬虫入门第11课:实现代理池的启动入口

爬虫入门第2课:代理池的设计

爬虫入门第3课:实现代理池思路