美文网首页python大法攻略
Scrapy+redis分布式爬虫(六、scrapy进阶原理)

Scrapy+redis分布式爬虫(六、scrapy进阶原理)

作者: 眼君 | 来源:发表于2020-09-16 00:15 被阅读0次

一、暂停与重启

为了让scrapy能实现暂停和重启,需要积累爬虫工作的中间状态,在启动爬虫时使用以下命令:

scrapy crawl <爬虫名> -s JOBDIR=<爬虫工作状态存储目录>

我们也可以将JOBDIR这个值设置到settings中,两种方式都能存储爬虫的中间状态,注意,不同的spider必须存储在不同的目录。

二、scrapy的去重原理

待定

信号(Signals)

scrapy使用信号来通知事情的发生, 我们可以在scrapy项目中捕捉一些信号, 使用extension来完成额外的工作或添加额外的功能。

scrapy常用的内置的信号通过以下方式调用:

from scrapy import signals


#当scrapy引擎启动时发送该信号, 该信号支持deferreds.
signals.engine_started()

#当scrapy引擎停止(例如爬取结束)时发送该信号, 该信号支持deferreds.
signals.engine_stopped()

#当item被爬取, 并通过了所有的item Pipeline后,没有被丢弃(dropped),发送该信号, 该信号支持deferreds.
signals.item_scraped(item,response,spider)
"""
item -- 爬取到的item
response -- 爬取到item的spider
spider -- 提取item的response
"""

#当item通过item Pipeline, 有些pipeline抛出异常, 丢弃item时发送该信号, 该信号支持deferreds.
signals.item_dropped(item, exception,spider)
"""
item -- 丢弃的item
response -- 爬取item的spider
spider -- 导致item被丢弃的异常(必须是DropItem的子类)
"""

#当某个spider被关闭时, 该信号被发送.该信号可以用来释放每个spider在spider_opened时被占用的资源, 该信号支持deferreds.
signals.spider_closed(spider, reason)
"""
spider -- 关闭的spider.
reason -- 描述spider被关闭的原因字符串.
"""

#当spider开始爬取时发送该信号.该信号一般用来分配spider的资源,不过其也能做其它事,该信号支持deferreds.
signals.spider_opened(spider)
"""
spider -- 开启的spider
"""

#当spider的回调函数发生错误时, 该信号被发送.
signals.spider_error(failure,response,spider)

例如, 我们需要统计有多少item通过了所有的item Pipeline,可以通过如下方法打印日志:

#spider
...
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals

class xxxSpider(scrapy.Spider):
    ...
    def __init__(self):
        self.cnt = 0
        dispatcher.connect(self.handle_item_scraped, signals.item_scraped)
    
    def handle_item_scraped(self,item,response,spider):
        self.cnt += 1
        print('已录入房子' + str(self.cnt) + '套')
    ......

扩展(Extensions)

扩展(Extensions)是一个类, 使得你能将自定义功能绑定到scrapy.

相关文章

网友评论

    本文标题:Scrapy+redis分布式爬虫(六、scrapy进阶原理)

    本文链接:https://www.haomeiwen.com/subject/zonzektx.html