上一篇博客地址:python代理池的构建4——mongdb数据库的增删改查

一、对数据库里面代理ip检查(proxy_test.py)

#-*-coding:utf-8-*-
'''
目的:检查代理IP可用性,保证代理池中代理IP基本可用
思路
1.在proxy. _test.py中, 创建ProxyTester类 2.提供-一个run 方法,用于处理检测代理IP核心逻辑
2.1.从数据库中获取所有代理IP
2.2.遍历代理IP列表
2.3.检查代理可用性
如果代理不可用,让代理分数-1,如果代理分数等于0就从数据库中删除该代理,否则更新该代理IP
如果代理可用,就恢复该代理的分数,更新到数据库中 3.为了提高检查的速度,使用异步来执行检测任务
3.1把要检测的代理IP,放到队列中
3.2把检查一个代理可用性的代码,抽取到一一个方法中;从队列中获取代理IP,进行检查;检查完毕,
调度队列的task_done方法
3.3通过异步回调,使用死循环不断执行这个方法,
3.4开启多个一个异步任务,来处理代理IP的检测;可以通过配置文件指定异步数量 4.使用schedule 模块,每隔一定的时间,执行一-次检测任务
4.1定义类方法start ,用于启动检测模块
4.2在start方法中
创建本类对象
调用run方法
每间隔一定时间,执行一下run方法
'''
import sys
import time
import schedule
from queue import Queue
from gevent import monkey
monkey.patch_all() #打上猴子补丁,python代理池的构建3——爬取代理ip 里面有对应链接 from gevent.pool import Pool #导入代理池 sys.path.append("..")
from settings import MAX_SCORE,TEST_PROXIES_ASYNC_COUNT,TEST_PROXIES_INTERVAL
from proxy_validate.httpbin_validator import check_proxy
from db.mongo_pool import MongoPool class ProxyTest(object): def __init__(self):
self.mongo_pool = MongoPool()
self.coroutine_pool = Pool()
self.queue=Queue() #定义一个队列,用来放置mongdb数据库里面代理ip def __check_callback(self,temp):
#这个的意思就是一直等到队列里面没有代理ip了才停止执行self.__check_one这个函数
self.coroutine_pool.apply_async(self.__check_one,callback=self.__check_callback) def run(self):
proxies = self.mongo_pool.find_all() for proxy in proxies:
#print(proxy.__dict__)
self.queue.put(proxy)
#self.__check_one(proxy)
for i in range(TEST_PROXIES_ASYNC_COUNT):
#这个TEST_PROXIES_ASYNC_COUNT是一个变量,这个for就是来控制去检查ip是否可用最多开TEST_PROXIES_ASYNC_COUNT
#个数量的代理池,因为代理ip数据库中可能有好多,这样的话你给每一个代理ip都开一个协程。也会给系统带来很大负担
self.coroutine_pool.apply_async(self.__check_one,callback=self.__check_callback)
self.queue.join() #注意,这个是让先执行完的等一下没执行完得 def __check_one(self):
proxy = self.queue.get()
print(proxy.__dict__)
proxy = check_proxy(proxy)
if proxy.speed == -1:
proxy.score -= 1
if proxy.score == 0:
self.mongo_pool.delete_one(proxy)
else:
self.mongo_pool.update_one(proxy)
else:
proxy.score = MAX_SCORE
self.mongo_pool.update_proxy(proxy)
self.queue.task_done() @classmethod #类方法
def start(cls):
db = ProxyTest()
db.run()
schedule.every(TEST_PROXIES_INTERVAL).hours.do(db.run)
while True:
schedule.run_pending()
time.sleep(60) if __name__ == '__main__':
ProxyTest.start()

二、一些问题的解决

给一个python3队列讲解的链接(感觉还可以):https://www.cnblogs.com/dbf-/p/11118628.html

1.1 join

join 会在队列存在未完成任务时阻塞,等待队列无未完成任务,需要配合 task_done 使用

1.2task_done

执行一次 put 会让未完成任务 +1 ,但是执行 get 并不会让未完成任务 -1 ,需要使用 task_done 让未完成任务 -1 ,否则 join 就无法判断

1.3get

Queue.get(block=True, timeout=None)

get_nowait() = get(block=False)

阻塞 (就是你获取不到数据的意思)

当队列空了之后,get 就会阻塞,一直等待队列中有数据后再获取数据

1.4put

Queue.put(block=True, timeout=None)

block 用于设置是否阻塞, timeout 用于设置阻塞时等待时长

put_nowait() = put(block=False)

阻塞

当队列满了之后,put 就会阻塞,一直等待队列不再满时向里面添加数据

三、python代理池的构建的其他链接

python代理池的构建4——mongdb数据库的增删改查

python代理池的构建3——爬取代理ip

python代理池的构建2——代理ip是否可用的处理和检查

python代理池的构建1——代理IP类的构建,以及配置文件、日志文件、requests请求头

