scrapy extention实战-空闲时关闭爬虫
scrapy extention实战
1. 空闲-关闭
使用扩展+spider_idle信号关闭爬虫。
启用扩展:settings.py
EXTENSIONS = {
#'scrapy.extensions.telnet.TelnetConsole':
None,
'extention_my.RedisSpiderSmartIdleClosedExensions': 300,
}
额外配置参数:conf.py
MYEXT_ENABLED = True
IDLE_NUMBER = 5
扩展类:
extention_my.py
#coding:utf-8
"""
----------------------------------------
description:
author: sss
date:
----------------------------------------
change:
----------------------------------------
"""
__author__ = 'sss'
import time
from scrapy import signals
from scrapy.exceptions import NotConfigured
from utils.mylogger import mylogger
logger_c = mylogger(__name__)
logger_m = logger_c.logger
class RedisSpiderSmartIdleClosedExensions(object):
def __init__(self,
idle_number, crawler):
self.crawler
= crawler
self.idle_number
= idle_number
self.idle_list
= []
self.idle_count
= 0
@classmethod
def from_crawler(cls,
crawler):
# 首先检查是否应该启用和提高扩展
# 否则不配置
from conf import MYEXT_ENABLED
if not MYEXT_ENABLED:
raise NotConfigured
# 获取配置中的时间片个数,默认为360个,30分钟
from conf import IDLE_NUMBER
as idle_number
# 实例化扩展对象
ext = cls(idle_number,
crawler)
# 将扩展对象连接到信号, 将signals.spider_idle 与 spider_idle() 方法关联起来。
crawler.signals.connect(ext.spider_opened,
signal=signals.spider_opened)
crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)
crawler.signals.connect(ext.spider_idle,
signal=signals.spider_idle)
# return the
extension object
return ext
def spider_opened(self,
spider):
logger_m.info("opened
spider %s redis spider Idle, Continuous idle limit:
%d", spider.name, self.idle_number)
def spider_closed(self,
spider):
logger_m.info("closed
spider %s, idle count %d , Continuous idle count %d",
spider.name, self.idle_count,
len(self.idle_list))
def spider_idle(self,
spider):
self.idle_count
+= 1 # 空闲计数
self.idle_list.append(time.time()) # 每次触发 spider_idle时,记录下触发时间戳
idle_list_len
= len(self.idle_list) # 获取当前已经连续触发的次数
print(self.idle_number,
self.idle_count, self.idle_list)
# 判断 当前触发时间与上次触发时间 之间的间隔是否大于5秒,如果大于5秒,说明redis 中还有key
if idle_list_len
> 2 and self.idle_list[-1] - self.idle_list[-2] > 6:
self.idle_list
= [self.idle_list[-1]]
elif idle_list_len
> self.idle_number:
# 连续触发的次数达到配置次数后关闭爬虫
logger_m.info('\n continued
idle number exceed {} Times'
'\n meet the
idle shutdown conditions, will close the reptile operation'
'\n idle
start time: {}, close spider time: {}'.format(self.idle_number,
self.idle_list[0], self.idle_list[0]))
# 执行关闭爬虫操作
self.crawler.engine.close_spider(spider,
'closespider_pagecount')
其它没有什么,主要是判断是否关闭条件的设计。
scrapy extention实战-空闲时关闭爬虫的更多相关文章
- scrapy主动触发关闭爬虫
在spider中时在方法里直接写 self.crawler.engine.close_spider(self, 'cookie失效关闭爬虫') 在pipeline和downloaderMiddle ...
- Scrapy框架实战-妹子图爬虫
Scrapy这个成熟的爬虫框架,用起来之后发现并没有想象中的那么难.即便是在一些小型的项目上,用scrapy甚至比用requests.urllib.urllib2更方便,简单,效率也更高.废话不多说, ...
- 执行时关闭标识位 FD_CLOEXEC 的作用
首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...
- Android退出时关闭所有Activity的方法
Android退出时,有的Activity可能没有被关闭.为了在Android退出时关闭所有的Activity,设计了以下的类: //关闭Activity的类 public class CloseAc ...
- VS2015 调试中断点突然失效的解决办法、VS调试时关闭调试让浏览器继续保留页面
VS2010 调试中断点突然失效的解决办法 问题描述:在调试前加了断点,但debug时红色的断点变成透明的圆圈加一个感叹号,执行到该处时也不会停止. 这个问题遇到过几次了,前几次都没怎么注意,有时候是 ...
- VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)
<[原]关于VC运行时关闭极域电子教室的改进方法> 本文将讲资料和方法,具体实现和破解联想硬盘保护系统密码在(下)中,有关破解联想硬盘保护系统(删除它)的方法很简单,用硬盘保护卡克星就可以 ...
- jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单
jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单 截图: 代码如下: //关闭用户菜单 $(document).mousedown(function(e){ var _con = ...
- CPU 空闲时在干嘛?
人在空闲时会发呆会无聊,计算机呢? 假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛? 有的同学可能会觉得这个问题很简 ...
- scrapy使用response.body时编码问题
scrapy使用response.body时编码问题 摘要:scrapy使用response.body时编码问题.如果在使用responses.body获取数据时,需要将其编码转换成unicode,即 ...
随机推荐
- 欧拉降幂 (a^t)%c 模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a,c,p,mod; ]; ll phi(ll ...
- Go_Json序列化
1. json介绍 2. json格式说明 3. json序列化 3.1 结构体序列化 package main import ( "fmt" "encoding/jso ...
- laravel Excel导入导出
1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. 该 ...
- iOS 组件化开发之使用CocoaPod制作自己的远程私有库
随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...
- qxdm,qpst,qcat抓包分析VoLTE SIP协商包
QXDM,QPST和QCAT是Qualcomm高通公司针对高通芯片的抓包分析工具. QXDM抓包分析,QPST与手机com口连接,QCAT用来分析抓包产生的isf文件(log). 使用版本: QXDM ...
- 中国大学MOOC 邮箱验证的问题
在使用 中国大学 MOOC 过程中,在PC端修改个人资料时,其中有项“常用邮箱”,于是写了QQ邮箱,结果发现一直无法验证,连邮件都无法收到. 经过多番尝试,重新使用邮箱注册的方式注册账号,然后注册成功 ...
- lintcode算法周竞赛
------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...
- nginx+keepalived实现主从高可用
设备: 主:192.168.200.122 从:192.168.200.124 安装:两台都分别安装nginx以及keepalived 两台机步骤一致一主一从 安装nginx的依赖包 [root@lo ...
- 「NOIP2018」赛道修建
传送门 Luogu 解题思路 一眼先二分(上界树的直径,下界最小边权),然后再考虑 \(\text{DP}\). 对于当前节点 \(u\),在它的所有儿子中分别返回一条匹配不完的长度最大的路径 \(M ...
- 「JSOI2013」旅行时的困惑
「JSOI2013」旅行时的困惑 传送门 由于我们的图不仅是一个 \(\text{DAG}\) 而且在形态上还是一棵树,也就是说我们为了实现节点之间互相可达,就必须把每条边都覆盖一次,因为两个点之间的 ...