上篇《Scrapy網絡爬蟲:4.豌豆莢App下載代碼實現與踩過的坑》實現了文件下載功能,但是下載的文件名是url sha1之後的值。雖然這樣做可以避免下載的文件名重複,但不是很直觀。
通過閱讀FilesPipeline源碼,我們發現,下載文件名是在file_path函數中定義的。
def file_path(self, request, response=None, info=None):
……
media_guid = hashlib.sha1(to_bytes(url)).hexdigest() # change to request.url after deprecation
media_ext = os.path.splitext(url)[1] # change to request.url after deprecation
return 'full/%s%s' % (media_guid, media_ext)
因此,通過繼承FilesPipeline,並重載file_path函實現自定義文件名。
在pipeline文件中自定義MyFilesPipe
class MyFilesPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
path = urlparse(request.url).path
return join('full', basename(dirname(path)) + ".apk")
setting.py中修改ITEM_PIPELINES
ITEM_PIPELINES = {
# 'scrapy.pipelines.files.FilesPipeline': 1
'filedownload.pipelines.MyFilesPipeline': 1
}
運行爬蟲,檢查結果
crawl AppDownloadSpider -o ./wandoujia_app/app.json
閱讀更多 初沏的茶 的文章