Scrapy文件下载如何使用自定义文件名
Scrapy file download how to use custom filename
为了我的scrapy project I'm currently using the FilesPipeline。下载的文件以其 URL 的 SHA1 哈希作为文件名存储。
[(True,
{'checksum': '2b00042f7481c7b056c4b410d28f33cf',
'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
'url': 'http://www.example.com/files/product1.pdf'}),
(False,
Failure(...))]
如何使用我的自定义文件名来存储文件?
在上面的示例中,我希望文件名是 "product1_0a79c461a4062ac383dc4fade7bc09f1384a3910.pdf" 所以我保持唯一性但使文件名可见。
作为起点,我探索了我项目的 pipelines.py
,但没有取得多大成功。
import scrapy
from scrapy.pipelines.images import FilesPipeline
from scrapy.exceptions import DropItem
class MyFilesPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
return request.meta.get('filename','')
def get_media_requests(self, item, info):
file_url = item['file_url']
meta = {'filename': item['name']}
yield Request(url=file_url, meta=meta)
在我的 settings.py
中包含此参数
ITEM_PIPELINES = {
#'scrapy.pipelines.files.FilesPipeline': 300
'io_spider.pipelines.MyFilesPipeline': 200
}
已询问 similar question,但它定位的是图像而不是文件。
我们将不胜感激。
file_path
应该 return 您文件的路径。在您的代码中,file_path
returns item['name']
就是您文件的路径。请注意,默认情况下 file_path
calculates SHA1 hashes。所以你的方法应该是这样的:
def file_path(self, request, response=None, info=None):
original_path = super(MyFilesPipeline, self).file_path(request, response=None, info=None)
sha1_and_extension = original_path.split('/')[1] # delete 'full/' from the path
return request.meta.get('filename','') + "_" + sha1_and_extension
试试这个file_path
方法:
def file_path(self, request, response=None, info=None):
url = request if not isinstance(request, Request) else request.url
media_guid = hashlib.sha1(to_bytes(url)).hexdigest()
path, media_ext = os.path.splitext(url)
media_name = os.path.split(path)[1]
return '%s_%s%s' % (media_name, media_guid, media_ext)
(注意:这是未经测试的代码)
为了我的scrapy project I'm currently using the FilesPipeline。下载的文件以其 URL 的 SHA1 哈希作为文件名存储。
[(True,
{'checksum': '2b00042f7481c7b056c4b410d28f33cf',
'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
'url': 'http://www.example.com/files/product1.pdf'}),
(False,
Failure(...))]
如何使用我的自定义文件名来存储文件?
在上面的示例中,我希望文件名是 "product1_0a79c461a4062ac383dc4fade7bc09f1384a3910.pdf" 所以我保持唯一性但使文件名可见。
作为起点,我探索了我项目的 pipelines.py
,但没有取得多大成功。
import scrapy
from scrapy.pipelines.images import FilesPipeline
from scrapy.exceptions import DropItem
class MyFilesPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
return request.meta.get('filename','')
def get_media_requests(self, item, info):
file_url = item['file_url']
meta = {'filename': item['name']}
yield Request(url=file_url, meta=meta)
在我的 settings.py
ITEM_PIPELINES = {
#'scrapy.pipelines.files.FilesPipeline': 300
'io_spider.pipelines.MyFilesPipeline': 200
}
已询问 similar question,但它定位的是图像而不是文件。
我们将不胜感激。
file_path
应该 return 您文件的路径。在您的代码中,file_path
returns item['name']
就是您文件的路径。请注意,默认情况下 file_path
calculates SHA1 hashes。所以你的方法应该是这样的:
def file_path(self, request, response=None, info=None):
original_path = super(MyFilesPipeline, self).file_path(request, response=None, info=None)
sha1_and_extension = original_path.split('/')[1] # delete 'full/' from the path
return request.meta.get('filename','') + "_" + sha1_and_extension
试试这个file_path
方法:
def file_path(self, request, response=None, info=None):
url = request if not isinstance(request, Request) else request.url
media_guid = hashlib.sha1(to_bytes(url)).hexdigest()
path, media_ext = os.path.splitext(url)
media_name = os.path.split(path)[1]
return '%s_%s%s' % (media_name, media_guid, media_ext)
(注意:这是未经测试的代码)