笔记-scrapy-extentions

1.      extentions

1.1.    开始

The extensions framework provides a mechanism for inserting your own custom functionality into Scrapy.

Extensions are just regular classes that are instantiated at Scrapy startup, when extensions are initialized.

在scrapy中注册扩展类需要在settings中设置EXTENSIONS参数,该参数中的每一条扩展记代表一个扩展类,记录格式是扩展类的全路径。

EXTENSIONS = {

'scrapy.extensions.corestats.CoreStats': 500,

'scrapy.extensions.telnet.TelnetConsole': 500,

}

记录的值指定扩展类加载顺序,一般不用。

停用扩展类:将 EXTENSIONS_BASE设为 None.:

EXTENSIONS = {    'scrapy.extensions.corestats.CoreStats': None,}

1.2.    自定义扩展类

首先要知道scrapy从哪调用这些自定义扩展类,

第一步开始于crawler.py的self.extensions = ExtensionManager.from_crawler(self)

找到最后:

@classmethod

def from_settings(cls, settings, crawler=None):

mwlist = cls._get_mwlist_from_settings(settings)

middlewares = []

enabled = []

for clspath in mwlist:

try:

mwcls = load_object(clspath)

if crawler and hasattr(mwcls, 'from_crawler'):

mw = mwcls.from_crawler(crawler)

elif hasattr(mwcls, 'from_settings'):

mw = mwcls.from_settings(settings)

else:

mw = mwcls()

middlewares.append(mw)

enabled.append(clspath)

核心就这句了mw = mwcls.from_crawler(crawler),官方文档描述如下:

Each extension is a Python class. The main entry point for a Scrapy extension (this also includes middlewares and pipelines) is the from_crawler class method which receives a Crawler instance. Through the Crawler object you can access settings, signals, stats, and also control the crawling behaviour.

Typically, extensions connect to signals and perform tasks triggered by them.

Finally, if the from_crawler method raises the NotConfigured exception, the extension will be disabled. Otherwise, the extension will be enabled.

意思是说扩展类必需要有from_crawler方法,scrapy会从这里初始化类。

1.2.1.   案例解说

下面是一个扩展类案例:

import logging

from scrapy import signals

from scrapy.exceptions import NotConfigured

logger = logging.getLogger(__name__)

class SpiderOpenCloseLogging(object):

def __init__(self, item_count):

self.item_count = item_count

self.items_scraped = 0

@classmethod

def from_crawler(cls, crawler):

# first check if the extension should be enabled and raise

# NotConfigured otherwise

if not crawler.settings.getbool('MYEXT_ENABLED'):

raise NotConfigured

# get the number of items from settings

item_count = crawler.settings.getint('MYEXT_ITEMCOUNT', 1000)

# instantiate the extension object

ext = cls(item_count)

# connect the extension object to signals

crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)

crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)

crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped)

# return the extension object

return ext

def spider_opened(self, spider):

logger.info("opened spider %s", spider.name)

def spider_closed(self, spider):

logger.info("closed spider %s", spider.name)

def item_scraped(self, item, spider):

self.items_scraped += 1

if self.items_scraped % self.item_count == 0:

logger.info("scraped %d items", self.items_scraped)

看下它做了什么,

from_crawler初始化了类,

然后这三句决定了什么时候调用扩展类中的函数来执行操作。

crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)

crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)

crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped)

其中的函数定义操作。

关于singals参考scrapy-singals文档。

