如何动态添加Scrapy的start
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何动态添加Scrapy的start相关的知识,希望对你有一定的参考价值。
参考技术A 在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在其文档的架构上已经说明,但是转化到代码上好难找啊。
Python爬虫编程思想(153):使用Scrapy抓取数据,抓取多个Url
在前面的案例中都是只抓取了一个Url对应的页面,但在实际应用中,通常需要抓取多个Url,在爬虫类的start_urls变量中添加多个Url,运行爬虫时就会抓取start_urls变量中所有的Url。下面的代码在start_urls变量中添加了2个Url,运行MultiUrlSpider爬虫后,就会抓取这两个Url对应的页面。
class MultiUrlSpider(scrapy.Spider):
name = \'MultiUrlSpider\'
start_urls = [
\'https://www.jd.com\',
\'https://www.taobao.com\'
]
... ...
下面的例子通过一个文本文件(urls.txt)提供多个Url,并在爬虫类中读取urls.txt文件中的内容,然后将读取的多个Url存入start_urls变量中。最后会抓取urls.txt文件中所有的Url对应的页面,并输出页面的博文数(本例提供的Url是geekori.com的博文列表页面,如果读者使用其他的Url,需要修改分析页面的逻辑代码)。
import scrapy
class MultiUrlSpider(scrapy.Spider):
name = \'Mult
以上是关于如何动态添加Scrapy的start的主要内容,如果未能解决你的问题,请参考以下文章