一、暂停与重启
为了让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.