我是 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 是否是项目中管道类的路径。
