IP代理池的获取、维护和池中有效IP的持续使用

2023-05-16

    此篇文章可以看作是对知乎分布式爬取中的IP代理设置的扩展,记录下IP代理池的获取、维护、和池中有效IP的持续使用。

这里还得感谢IP代理池的贡献者,我们可以直接在上面下载,按照说明配置好环境,启动后获取的IP(raw_proxy)和验证后的IP(useful_proxy)都会存到Redis内存中(默认),所以记得启动前开启redis-server。

    下面介绍IP代理池在我的知乎分布式爬取项目中的应用。

    下载的IP代理池程序已经对IP的获取、维护做了很完善的工作,但考虑到实际情况,我在设置了代理IP爬取知乎时,由于代理池中总会存在一些无效IP,一旦(随机)使用了这些无效IP,爬取效率就会大大降低,所以就思考能不能做到在使用过程中将无效IP剔除,将有效IP持续使用,避免IP频繁切换和无效IP的干扰?

    当然,下面就是我的一些小小改动,使用后发现爬取效率大大地提高了。

    首先设置redis方法,方便调用

class RedisClient(object):
    """
    Reids client
    """

    def __init__(self, name, host, port):
        """
        init
        :param name:
        :param host:
        :param port:
        :return:
        """
        self.name = name
        self.__conn = redis.Redis(host=host, port=port, db=0)

    def get(self):
        """
        get random result
        :return:
        """
        key = self.__conn.hgetall(name=self.name)
        # return random.choice(key.keys()) if key else None
        # key.keys()在python3中返回dict_keys,不支持index,不能直接使用random.choice
        # 另:python3中,redis返回为bytes,需要解码
        rkey = random.choice(list(key.keys())) if key else None
        if isinstance(rkey, bytes):
            return rkey.decode('utf-8')
        else:
            return rkey
            # return self.__conn.srandmember(name=self.name)

    def put(self, key):
        """
        put an  item
        :param value:
        :return:
        """
        key = json.dumps(key) if isinstance(key, (dict, list)) else key
        return self.__conn.hincrby(self.name, key, 1)
        # return self.__conn.sadd(self.name, value)

    def getvalue(self, key):
        value = self.__conn.hget(self.name, key)
        return value if value else None

    def pop(self):
        """
        pop an item
        :return:
        """
        key = self.get()
        if key:
            self.__conn.hdel(self.name, key)
        return key
        # return self.__conn.spop(self.name)

    def delete(self, key):
        """
        delete an item
        :param key:
        :return:
        """
        self.__conn.hdel(self.name, key)
        # self.__conn.srem(self.name, value)

    def inckey(self, key, value):
        self.__conn.hincrby(self.name, key, value)

    def getAll(self):
        # return self.__conn.hgetall(self.name).keys()
        # python3 redis返回bytes类型,需要解码
        if sys.version_info.major == 3:
            return [key.decode('utf-8') for key in self.__conn.hgetall(self.name).keys()]
        else:
            return self.__conn.hgetall(self.name).keys()
            # return self.__conn.smembers(self.name)

    def get_status(self):
        return self.__conn.hlen(self.name)
        # return self.__conn.scard(self.name)

    def changeTable(self, name):
        self.name = name

然后在spider中实现

from scrapy_redis_test.utils.proxy_ip_pool import RedisClient

class zhihuspider(RedisSpider):
            ...    
    redis_conn = RedisClient('useful_proxy' , 'localhost' , 6379)         
            ...    
    def parse(self, response):      
            ...        
        ip = 'http://' + self.redis_conn.get() #随机取出一个IP      
        print('crawling parse_JsonResponse,random ip:', ip)      
        yield scrapy.Request(self.answer_start_url.format(question_id, 5, 10) , callback=self.parse_answer, headers=header, meta={"question_id": question_id , 'proxy' : ip}, encoding="utf8")       
            ...   
    def parse_answer(self, response):      
            ...     
        if response.status != 200:      
            self.redis_conn.delete(response.meta.get('proxy')) #将无效IP删除     
            ip = 'http://' + self.redis_conn.get() #重新获取IP     
            print(response.meta.get('proxy') , 'is Unuseful' ,'\n' , 'refetch a ip:' , ip)    
        else:    
            ip = response.meta.get('proxy') #response返回200后,将有效IP继续使用      
            print('This ip is usefull again:' , ip)    
        yield scrapy.Request(next_url , headers=header , callback= self.parse_answer , encoding="utf8" , meta={'proxy' : ip})  
            ...

