jio文件 久其_scrapy 重写FilesPipeline(_process_request)下载重复文件、图片

在处理网站上存在多个字段对应同一文件或图片的情况时,由于URL不同但响应相同,需避免Scrapy重复下载。通过查看并重写FilesPipeline的_process_request方法,注释掉特定代码段,确保在Spider中使用'dont_filter=True',从而实现重复文件的下载。此方法同样适用于处理图片下载问题,因为ImagesPipeline继承自FilesPipeline。
摘要由CSDN通过智能技术生成
  • 背景:网站不同字段对应的文件(图片)为同一个,需要重复下载。譬如,某图片网站同一张图片在不同分类出现

  • 前置:1. 该文件URL不同,但response响应相同,以下略过;2. URL相同时,在yield request 时需要带上参数 ‘dont_filter=True’(在spider.py需要添加,使该request能到pipeline)

  • 核心:查看 FilesPipeline 的父类 MediaPipeline 源码,发现其处理请求的时候有这么两段,对其进行注释

a1f2959cffa82936c55eed5a0bc1a03c.png
  • 该部分完整源码:重写该方法是还要在 pipeline.py 导入以下
from scrapy.utils.request import request_fingerprint
from twisted.internet.defer import Deferred
from scrapy.utils.defer import mustbe_deferred
    def _process_request(self, request, info):
        fp = request_fingerprint(request)
        cb = request.callback or (lambda _: _)
        eb = request.errback
        request.callback = None
        request.errback = None

        # Return cached result if request was already seen
        # if fp in info.downloaded:
        #     return defer_result(info.downloaded[fp]).addCallbacks(cb, eb)

        # Otherwise, wait for result
        wad = Deferred().addCallbacks(cb, eb)
        info.waiting[fp].append(wad)

        # Check if request is downloading right now to avoid doing it twice
        # if fp in info.downloading:
        #     return wad

        # Download request checking media_to_download hook output first
        info.downloading.add(fp)
        dfd = mustbe_deferred(self.media_to_download, request, info)
        dfd.addCallback(self._check_media_to_download, request, info)
        dfd.addBoth(self._cache_result_and_execute_waiters, fp, info)
        # dfd.addErrback(lambda f: logger.error(
        #     f.value, exc_info=failure_to_exc_info(f), extra={'spider': info.spider})
        # )

        return dfd.addBoth(lambda _: wad)  # it must return wad at last
  • 最终大致结构图

09a0494b3e485a6fc86b145ff1f78fdb.png
  • 结语:本文虽然展示的是文件,但是图片也是一样的处理方式,因为 ImagesPipeline 本身就是继承 FilesPipeline 的;如同 我们自定义的 FilePipeline 继承 FilesPipeline ,而 FilesPipeline 又继承 MediaPipeline 一般。
### 回答1: 非常感谢你的问题。但是,作为一个语言模型,我并不能执行像真正的人类一样的文件操作。所以,我无法直接回答你如何将后缀名为jio文件转移到SQL SERVER数据库中。 不过,一般情况下,将文件存储到数据库中需要使用特定的数据库驱动程序和编程语言进行实现。你可以使用C语言中的ODBC库来连接SQL SERVER数据库并执行相关的操作。具体实现方法可以参考相关文档和教程,如Microsoft官方文档。同时,你也可以在CSDN等技术社区上寻求相关帮助和指导。 希望这些信息对你有所帮助。如果你有其他问题,欢迎随时向我提问。 ### 回答2: 是的,我知道如何将后缀名为.jio文件还原到SQL Server数据库中。 首先,我们需要打开SQL Server Management Studio(SSMS)工具。在SSMS中,我们可以创建一个数据库来存储还原后的数据。 接下来,我们需要找到还原数据库的选项。在SSMS的菜单栏中,选择“对象资源管理器”,然后展开“数据库”节点。右击鼠标,选择“还原数据库”。 在还原数据库对话框中,我们需要指定还原来源。点击“设备”,然后选择“添加”。 在添加还原源对话框中,浏览到存储.jio文件的位置,并选择.jio文件。点击“确定”。 接下来,我们需要指定还原的目标数据库。在“还原到”下拉菜单中,选择或创建一个新数据库。 然后,我们需要选择还原选项。可以选择完全还原数据库,还是部分还原。在“选项”标签中,可以选择是否要覆盖已存在的数据库,以及还原时间段等选项。 最后,点击“确定”开始还原过程。 还原过程可能需要一段时间,具体取决于.jio文件的大小和你的计算机性能。一旦还原完成,你就可以在数据库中查看还原后的数据。 需要注意的是,还原.jio文件到SQL Server数据库的过程可能因数据库版本、.jio文件的结构和其他因素而有所不同。因此,在实际操作中,请参考相关文档或向数据库管理员咨询以获得准确的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值