美文网首页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