这时确保IP代理池和redis-server都在运行着,负责不断地更新代理IP,而爬取过程中会消耗IP代理池中的IP。



   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IP代理池的获取、维护和池中有效IP的持续使用 的相关文章

  • conda安装sklearn库失败

    conda install sklearn PackagesNotFoundError The following packages are not available from current channels sklearn conda
  • 找不到GLIBCXX_3.4.29问题

    参考资料 xff1a 1 2022 02 01 Windows下配置深度学习环境 xff08 Ubuntu 43 Anaconda 43 CUDA 43 Pytorch 43 gcc xff09 知乎 2 version 96 GLIBCX
  • [TW 2023] 将三图神经网络与多个隐式反馈相结合,用于社交推荐

    Incorporating A Triple Graph Neural Network with Multiple Implicit Feedback for Social Recommendation ACM Transactions o
  • [INFOCOM 2019] NeuralWalk:使用神经网络的在线社交网络中的信任评估

    NeuralWalk Trust Assessment in Online Social Networks with Neural Networks IEEE Conference Publication IEEE Xplore 摘要 xf
  • [CDC 2018] 理解压缩对抗隐私

    Understanding Compressive Adversarial Privacy IEEE Conference Publication IEEE Xplore 摘要 本文提出了一种新的隐私保护方法 xff0c 称为 压缩对抗隐私
  • 弱实体集

    弱实体 weak entity 1 定义 xff1a 有些实体集的所有属性都不足以形成主码 xff0c 这样的实体集称为弱实体集 与此相对 xff0c 其属性可以形成主码的实体集称为强实体集 通俗的说 xff1a 有些实体集的所有属性都不足
  • 理解“生成高斯随机测量矩阵”段代码;奇异值分解(SVD)的理解

    生成高斯随机测量矩阵 sampleRate 61 0 7 采样率 Phi 61 np random randn 256 256 u s vh 61 np linalg svd Phi Phi 61 u 256 sampleRate 将测量矩
  • 云服务器cvm & 云服务器ecs区别

    1 全称 cvm的英文全拼是 Cloud Virtual Machine xff08 云虚拟机 xff09 ecs的英文全拼是 Elastic Compute Service xff08 弹性计算服务 xff09 2 对比 云服务器cvm是
  • 远程连接腾讯云上的数据库

    一 准备工作 1 云服务器配置为windows server 2012 r2 2 远程连接云主机 下载rdp xff0c 输入win账号密码运行即可 2 在云主机上安装mysql xff08 1 xff09 下载mysql安装包 xff0c
  • 基于ubuntu18.04 VNC开机自启动

    本博客内容实现了RK3399 NanoPi NEO4的VNC的开机自启动 xff0c 以及原版桌面的显示 系统 xff1a FriendlyDesktop 最新版本 xff0d 基于Ubuntu 18 04 64位系统构建 易于开发 xff
  • Latex部分斜体变直体

    Latex斜体变为直体 rm即可 未使用之前的效果 xff08 x n 43 1 61 mathop arg min limits x alpha x D n xff09 为了将所有的小写x变为直体 xff0c 将所有的x替换为 rm x
  • Latex打花体

    Latex提供了三种花体 xff0c 注意使用时候提前导入包 xff0c 否则会报错 usepackage amsthm amsmath amssymb usepackage mathrsfs 使用的时候直接掉包即可 下面演示部分效果 xf
  • 遗传算法代码

    全局搜索最优算法 xff08 1 xff09 遗传算法 这里以github上的遗传算法开源库为例子 xff1a 首先我们安装GA xff08 官方说依赖库好像只支持Python 3 xff0c 但是我好像python2也安装成功了 xff0
  • ubuntu安装KVM

    ubuntu安装KVM 现在官网下载ubuntu镜像 xff0c 桌面版或者服务端都可 xff0c 这里以桌面端为例 安装之前确保磁盘有足够大的空间 xff08 这很重要 xff09 安装KVM span class token funct
  • Error: GPG check FAILED

    Error GPG check FAILED 这由于源key错误导致的dnf或者yum xff08 软件包管理器 xff09 安装软件失败 解决的方法很简单 xff0c 有些傻逼博客在那边坑人 xff0c 写的一长串解决办法都不能用 xff
  • Ubuntu彻底卸载Python

    1 查看要卸载的Python版本 若要卸载python2 xff0c 则查看命令为 python2 version 若要卸载python3 xff0c 则查看命令为 python3 version 这里我卸载python3 6 2 卸载Py
  • Ubuntu Python链接指向python3

    1 安装python3 7 sudo apt get install python3 7 2 查看python目前的指向 ls l usr bin grep python 3 删除原有的python链接 sudo rm usr bin py
  • ubuntu安装pip3

    1 安装命令 sudo apt get install python3 pip 2 查看pip3的版本以及对应的python版本 pip3 V pip 21 1 1 from usr local lib python3 7 dist pac
  • latex打双引号“ “

    latex中如果用英文输入模式的双引号键入 xff0c 则输出的结果与我们预期的不符合 xff0c 这并不是LaTeX的正确输入方式 34 test 34 输出为 xff1a 正确的输入方式为 xff1a 引号左边输入两个反引号 96 xf
  • 过拟合的原因以及解决办法(深度学习)

    过拟合 xff1a 模型在训练集上表现的非常好 xff0c 但在测试集的数据下表现很差 具体观察loss函数就是 xff0c train loss一直降低 xff0c 而test loss先降低 xff0c 而后随着epoach的增加 xf

