scrapy継承FilePipeline自作pipeline、ダウンロードファイルの名前変更方法、urlに対応するファイル接尾辞がない方法について

2585 ワード

https://www.cnblogs.com/pythonClub/p/9858830.html
Webページは一般的にリクエストしたいファイルタイプを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
    拡張プロトコルで、得られたコンテンツを正規処理した後、接尾辞を得ることができますが、一般的にはこれを先に使うことをお勧めします.しかし、このプロトコルをサポートしていない一般的なサイトではサポートされていますが、返されるファイルのタイプは直接使用できない可能性がありますので、上記のものを先に使用することをお勧めします.
    しかし、ダウンロードしたいファイルのurlがリダイレクトされているか、対応するurlに接尾辞がないかという問題があります.Webページは一般的にリクエストしたいファイルタイプをresponseのヘッダ情報content-typeに格納するので、content-type情報を取得することで、対応する操作を行うことができます.file_pathを呼び出す関数を見つける必要があります