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实战-空闲时关闭爬虫的更多相关文章

  1. scrapy主动触发关闭爬虫

    在spider中时在方法里直接写 self.crawler.engine.close_spider(self, 'cookie失效关闭爬虫')   在pipeline和downloaderMiddle ...

  2. Scrapy框架实战-妹子图爬虫

    Scrapy这个成熟的爬虫框架,用起来之后发现并没有想象中的那么难.即便是在一些小型的项目上,用scrapy甚至比用requests.urllib.urllib2更方便,简单,效率也更高.废话不多说, ...

  3. 执行时关闭标识位 FD_CLOEXEC 的作用

    首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...

  4. Android退出时关闭所有Activity的方法

    Android退出时,有的Activity可能没有被关闭.为了在Android退出时关闭所有的Activity,设计了以下的类: //关闭Activity的类 public class CloseAc ...

  5. VS2015 调试中断点突然失效的解决办法、VS调试时关闭调试让浏览器继续保留页面

    VS2010 调试中断点突然失效的解决办法 问题描述:在调试前加了断点,但debug时红色的断点变成透明的圆圈加一个感叹号,执行到该处时也不会停止. 这个问题遇到过几次了,前几次都没怎么注意,有时候是 ...

  6. VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)

    <[原]关于VC运行时关闭极域电子教室的改进方法> 本文将讲资料和方法,具体实现和破解联想硬盘保护系统密码在(下)中,有关破解联想硬盘保护系统(删除它)的方法很简单,用硬盘保护卡克星就可以 ...

  7. jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单

    jq自定义下拉菜单,当用户点击非自身元素(下拉菜单)本身时关闭下拉菜单 截图: 代码如下: //关闭用户菜单 $(document).mousedown(function(e){ var _con = ...

  8. CPU 空闲时在干嘛?

    人在空闲时会发呆会无聊,计算机呢? 假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛? 有的同学可能会觉得这个问题很简 ...

  9. scrapy使用response.body时编码问题

    scrapy使用response.body时编码问题 摘要:scrapy使用response.body时编码问题.如果在使用responses.body获取数据时,需要将其编码转换成unicode,即 ...

随机推荐

  1. SpringMVC--提交表单

    今天使用AbstractCommandController做一个提交表单的样例 (1)首先,建立一个User.java package com.zk.domain; import java.util. ...

  2. 第10章-内部类II

    Think in java 读书笔记 pikzas 2019.05.05 第十章 内部类 知识点 1.什么是内部类 可以将一个类定义在另一个类的内部 class OuterClass{ class I ...

  3. php 接口获取公网ip并获取天气接口信息

    <?php function get_ip(){ //判断服务器是否允许$_SERVER if(isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWA ...

  4. Plastic Bottle Manufacturer Tips: Use Caution For Plastic Bottles

    Plastic bottles use polyester (PET), polyethylene (PE), polypropylene (PP) as raw materials, after a ...

  5. AC自动机讲解超详细

    begin:2019/5/2 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMP被Next指针搞晕了,所以咕了许久都不敢开AC自动机,近期学完之后,发现AC自动机并不是很难,特别 ...

  6. [USACO12JAN]牛联盟Bovine Alliance

    传送门:https://www.luogu.org/problemnew/show/P3043 其实这道题十分简单..看到大佬们在用tarjan缩点,并查集合并.... 蒟蒻渣渣禹都不会. 渣渣禹发现 ...

  7. 用for循环创建对象

    以下代码Demo: public class TestDemo { public static void main(String[] args) { //以创建5个student为例 int coun ...

  8. 【译】高级T-SQL进阶系列 (三)【上篇】:理解公共表表达式(CTEs)

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 伴随着SQL SERVER 2005的首次展示,微软介绍了一种新的被称为“公共表 表达式”(CTE)的查询结构. ...

  9. LA 3708 墓地雕塑(模拟)

    题目链接:https://vjudge.net/problem/UVALive-3708 这道题的思路也是比较难想. 首先根据上一题(Uva 11300)可知,要想让移动距离最短,那么至少要使一个雕塑 ...

  10. VS2017中使用C++语言编写delay函数实现延迟

    秒级别的延时 //定义函数 void delay(int sec){ time_t start_time, cur_time; // 变量声明 time(&start_time); do { ...