随机推荐

  • Linux与MAC共享以及TimeMachine服务器的搭建

    自从添置了MBPR之后 xff0c 就发现使用Samba协议的话 xff0c Linux与MacOS之间传输速度相当不稳定 xff0c 我还一度以为是MBP的无线网卡问题 随后便尝试了一下AFP协议 xff0c 果然效果立现 xff0c 因
  • Python字符串转数字

    默认转换方式 xff1a num 61 int string 把二进制 xff0c 八进制 xff0c 十六进制转化为数字 xff0c python也提供了内置函数 xff0c 非常方便 xff0c 用法分别如下 xff1a num1 61
  • Linux根据进程名字彻底删除所有相关的子进程

    Linux有些时候kill 9进程pid xff0c 进程名字还会出现 xff0c 比如spark提交应用时的SparkSubmit 这是因为当前进程有其它子进程依赖 此时可以根据进程名字彻底删除 xff0c 这里我提供了一份模板 xff1
  • Python中Json文件的写入与读取

    字典写入Json文件 xff0c 代码如下 xff1a import json sparkConfDict 61 39 defaultMaxSplitBytes 39 defaultMaxSplitBytes 39 openCostInBy
  • Python获取当前工作目录以及改变工作目录

    import os print os getcwd 获取并打印当前工作目录 os chdir 34 目标目录 34 修改当前工作目录为目标目录
  • Linux 手动杀VNC进程

    步骤 方法一 1 查VNC进程 span class token function ps span ef span class token operator span span class token function grep span
  • 记录我重新安装ORBSLAM2和PX4的过程

    1 背景 xff1a 今天卸载了Ubuntu16 04 xff0c 重新装了一个Ubuntu18 04 xff0c 成功做完系统之后需要把之前的备份恢复 我的备份比较粗暴 xff0c 就是直接把 home里的文件都先复制到Windows下
  • 【网络干货】最全BGP路由协议技术详解

    一 BGP 的基本概念 自治系统AS xff08 Autonomous System xff09 AS 是指在一个实体管辖下的拥有相同选路策略的 IP 网络 BGP 网络中的每个 AS 都被分配一个唯一的 AS 号 xff0c 用于区分不同
  • Python正则表达式之 - ?: / ?= / ?!

    用圆括号将所有选择项括起来 xff0c 相邻的选择项之间用 分隔 但用圆括号会有一个副作用 xff0c 使相关的匹配会被缓存 xff0c 此时可用 放在第一个选项前来消除这种副作用 其中 是非捕获元之一 xff0c 还有两个非捕获元是 61
  • Python教程:无参装饰器

    一 xff1a 储备知识 1 args xff0c kwargs span class token keyword def span span class token function index span span class token
  • 面向对象:类关系(泛化/实现/依赖/关联/聚合/组合)

    泛化 泛化 xff0c 也称作继承关系 指面向对象中派生类与基类之间的关系 xff0c 一个类 xff08 称为子类 子接口 xff09 继承另外的一个类 xff08 称为父类 父接口 xff09 的功能 指ClassA为ClassB Cl
  • webpack基本概念及使用

    webpack是什么 xff0c 用来干什么 xff1f webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具 xff1b webpack的下载安装 官网文档地址 xff1a https webpack js o
  • stlink制作(OSHW版)

    stlink制作安排 视频在我的B站 工程主页在开源硬件平台 0 项目原由 因为我那个板载stlink的NANO板近期要还给老师了 所以我就没有板子和stlink了 xff0c 但是对于一个stmer来说 xff0c 怎么能没stlink呢
  • JS对象销毁

    JS中对象销毁需要注意的几个方面 1 销毁你创建的其他对象 xff0c 并切断应用 2 解绑绑定事件 3 this上的成员变量 xff0c 需要切断引用的要切断 4 有继承时 xff0c 需要调用父类的销毁方法 5 清除dom结构
  • px4初级视频

    链接 xff1a https pan baidu com s 1VIQcOQt I5 evMx1jnV0ZQ 提取码 xff1a 8niq
  • 找工作、备考、面试刷题网站推荐(牛客网、力扣、计蒜客、hihocoder、七月在线)以及acm竞赛oj

    不管是找工作笔试面试白板试进大厂 xff0c 还是研究生参加初试复试 xff0c 数据结构和算法都是都是重中之重 xff0c 刷题就很必要 xff0c 来拿走自己的offer 吧 xff01 一 offer刷题推荐 1 牛客网 链接 xff
  • 安装Homebrew报错 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused

    网上有很多方式 xff0c 这里只说自己解决的方式 xff0c 只针对mac 1 打开网站 https www ipaddress com 查询 raw githubusercontent com 对应的ip地址 2 将查询出来的地址映射加
  • Opencv C++ Tutorial for making your own Haar Classifier

    Opencv C 43 43 Tutorial for making your own Haar Classifier This Opencv C 43 43 Article is about how to make your own Ha
  • 2022-12-19 个人便签1:R&S CMW官方相关手册网址便签

    R amp S CMW官方相关手册网址个人便签 百度了好久CMW的SCPI命令手册 xff0c 然后突然发现官网有给手册网址 xff0c 但是百度没有收录 xff0c 故搬运粘贴到此 关键文档网址 xff1a 主要为Python xff0c
  • IP代理池的获取、维护和池中有效IP的持续使用

    此篇文章可以看作是对知乎分布式爬取中的IP代理设置的扩展 xff0c 记录下IP代理池的获取 维护 和池中有效IP的持续使用 这里还得感谢IP代理池的贡献者 xff0c 我们可以直接在上面下载 xff0c 按照说明配置好环境 xff0c 启