scrapy継承FilePipeline自作pipeline、ダウンロードファイルの名前変更方法、urlに対応するファイル接尾辞がない方法について
2585 ワード
https://www.cnblogs.com/pythonClub/p/9858830.html
Webページは一般的にリクエストしたいファイルタイプをresponseのヘッダ情報content-typeに格納するので、content-type情報を取得することで、対応する操作を行うことができます.
1 2 3 4 5 6 7 である.
しかし、ダウンロードしたいファイルのurlがリダイレクトされているか、対応するurlに接尾辞がないかという問題があります.Webページは一般的にリクエストしたいファイルタイプをresponseのヘッダ情報content-typeに格納するので、content-type情報を取得することで、対応する操作を行うことができます.
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
を呼び出す関数を見つける必要があります