四、关于代码一些问题解决链接:

协程gevent模块和猴子补丁

python中schedule模块的简单使用 || importlib.import_module动态导入模块

Python中“*”和“**”的用法 || yield的用法 || ‘$in’和'$nin' || python @property的含义

python代理池的构建5——对mongodb数据库里面代理ip检查的更多相关文章

  1. python代理池的构建4——mongdb数据库的增删改查

    上一篇博客地址:python代理池的构建3--爬取代理ip 一.mongdb数据库的增删改查(Mongo_pool.py) #-*-coding:utf-8-*- ''' 实现代理池的数据库模块 ●作 ...

  2. python代理池的构建3——爬取代理ip

    上篇博客地址:python代理池的构建2--代理ip是否可用的处理和检查 一.基础爬虫模块(Base_spider.py) #-*-coding:utf-8-*- ''' 目标: 实现可以指定不同UR ...

  3. python代理池的构建2——代理ip是否可用的处理和检查

    上一篇博客地址:python代理池的构建1--代理IP类的构建,以及配置文件.日志文件.requests请求头 一.代理ip是否可用的处理(httpbin_validator.py) #-*-codi ...

  4. python代理池的构建1——代理IP类的构建,以及配置文件、日志文件、requests请求头

    一.整体结构 二.代理IP类的构建(domain.py文件) ''' 实现_ init_ 方法, 负责初始化,包含如下字段: ip: 代理的IP地址 port:代理IP的端口号 protocol: 代 ...

  5. 孤荷凌寒自学python第五十五天初识MongoDb数据库

    孤荷凌寒自学python第五十五天第一天初识MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 大家好,2019年新年快乐! 本来我想的是借新年第一天开始,正式尝试学习爬虫,结果今天偶然发现 ...

  6. python爬取大众点评并写入mongodb数据库和redis数据库

    抓取大众点评首页左侧信息,如图: 我们要实现把中文名字都存到mongodb,而每个链接存入redis数据库. 因为将数据存到mongodb时每一个信息都会有一个对应的id,那样就方便我们存入redis ...

  7. 小白学 Python 爬虫(31):自己构建一个简单的代理池

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫

    用户代理池 用户代理池就是将不同的用户代理组建成为一个池子,随后随机调用. 作用:每次访问代表使用的浏览器不一样 import urllib.request import re import rand ...

  9. Python爬虫代理池

    爬虫代理IP池 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来 ...

随机推荐

  1. 【Linux】CentOS7中修改中文字符集

    CentOS 7中字符集查看的方式是 locale -a   或者locale 如果想显示中文的话,应该修改为 LANG="zh_CN.UTF-8" 在命令行界面临时修改字符集的话 ...

  2. linux中进制转换

    方式一:使用$[]或$(()) 格式为:$[base#number]或$((base#number)),其中base为进制,number为对应进制数. 这种方式输入2进制.16进制等,但只能输出为10 ...

  3. [工作札记]03: 微软Winform窗体中ListView、DataGridView等控件的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有

    工作中,我们发现了微软.net WinForm的一个Bug,会导致窗体设计器自动生成的代码失效,这个Bug从.net4.5到最新的.net4.7.2都存在,一直没有解决.最初是我在教学工作中发现的,后 ...

  4. 如何实现微信小程序动画?添加到我的小程序动画实现详细讲解,轻松学会动画开发!附壁纸小程序源码下载链接

    为了让用户能尽可能多地使用小程序,也算是沉淀用户,现在很多小程序中,都有引导用户"添加到我的小程序"的操作提示,而且大多都是有动画效果.在高清壁纸推荐小程序首页,用户每次进入,都会 ...

  5. [Poi2012]Rendezvous

    题目描述 给定一个n个顶点的有向图,每个顶点有且仅有一条出边. 对于顶点i,记它的出边为(i, a[i]). 再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y: 从顶点a沿着 ...

  6. E1.获取Elixir/Erlang版本信息

    E1.获取Elixir/Erlang版本信息 获取Elixir版本 直接在shel中打开iex (interactive shell),就可以查到具体的版本信息: iex Erlang/OTP 22 ...

  7. 03. struts2中Action配置的各项默认值

    Action中的各项默认值 Action各项配置 <action name="helloworld" class="com.liuyong666.action.He ...

  8. pytest fixtures装饰器的使用

    一.pytest中可以使用@pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一个参数传入到测试方法中.可以使用这种方式来完成测试之前的初始化,也可以返回数据给测试函数. ...

  9. Connection Manager简称connman

    ConnMan    Connection Manager简称connman,connman是使用d-bus做为进程间通信机制来管理Linux网络链接的一种软件.在connman的d-bus接口中,有 ...

  10. Python学习【第3篇】:列表魔法

    ##########################深灰魔法-list类中提供的方法###################list 类,列表list = [1,12,9,"age" ...