笔记-scrapy-extentions的更多相关文章

  1. 笔记-scrapy与twisted

    笔记-scrapy与twisted Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码. 在任何情况下,都不要写阻塞的代码.阻塞的代码包括: ...

  2. Scrapy 初体验

    开发笔记 Scrapy 初体验 scrapy startproject project_name 创建工程 scrapy genspider -t basic spider_name website. ...

  3. Python Scrapy环境配置教程+使用Scrapy爬取李毅吧内容

    Python爬虫框架Scrapy Scrapy框架 1.Scrapy框架安装 直接通过这里安装scrapy会提示报错: error: Microsoft Visual C++ 14.0 is requ ...

  4. python数据类

    前言 之前有写过一篇python元类的笔记,元类主要作用就是在要创建的类中使用参数metaclass=YourMetaclass调用自定义的元类,这样就可以为所有调用了这个元类的类添加相同的属性了. ...

  5. python内置装饰器

    前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...

  6. scrapy-redis debug视频

    前言 在上一篇笔记说过会录个视频帮助理解里面的类方法,现在视频来了.只录了debug scheduler.py里面的类方法,还有spiders.py里面的类方法差不多,就不说了,自己动手丰衣足食.限于 ...

  7. scrapy-redis源码浅析

    原文链接 前言 分析这个项目的源码原因是需要有去重过滤,增量爬取两个功能,而scrapy-redis项目已经帮我们实现了,想看看他是怎么实现的.这里只贴出部分主要代码,查看时请打开源码对照,笔记有点长 ...

  8. scrapy爬虫笔记(一)------环境配置

    前言: 本系列文章是对爬虫的简单介绍,以及教你如何用简单的方法爬取网站上的内容. 需要阅读者对html语言及python语言有基本的了解. (本系列文章也是我在学习爬虫过程中的学习笔记,随着学习的深入 ...

  9. Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

    摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/, ...

  10. Learning Scrapy笔记(零) - 前言

    我已经使用了scrapy有半年之多,但是却一直都感觉没有入门,网上关于scrapy的文章简直少得可怜,而官网上的文档(http://doc.scrapy.org/en/1.0/index.html)对 ...

随机推荐

  1. atom markdown转换PDF 解决AssertionError: html-pdf: Failed to load PhantomJS module

    atom编辑器markdown转换PDF 解决AssertionError: html-pdf: Failed to load PhantomJS module. You have to set th ...

  2. 用SQL将数字转换为中文数字

    IF OBJECT_ID('fn_GetChnNum') IS NOT NULL BEGIN DROP FUNCTION dbo.fn_GetChnNum; END; GO CREATE FUNCTI ...

  3. Excel汇总多个页卡数据到一个页卡

    首先新建一个页卡放到最前面,页卡处右键,选择查看代码,选择需要汇总的页卡,输入以下代码,运行即可: 1.如果需要把全部数据都汇总到一个页卡 Sub 合并当前工作簿下的所有工作表() Applicati ...

  4. BSP和JSP里的UI元素ID生成逻辑

    CRM WebClient UI WebClient UI渲染出来的DOM元素的这些C#_W#格式的id是在哪行ABAP代码被生成出来的? 参考我的博客WebClient UI element ID ...

  5. DOM笔记(十二):又谈原型对象

    因为之前谢过一篇关于原型对象的笔记:浅谈JavaScript中的原型模式.现在我又重新看到这个话题,对原型有了进一步的理解,所以,又要谈谈原型对象. 一.理解原型对象 创建的每一个函数都有一个prot ...

  6. ASP .NET CORE 读取配置文件的方法

    老式的config文件在ASP.net core2.0中变成了appsettings.json,如果想要读取自定义配置,可以写如下代码 { "Logging": { "I ...

  7. 【HHHOJ】ZJOI2019模拟赛(十五)03.17 解题报告

    点此进入比赛 得分: \(42+10+14=66\) 排名: \(Rank\ 3\) \(Rating\):\(+53\) \(T1\):[HHHOJ200]稗田的梦中之梦(点此看题面) 暴力\(DF ...

  8. kiiti分割的数据及其处理

    kitti和cityscape的gt的分割不太一样,下边缘不再是从黑色开始的,而是直接是类别 red,green,blue = img_gt[i,j] 1.道路的颜色(紫色):128 64 128 2 ...

  9. matlab中padarray函数在numpy、python中的实现

    a = np.arange(6) a = a.reshape((2, 3)) print np.lib.pad(a, 1, 'symmetric') 运行结果: [[ ] [ ] [ ] [ ]]

  10. Thymeleaf模板引擎绕过浏览器缓存加载静态资源js,css文件

    浏览器会缓存相同文件名的css样式表或者javascript文件.这给我们调试带来了障碍,好多时候修改的代码不能在浏览器正确显示. 静态常见的加载代码如下: <link rel="st ...