Scrapy 文件管道为不同的文件返回相同的校验和

问题描述

所以在下载文件后,我会在保存到 S3 之前按照下面的 file_downloaded 函数处理它:

 def file_downloaded(self,response,request,info,*,item=None):
    path = self.file_path(request,response=response,info=info,item=item)
    buf = BytesIO(response.body)
    processed_buf = buf

    # sending file for pdf post processing before saving to S3
    if not request.Meta['datasheet']:
       processed_buf = process_file(buf)

    checksum = md5sum(processed_buf)
    buf.seek(0)
    self.store.persist_file(path,processed_buf,info)
    return checksum

下次,当我用scrapy下载相同的文件但不需要处理它时,它只会返回相同的校验和(如上计算),甚至不会进入file_downloaded函数。 我知道scrapy 为文件url 及其校验和提供了某种缓存,尚无法弄清楚它是如何工作的以及如何更改代码以执行我需要的操作。

感谢您的帮助。 我的第一个 stackoverflow 问题 :-)

编辑: 通过在以下函数中监控请求指纹值并确保指纹是否与队列之一(下载、等待、下载)中的指纹相同来解决,我只是在其中稍作更改,因此现在有所不同。

def _process_request(self,item):
   fp = request_fingerprint(request)
   cb = request.callback or (lambda _: _)
   eb = request.errback
   request.callback = None
   request.errback = None
   while fp in info.downloaded or fp in info.downloading or fp in info.waiting:
       middle = random.randrange(1,len(fp) - 2)
       st = ''
       for i in range(0,len(fp)):
           if i != middle:
               st += fp[i]
           else:
               st += str(math.floor(int(random.random() * 10)))
       fp = st

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)