scrapy 编写扩展 (八)

在scrapy使用过程中,很多情况下需要根据实际需求定制自己的扩展,小到实现自己的pipelines,大到用新的scheduler替换默认的scheduler。

扩展可以按照是否需要读取crawler大致分为两种,对于不需要读取的,比如pipelines的编写,只需要实现默认的方法porcess_item。需要读取的,如scheduler的编写又存在另外的方式。

1.第一种

这种处理起来比较简单,一般是根据scrapy的signals实现相应的处理。具体实现可见文档pipelines的编写方法。

2.第二种

(1)区别:

这种方式和第一种的主要区别是需要使用crawler内部信息,比如接收内部信号,如signals.spider_opened等。还体现在对设置setting.py的是否需要读取上。

(2)实现:

i)读取设置一般通过from_settings函数实现。一下是scrapy-redis中scheduler的from_settings的实现方法:
def from_settings(cls, settings):
        persist = settings.get('SCHEDULER_PERSIST', SCHEDULER_PERSIST)
        queue_key = settings.get('SCHEDULER_QUEUE_KEY', QUEUE_KEY)
        queue_cls = load_object(settings.get('SCHEDULER_QUEUE_CLASS', QUEUE_CLASS))
        dupefilter_key = settings.get('DUPEFILTER_KEY', DUPEFILTER_KEY)
        idle_before_close = settings.get('SCHEDULER_IDLE_BEFORE_CLOSE', IDLE_BEFORE_CLOSE)
        server = connection.from_settings(settings)
        return cls(server, persist, queue_key, queue_cls, dupefilter_key, idle_before_close)
ii)from_crawler()

Scrapy API的主要入口是 Crawler 的实例对象, 通过类方法 from_crawler 将它传递给扩展(extensions)。 该对象提供对所有Scrapy核心组件的访问, 也是扩展访问Scrapy核心组件和挂载功能到Scrapy的唯一途径。
实现例子如下:

def from_crawler(cls, crawler):
        instance = cls.from_settings(crawler.settings)
        return instance
iii)其它函数

想pipelines中的process_item一样,有些函数是此类型组建所必需的,整个框架在执行时会使用到次函数,所以必须加以实现。如scheduler中的enqueue_request、next_request等函数。

最难处理的也是第iii种,这需要全局了解scrapy运行逻辑,函数调用关系等。比较简单的方式是按照原组件的函数功能,函数返回值等根据自己编写的扩展的功能重新实现。就是照葫芦画瓢。

scrapy内data stream在其文档的架构上已经说明,但是转化到代码上好难找啊。

其它:

探索的提高效率的py-charm操作:

ctrl+shift+f可以全局查找字符的出现。右上角的放大镜貌似只能找函数。

时间: 2024-11-03 11:35:39

scrapy 编写扩展 (八)的相关文章

使用Node.js为其他程序编写扩展的基本方法

  这篇文章主要介绍了使用Node.js为其他程序编写扩展的基本方法 ,文中示例是通过Node让JavaScript代码与C++应用产生交互,需要的朋友可以参考下 准备开始 首先我们用下面的目录结构来创建一个节点通知(node-notify)文件夹. 代码如下: . |-- build/ # This is where our extension is built. |-- demo/ | `-- demo.js # This is a demo Node.js script to test o

使用Node.js为其他程序编写扩展的基本方法_node.js

 准备开始 首先我们用下面的目录结构来创建一个节点通知(node-notify)文件夹.   复制代码 代码如下: . |-- build/                   # This is where our extension is built. |-- demo/ |   `-- demo.js              # This is a demo Node.js script to test our extension. |-- src/ |   `-- node_gtkno

Shell脚本编写的八条可靠建议(值得收藏)_linux shell

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了. 1. 指定bash shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同. 我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的

用VS.Net编写扩展存储过程(三,完)

存储过程 昨天忙着写这个,没看奥运会,刚知道老郭和小吴又让外国人郁闷了一把.不知道奥委会是不是又要对跳水改变规则哪? 在上一节,我们把含有两车站的所有火车ID和路线信息分别读入了int *TrainID和CHAR** ppcStations,完成了最后一次读入数据的过程,下面就要处理这些数据以获得结果--就要结束了,前途是光明的,道路是平坦的--风是背后吹来的--有MM在身边陪着的--晕,忘了告诉各位兄弟,小弟现在不吃西红柿了,改吃鸡蛋,请多多关照积极配合,谢谢~~~ 第三步,寻找最短的路线 显

利用C++ Boost编写扩展Python模块

Python很强大,但已有的模块可能满足不了人民日益增长的物质文化需求,于是有时需要编写扩展模块进行完善. 可行的方案有很多:SWIG.Weave.ctypes.BOOST-- BOOST无疑是开发最快的一种方案.下面介绍下最简单的C++ helloworld程序如何变为Python的一个模块. 1. 安装Python.Boost 这里用Linux环境.Python和Boost都用源码安装,网址为: Python2.6:https://www.python.org BOOST1.57.0:htt

关于ASP.NET 2.0编写扩展存储过程的问题

SqlPipe 类 C# 复制代码 [Microsoft.SqlServer.Server.SqlProcedure()] public static void StoredProcExecuteCommand(int rating) { // Connect through the context connection. using (SqlConnection connection = new SqlConnection("context connection=true")) {

为Firefox编写一个基础浏览器扩展

回忆一下,Gawkblocker 支持您(以及其他用户)屏蔽某些您不喜欢访问的域,比如耗时的博客.Gawkblocker 有以下组件: 一个弹出窗口(显示您将要屏蔽的域) 一个可见的浏览器图标(扩展的入口点) 一个选项页面(配置您想要屏蔽以及想要访问的域) 在 Chrome 中,Gawkblocker 扩展将向每个选项卡或窗口添加一个监听程序,并与黑名单进行匹配,这会将屏蔽的 URL 重定向到一个本地页面.现在,您将学习 Gawkblocker 扩展在 Firefox 中如何变化. Gawkbl

扩展Eclipse辅助和规范开发流程

规范 如果市场上的开发工具不能满足您的需要,而自己开发 IDE 又不太现实,那本文就是您所需要的,它介绍了如何扩展 eclipse JDT 来辅助规范你的项目开发流程和帮助约束你的代码规范. 一.前言 你的小组的人员是否不按照你制订的开发流程和代码规范来开发? 你的小组的成员经常变化,经常要对新手讲述什么是 Struts,什么是MVC? 已有的开发工具的功能不能满足你的需要? 如果你遇到上述问题,请看看本文,虽然它不一定能解决好你的问题,但至少它回给你一定的启发的.本文从实际案例触发,深入浅出,

自己动手编写Eclipse扩展点

扩展(Extension)是Eclipse中一个关键的机制,plug-in利用扩展向Eclipse平台添加新功能.但是扩展不能随意地创建,必须按照扩展点(extension point)定义的规范进行明确的声明,Eclipse才能认出这些扩展.我们不仅可以使用Eclipse提供的众多现成的扩展点,而且还可以定义新的扩展点,并在该扩展点上进行扩展. 当然,扩展点的定义比较复杂.不过Eclipse为用户提供了图形化的编辑界面,我们只要输入一些信息,Eclipse就会自动生成代码,使扩展点的定义变得非