Scrapy網絡爬蟲:5.繼承FilesPipeline實現自定義文件名

Scrapy網絡爬蟲:5.繼承FilesPipeline實現自定義文件名

網絡爬蟲

上篇《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

Scrapy網絡爬蟲:5.繼承FilesPipeline實現自定義文件名

輸出文件路徑名

Scrapy網絡爬蟲:5.繼承FilesPipeline實現自定義文件名

下載的文件


分享到:


相關文章: