Skip to main content
 首页 » 编程设计

python之Scrapy:如何获取文件下载状态

2025年05月04日21txw1958

我是 Scrapy 的新手,请多多包涵。

我有一个访问页面并下载文件的蜘蛛。最后,我想将文件名以及其他有用信息写入数据库表。

我只想在实际下载文件(而不是“更新”)时将信息写入数据库表

--> 现在,我正在努力查明文件是否已下载或是否为“最新”。

如果文件已下载,我会从日志中看到:

2017-08-22 17:25:16 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
...., 
'downloader/response_count': 5, 
'downloader/response_status_count/200': 5, 
'file_count': 1, 
-->'file_status_count/downloaded': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2017, 8, 22, 16, 25, 16, 789000), 
'item_scraped_count': 1, 
'log_count/DEBUG': 8, 
'log_count/INFO': 7, 
'request_depth_max': 1, 
.... 
2017-08-22 17:25:16 [scrapy.core.engine] INFO: Spider closed (finished) 

如果一个文件已经被下载过,Scrapy 将不会再次下载该文件,并且它有一个如下所示的日志:

2017-08-22 17:32:49 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
..., 
'downloader/response_status_count/200': 4, 
'file_count': 1, 
-->'file_status_count/uptodate': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2017, 8, 22, 16, 32, 49, 787000), 
'item_scraped_count': 1, 
'log_count/DEBUG': 7, 
'log_count/INFO': 7, 
... 
2017-08-22 17:32:49 [scrapy.core.engine] INFO: Spider closed (finished) 

一些我想获取下载状态的方法。

我查看了 scrapy 代码,我认为我要查找的函数是 pipelines 文件夹中 files.py 中的“inc_stats”:

def inc_stats(self, spider, status): 
    spider.crawler.stats.inc_value('file_count', spider=spider) 
    spider.crawler.stats.inc_value('file_status_count/%s' % status, spider=spider)   

我如何从实际的 Scrapy 代码中提取我想要的信息(“下载”或“更新”)到我的蜘蛛?

非常感谢您的帮助

请您参考如下方法:

您必须覆盖 FilesPipeline,并自行创建一个来覆盖 inc_stats 方法。

你的 settings.py 中应该有这样的东西:

ITEM_PIPELINES = { 
    ... 
    'scrapy.pipelines.files.FilesPipeline': 1 
    ... 
} 

启用scrapy自带的默认FilesPipeline,你可以创建自己的管道。在 pipelines.py 中(或任何你想要的地方)创建一个这样的类:

from scrapy.pipelines.files import FilesPipeline 
 
class CustomFilesPipeline(FilesPipeline): 
    def inc_stats(self, spider, status): 
        super(CustomFilesPipeline, self).inc_stats(spider=spider, status=status) 
        if status == 'downloaded': 
            # do whatever you want 

要启用该管道而不是来自 scrapy 的管道,请将 settings.py 更改为:

ITEM_PIPELINES = { 
    ... 
    'myproject.pipelines.CustomFilesPipeline': 1 
    ... 
}      

检查 myproject.pipelines.CustomFilesPipeline 是否是项目中管道类的路径。