首页 > 其他分享 >解锁网络无限可能:揭秘微软工程师力作——付费代理IP池深度改造与实战部署指南

解锁网络无限可能:揭秘微软工程师力作——付费代理IP池深度改造与实战部署指南

时间:2024-07-15 20:21:31浏览次数:12  
标签:IP 解锁 redis 代理 力作 proxy env 检测

基于付费代理的代理IP池

项目来源

此项目为微软某个工程师构建的代理IP池,我对此进行了改造。可以用于生产环境中的爬虫项目

阅读前建议

阅读我之前发布的爬虫基础的文章,了解代理如何获取、使用等。

分为四大模块

  1. 代理生成
    • 基于购买的付费代理接口获取代理IP,利用redis数据库的有序集合进行存储。初始序为10。
    • 检测模块检测时,若检测成功,将序变为100,若检测失败,将序减一,直至减为0则抛弃此代理
  2. 代理检测利用redis数据库的zsan方法每次从数据库中取出20条数据和游标,每20条20条地进行检测。
    • 首先检测代理IP的格式(检测是否含有冒号,若有则根据冒号进行分割获取IP和Port,分别检测IP(根据 '.' 进行分割,判断是否包含4部分且每部分是证书且在0到255之间则为有效)和Port(判断是否是整数)
    • 之后检测代理IP是否可用,找一个检测IP网站。不加代理访问并记作IP1,加代理访问记作IP2,判断IP1和IP2是否不相等,再判断加的代理IP和IP2是否相等,来决定此代理是否有效
    • 再用此代理IP去访问通用的网站(百度)或者你要爬取的网站,如果状态码在200到302之间,那么认为代理IP检测通过,将序改为100,若检测失败,则将序减一
    • 检测模块采取了协程机制,增加检测速度
  3. 代理存储
    • 封装了redis数据库的一些操作供其他三个模块调用
  4. 接口模块
    • 将代理IP从redis数据库中读出,通过Flask开接口的方式展示到前台。
    • 展示代理规则:优先随机展示序为100的,没有100的再随机展示序为10到100的

本地部署

前提:电脑已经装好了redis和redis可视化工具(如果不会装,可以私信我)

  1. conda 建立一个虚拟环境

    conda create -n new_env python=3.x  # 替换 x 为你需要的 Python 版本 
    
  2. 激活新建环境

    conda activate new_env
    
  3. 安装依赖项

    pip install -r requirments.txt
    
  4. 更改项目 settings.py 配置项

    # redis host
    REDIS_HOST = env.str('REDIS_HOST', '127.0.0.1')
    # redis port
    REDIS_PORT = env.int('REDIS_PORT', 6379)
    # redis password, if no password, set it to None
    REDIS_PASSWORD = env.str('REDIS_PASSWORD', None)
    # redis db, if no choice, set it to 0
    REDIS_DB = env.int('REDIS_DB', 0)
    # redis connection string, like redis://[password]@host:port or rediss://[password]@host:port/0
    
    # redis hash table key name
    REDIS_KEY = env.str('REDIS_KEY', 'proxies:universal')  # 前面是标识符,后面是redis数据库的表名
    
    # definition of proxy scores
    PROXY_SCORE_MAX = 100  # 如果检测成功,序设置为100
    PROXY_SCORE_MIN = 0  # 接口模块取代理时会优先取序为100的,没有的话再取PROXY_SCORE_MIN和PROXY_SCORE_MAX之间的代理,这里可以自行设置
    PROXY_SCORE_INIT = 10  # 代理IP初始序
    
    # definition of proxy number
    # PROXY_NUMBER_MAX = 50000
    PROXY_NUMBER_MAX = 5  # 代理IP池容量
    PROXY_NUMBER_MIN = 0
    
    # definition of tester
    # 检测代理IP是否有效的测试网址,但是需要改成http:避免ssl验证
    TEST_URL = env.str('TEST_URL', 'http://www.baidu.com')
    # TEST_URL = env.str('TEST_URL', 'https://antispider7.scrape.center/login')
    TEST_TIMEOUT = env.int('TEST_TIMEOUT', 10)
    TEST_BATCH = env.int('TEST_BATCH', 20)
    
    # 检测成功的状态码
    TEST_VALID_STATUS = env.list('TEST_VALID_STATUS', [200, 206, 302])
    
    # definition of api
    # 端口模块相关配置
    API_HOST = env.str('API_HOST', '127.0.0.1')
    API_PORT = env.int('API_PORT', 5555)
    API_THREADED = env.bool('API_THREADED', True)
    
    # flags of enable
    # 是否开启对应模块
    ENABLE_TESTER = env.bool('ENABLE_TESTER', True)
    ENABLE_GETTER = env.bool('ENABLE_GETTER', True)
    ENABLE_SERVER = env.bool('ENABLE_SERVER', True)
    
    
    
  5. 修改代理IP提取链接urls(proxypool/crawlers/base.py)

    @logger.catch
    def crawl(self):
        """
            crawl main method
            """
        # for url in self.urls:
        #     logger.info(f'fetching {url}')
        #     html = self.fetch(url)
        #     time.sleep(.5)
        #     for proxy in self.parse(html):#在父类里调用自身方法,此处的proxy是一页链接的代理IP列表
        #         logger.info(f'fetched proxy {proxy.string()} from {url}')
        #         yield proxy#此处的proxy是返回的是所有页的代理IP列表
        # 小象代理提取代理IP的链接
        urls = "https://api.xiaoxiangdaili.com/ip/get?appKey=1130083050647343104&appSecret=5ch2dc4Q&cnt=5&wt=json&method=https&city=&province="
        logger.info(f'fetching {urls}')
        html = self.fetch(urls)
        time.sleep(.5)
        for proxy in self.parse(html):  # 在父类里调用自身方法,此处的proxy是一页链接的代理IP列表
            logger.info(f'fetched proxy {proxy.string()} from {urls}')
            yield proxy  # 此处的proxy是返回的是所有页的代理IP列表
    
  6. 运行redis服务

  7. 运行run.py文件

  8. 通过访问http://127.0.0.1:5555即可访问代理IP池的前台

    • /all:全部代理IP
    • /random:根据规则(上面模块讲解过)展示随机一个代理IP
    • /count:代理IP数量

项目源码

https://blog.csdn.net/m0_74087660/article/details/140447563?csdn_share_tail={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"140447563"%2C"source"%3A"m0_74087660"}

有意私信我也可以(微信公众号)

更多精致内容

标签:IP,解锁,redis,代理,力作,proxy,env,检测
From: https://www.cnblogs.com/CodeRealm/p/18303890

相关文章

  • 业务终端动态分配IP-DHCP技术、DHCP中继技术
    一、为什么需要DHCP?1、许多设备(主机、无线WiFi终端等)需要动态地址的分配;2、人工手工配置任务繁琐、容易出错,比如:IP地址冲突;3、网络规模扩大、复杂度提高,网络配置越来越复杂,计算机的位置变化和数量超过可分配IP地址的数量,造成IP地址变法频繁以及IP地址不足的情况。二、什么......
  • IP协议学习笔记
    目录IP地址格式IP分类CIDR和子网掩码介绍NAT+公网、私网地址CIDR与VLSMVLSM子网划分案例练习ReferenceIP的作用类似物理世界中的地址,用于定位机器的位置。只不过物理的地址是文字描述,计算机世界的IP是一串二进制数,并且它是有一定约定和规则的。下面我来学习关于IP的一些历......
  • javaScript基础讲解
     Javascript1.基本语法入门<head>  <metacharset="UTF-8">  <title>Title</title>  /*Javascript严格区分大小写*/  <script>    varscore=62;    if(score>60&&score<70){      alert("67"......
  • 你知道怎么从IPv4转换到IPv6吗?
    在当今数字化高速发展的时代,网络已经成为我们生活中不可或缺的一部分。而在网络世界中,IP地址是实现设备间通信的关键标识。随着互联网的不断发展和设备数量的急剧增加,IPv4地址资源逐渐枯竭,IPv6应运而生。那么,你知道怎么从IPv4转换到IPv6吗?IPv4采用32位地址长度,所能提供......
  • 如何用 4 种简单方法将联系人从Mac同步到 iPhone
    毫无疑问,联系人对我们至关重要。作为Apple用户,您可能已在Mac上备份了大量联系人。当您更换新手机或希望再次访问这些重要联系人时,您可能想知道如何将联系人从Mac同步到iPhone。虽然iCloud是一个选择,但您可能也在寻找一种不依赖互联网的直接方法。本文提供了4种方法,帮助您找到答......
  • 一文带你读懂什么是独立IP
    一、什么是独立IP独立IP,就是给你的网站或服务器分的一个单独的“门牌号”,这个“门牌号”只属于你,别人不能用,也不能跟你共享。就像你的小院子,只有你有钥匙,别人进不来。二、为什么要用独立IP?1、更显身份:有了独立IP,你的网站就像是社区里那个有头有脸的人,别人一看就知道你是有实......
  • 基于Fail2ban及iptables的SSH端口爆破防御方案
    君衍.一、本篇介绍二、Fail2ban1、简介2、工作方式3、优缺点4、工作原理5、目录结构6、功能特点三、更改默认SSH端口1、更改配置文件2、重启服务四、SSH日志审计1、连接失败的IP2、失败IP次数排行3、连接成功的IP4、成功IP次数排行五、Fail2ban1、安装2、配置3、日志......
  • 解决Bandizip没有右键菜单问题:如何手动添加Bandizip的右键菜单项
    文章目录......
  • JavaScript中的new map()和new set()使用详细(new map()和new set()的区别)
    Map对象是一种键值对的集合,其中的键是唯一的,值可以重复。newSet():在JavaScript中,newSet()是用来创建一个新的Set对象的语法。Set对象是一种集合,其中的值是唯一的,没有重复的值。newSet()可以用来创建一个空的Set对象,在创建时传入一个数组或类数组对象,Set会自动去......
  • three.js基础之clipping
    clipping<canvasid="mainCanvas"></canvas><scripttype="importmap">{"imports":{"three":"./js/build/three.module.js","three/addons/":"./js/jsm/&quo......