【问题标题】:Pause and resuming job is not working in scrapy project暂停和恢复工作在scrapy项目中不起作用
【发布时间】:2014-06-30 23:18:13
【问题描述】:

我正在做一个从需要身份验证的站点下载图像的scrapy项目。一切正常,我能够下载图像。 我需要的是在需要时暂停和恢复蜘蛛以抓取图像。 所以我使用了scrapy手册中提到的任何内容,如下所示。 在运行蜘蛛时使用了下面提到的查询

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

要中止引擎,请按 CTRL+C。 再次使用相同的命令恢复。

但是在几分钟内恢复蜘蛛关闭后,它不会从停止的地方恢复。

更新

class SampleSpider(Spider):
name = "sample project"
allowed_domains = ["xyz.com"]
start_urls = (
    'http://abcyz.com/',
    )

def parse(self, response):
    return FormRequest.from_response(response,
                                    formname='Loginform',
                                    formdata={'username': 'Name',
                                              'password': '****'},
                                    callback=self.after_login)

def after_login(self, response):
    # check login succeed before going on
    if "authentication error" in str(response.body).lower():
        print "I am error"
        return
    else:
        start_urls = ['..','..']
        for url in start_urls:
            yield Request(url=urls,callback=self.parse_phots,dont_filter=True)
def parse_photos(self,response):
     **downloading image here**

我做错了什么?

这是我在暂停后运行蜘蛛时得到的日志

2014-05-13 15:40:31+0530 [scrapy] INFO: Scrapy 0.22.0 started (bot: sampleproject)
2014-05-13 15:40:31+0530 [scrapy] INFO: Optional features available: ssl, http11, boto, django
2014-05-13 15:40:31+0530 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'sampleproject.spiders', 'SPIDER_MODULES': ['sampleproject.spiders'], 'BOT_NAME': 'sampleproject'}
2014-05-13 15:40:31+0530 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2014-05-13 15:40:31+0530 [scrapy] INFO: Enabled downloader middlewares: RedirectMiddleware, HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2014-05-13 15:40:31+0530 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2014-05-13 15:40:31+0530 [scrapy] INFO: Enabled item pipelines: ImagesPipeline
2014-05-13 15:40:31+0530 [sample] INFO: Spider opened
2014-05-13 15:40:31+0530 [sample] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2014-05-13 15:40:31+0530 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2014-05-13 15:40:31+0530 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080

......................

2014-05-13 15:42:06+0530 [sample] INFO: Dumping Scrapy stats:
    {'downloader/request_bytes': 141184,
     'downloader/request_count': 413,
     'downloader/request_method_count/GET': 412,
     'downloader/request_method_count/POST': 1,
     'downloader/response_bytes': 11213203,
     'downloader/response_count': 413,
     'downloader/response_status_count/200': 412,
     'downloader/response_status_count/404': 1,
     'file_count': 285,
     'file_status_count/downloaded': 285,
     'finish_reason': 'shutdown',
     'finish_time': datetime.datetime(2014, 5, 13, 10, 12, 6, 534088),
     'item_scraped_count': 125,
     'log_count/DEBUG': 826,
     'log_count/ERROR': 1,
     'log_count/INFO': 9,
     'log_count/WARNING': 219,
     'request_depth_max': 12,
     'response_received_count': 413,
     'scheduler/dequeued': 127,
     'scheduler/dequeued/disk': 127,
     'scheduler/enqueued': 403,
     'scheduler/enqueued/disk': 403,
     'start_time': datetime.datetime(2014, 5, 13, 10, 10, 31, 232618)}
2014-05-13 15:42:06+0530 [sample] INFO: Spider closed (shutdown)

恢复后停止并显示

INFO: Scrapy 0.22.0 started (bot: sampleproject)
2014-05-13 15:42:32+0530 [scrapy] INFO: Optional features available: ssl, http11, boto, django
2014-05-13 15:42:32+0530 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'sampleproject.spiders', 'SPIDER_MODULES': ['sampleproject.spiders'], 'BOT_NAME': 'sampleproject'}
2014-05-13 15:42:32+0530 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2014-05-13 15:42:32+0530 [scrapy] INFO: Enabled downloader middlewares: RedirectMiddleware, HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2014-05-13 15:42:32+0530 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2014-05-13 15:42:32+0530 [scrapy] INFO: Enabled item pipelines: ImagesPipeline
2014-05-13 15:42:32+0530 [sample] INFO: Spider opened
*2014-05-13 15:42:32+0530 [sample] INFO: Resuming crawl (276 requests scheduled)*
2014-05-13 15:42:32+0530 [sample] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2014-05-13 15:42:32+0530 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2014-05-13 15:42:32+0530 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080


2014-05-13 15:43:19+0530 [sample] INFO: Closing spider (finished)
2014-05-13 15:43:19+0530 [sample] INFO: Dumping Scrapy stats:
    {'downloader/exception_count': 3,
     'downloader/exception_type_count/twisted.internet.error.DNSLookupError': 3,
     'downloader/request_bytes': 132365,
     'downloader/request_count': 281,
     'downloader/request_method_count/GET': 281,
     'downloader/response_bytes': 567884,
     'downloader/response_count': 278,
     'downloader/response_status_count/200': 278,
     'file_count': 1,
     'file_status_count/downloaded': 1,
     'finish_reason': 'finished',
     'finish_time': datetime.datetime(2014, 5, 13, 10, 13, 19, 554981),
     'item_scraped_count': 276,
     'log_count/DEBUG': 561,
     'log_count/ERROR': 1,
     'log_count/INFO': 8,
     'log_count/WARNING': 1,
     'request_depth_max': 1,
     'response_received_count': 278,
     'scheduler/dequeued': 277,
     'scheduler/dequeued/disk': 277,
     'scheduler/enqueued': 1,
     'scheduler/enqueued/disk': 1,
     'start_time': datetime.datetime(2014, 5, 13, 10, 12, 32, 659276)}
2014-05-13 15:43:19+0530 [sample] INFO: Spider closed (finished)

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    您可以运行以下命令,而不是您编写的那个命令:

    scrapy crawl somespider --set JOBDIR=crawl1
    

    要停止它,您必须运行一次 control-C!并等待scrapy停止。如果你运行两次 control-C,它将无法正常工作!

    然后为了恢复搜索再次运行此命令:

    scrapy crawl somespider --set JOBDIR=crawl1
    

    【讨论】:

    • 爬取完成后如何清理 JOBDIR?
    • “它无法正常工作”听起来像是一个错误。 scrapy 应该使用日志数据库,并定期提交。作为解决方法,创建jobdir的备份副本,并定期杀死+重新启动scrapy
    【解决方案2】:

    由于您必须进行身份验证,我假设您恢复工作时 cookie 已过期。参考:Scrapy Persistence Gotchas

    找出cookie过期或身份验证失败时的http状态码,然后你可以使用这样的东西:

    def parse(self, response):
        if response.status == 404 or response.status != 200:
            self.authenticate()
            # continue with scraping
    

    希望这有帮助。

    【讨论】:

    • 我不这么认为。我在登录后检查身份验证错误以及关于 cookie 过期我尝试在我中止后立即恢复。仍然出现同样的问题。我已将我的代码包含在问题中。请看一下
    • @user- 我已经多次遇到这个问题了。我还没有找到解决办法。检查这个stackoverflow.com/questions/13724730/…我通常会得到失败的url,将它们转储到pickle db中,并在我再次启动爬虫时加载它们。我知道这不是解决方案,只是一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多