zoukankan      html  css  js  c++  java
  • 断点续传

    如何设置爬虫断点续传

     

      有时候我们爬取数据跑了半天,突然报错了,例如网络中断,我们想继续爬取,不需程序从头开始爬取,可以采取下面的方案

    要想程序继续从断开的位置爬取,最好的方案就是将每次爬取的url存储到数据库中,程序每爬取一个url判断数据库中是否存在存在说明爬取过了,跳过本次url,如果没有,那就证明没有爬取过,程序继续爬取..额等等,好像有瑕疵

    假设有这么一种情况,程序爬取一个url爬了一半,就会有2种情况,要么数据库内没有url,程序继续爬取,会有重复数据,要么数据库中存在url,那么程序跳过,获取数据不完整,当前url有些数据没有获取到,采用第一种情况吧,存储数据采用set集合方式

    参考方法:https://zhuanlan.zhihu.com/p/26810901

    在scrapy中我想不用多说了,用过scrapy框架的应该都知道,本身scrapy就已经内置了一个参数jobs持久化设置

    要启用持久化支持,你只需要通过 JOBDIR 设置 job directory 选项。这个路径将会存储 所有的请求数据来保持一个单独任务的状态(例如:一次spider爬取(a spider run))。必须要注意的是,这个目录不允许被不同的spider 共享,甚至是同一个spider的不同jobs/runs也不行。也就是说,这个目录就是存储一个 单独 job的状态信息。

    怎么使用

    要启用一个爬虫的持久化,运行以下命令:

    scrapy crawl somespider -s JOBDIR=crawls/somespider-1
    

    然后,你就能在任何时候安全地停止爬虫(按Ctrl-C或者发送一个信号)。恢复这个爬虫也是同样的命令:

    scrapy crawl somespider -s JOBDIR=crawls/somespider-1
    

    保持状态

    有的时候,你希望持续保持一些运行长时间的蜘蛛的状态。这时您可以使用 spider.state 属性, 该属性的类型必须是dict. scrapy提供了内置扩展负责在spider启动或结束时,从工作路径(job directory)中序列化、存储、加载属性。

    下面这个例子展示了使用spider state的回调函数(callback)(简洁起见,省略了其他的代码):

    def parse_item(self, response):
        # parse item here
        self.state['items_count'] = self.state.get('items_count', 0) + 1
    

    持久化的一些坑

    如果你想要使用Scrapy的持久化支持,还有一些东西您需要了解:

    Cookies的有效期

    Cookies是有有效期的(可能过期)。所以如果你没有把你的爬虫及时恢复,那么他可能在被调度回去的时候 就不能工作了。当然如果你的爬虫不依赖cookies就不会有这个问题了。

    请求序列化

    请求是由 pickle 进行序列化的,所以你需要确保你的请求是可被pickle序列化的。 这里最常见的问题是在在request回调函数中使用 lambda 方法,导致无法序列化。

    例如, 这样就会有问题:

    def some_callback(self, response):
        somearg = 'test'
        return scrapy.Request('http://www.example.com', callback=lambda r: self.other_callback(r, somearg))
    
    def other_callback(self, response, somearg):
        print "the argument passed is:", somearg
    

    这样才对:

    def some_callback(self, response):
        somearg = 'test'
        return scrapy.Request('http://www.example.com', meta={'somearg': somearg})
    
    #这里的实例代码有错,应该是(译者注)
    #   return scrapy.Request('http://www.example.com', meta={'somearg': somearg}, callback=self.other_callback)
    
    def other_callback(self, response):
        somearg = response.meta['somearg']
        print "the argument passed is:", somearg
  • 相关阅读:
    Ubuntu kylin 14.04 安装问题未解决
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
    C 语言实例
  • 原文地址:https://www.cnblogs.com/yijian001/p/8848089.html
Copyright © 2011-2022 走看看