关于scrapy继承FilePipeline自建pipeline,下载文件重命名的办法以及对应url没有文件后缀的办法

https://www.cnblogs.com/pythonClub/p/9858830.html

由于网页一般会将想要请求的文件类型放在response的头部信息 content-type里,我们可以通过获取content-type信息,在进行相应的操作。这样我们就需要找到调用file_path的函数

1

2

3

4

5

6

7

def file_downloaded(self, response, request, info):

        path = self.file_path(request, response=response, info=info)

        buf = BytesIO(response.body)

        checksum = md5sum(buf)

        buf.seek(0)

        self.store.persist_file(path, buf, info)

        return checksum

  • file_downloaded里,第一行就是调用了file_path函数,而且根据命名规则,十分清晰。 我们只要对上述path 做一定的修改即可。
  • 因为file_downloaded是对文件进行下载,而file_path是对文件进行存储路径的安排的,所以file_downloaded这里的response我们是可以获取相关信息的。
    获取重定向后文件后缀的方法为:
    response.headers.get('Content-Disposition') 或者 response.headers.get('Content-Type') ,如果获取不到,可以改成content-disposition 或者 content-type,举个例子
    content-disposition可能得到的是这个:
    Content-Disposition: inline;filename=Vet%20Contract%20for%20Services.pdf,split分割
    def file_downloaded(self, response, request, info):
        #path = self.file_path(request, response=response, info=info)
        #path=response.headers.get('Content-Disposition')
        #print(response.headers.get('Content-Disposition').decode("gb2312").split('=')[1])
        path=response.headers.get('Content-Disposition').decode("gb2312").split('=')[1]
        buf = BytesIO(response.body)
        checksum = md5sum(buf)
        buf.seek(0)
        self.store.persist_file(path, buf, info)
        return checksum


\color{red}{Content-Disposition} 是一个扩展协议,对得到的内容进行正则处理后,可以得到后缀,一般建议先用这个。但有的并不支持这种协议
\color{red}{Content-Type}一般网站都是支持的,但是它返回的文件类型可能没法直接使用,所以建议先使用上面的那个

但是有一个问题,如果想要下载的文件的url是经过重定向,或者对应的url没有后缀呢。
由于网页一般会将想要请求的文件类型放在response的头部信息 content-type里,我们可以通过获取content-type信息,在进行相应的操作。这样我们就需要找到调用file_path的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Scrapy和Selenium相结合可以实现浏览器模拟操作,实现一些对JavaScript渲染页面的爬取。一旦页面成功加载后,可以将数据传递给ScrapyPipeline进一步处理。 要在Scrapy中使用Selenium,首先需要在Scrapy的Spider中启用Selenium。可以使用get方法实例化一个Selenium的浏览器对象,并在spider中实现handle_httpresponse方法,在该方法中调用Selenium进行页面渲染,等待JavaScript执行完成后,将渲染后的页面HTML代码返回。 在Spider中进行页面处理后,可以通过yield将数据传递给ScrapyPipeline进行进一步处理和存储。PipelineScrapy中的一个处理组件,用于将爬取到的数据进行存储、清洗、筛选或其他处理操作。 要在Pipeline中处理数据,首先需要在settings.py文件中启用Pipeline并设置优先级。然后,在Pipeline文件中实现相应的处理逻辑,例如存储至数据库、保存至本地文件等。 对于使用Selenium渲染的页面数据,可以在Pipeline中进一步处理,例如解析HTML代码、提取指定元素等。可以使用lxml等库对页面进行解析,得到所需的数据。处理完成后,可以进行存储或其他后续操作。 总结来说,使用Scrapy和Selenium结合使用时,可以在Spider中调用Selenium进行页面渲染,等待JavaScript执行完毕后返回渲染后的页面。然后将处理后的数据通过yield传递给ScrapyPipeline进行进一步处理和存储。在Pipeline中可以加入特定的处理逻辑,对数据进行解析、存储等操作。这样就实现了Scrapy使用Selenium后调用Pipeline的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值