關于scrapy下載文件重命名的辦法以及對應url沒有文件后綴的辦法

scrapy中負責下載文件的是class MyFilesPipeline(FilesPipeline)

  • 其中負責下載文件的方法是
def file_path(self, request, response=None, info=None):
        ## start of deprecation warning block (can be removed in the future)
        def _warn():
            from scrapy.exceptions import ScrapyDeprecationWarning
            import warnings
            warnings.warn('FilesPipeline.file_key(url) method is deprecated, please use '
                          'file_path(request, response=None, info=None) instead',
                          category=ScrapyDeprecationWarning, stacklevel=1)

        # check if called from file_key with url as first argument
        if not isinstance(request, Request):
            _warn()
            url = request
        else:
            url = request.url

        # detect if file_key() method has been overridden
        if not hasattr(self.file_key, '_base'):
            _warn()
            return self.file_key(url)
        ## end of deprecation warning block

        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)

我們可以很清楚地看到 因為是下載的是文件窜管,所以默認的response參數(shù)是為None的,因為一般來講,文件的response就是我們下載的稚机。我們待會說明response為None的壞處幕帆。
所以,修改文件名的辦法就很顯然了抒钱。在return處做文章:return 的文件路徑蜓肆,用了兩個變量media_guidmedia_ext

  1. 其中media_guid是一個將url進行哈希加密的文件颜凯,可以修改
  2. 另一個media_ext是什么呢: os.path.splitext(url)[1]這個函數(shù)是將url作切割仗扬,不同于py里的split函數(shù)症概,這個函數(shù)只返回兩部分,示例如下

import os
path_01='D:/User/wgy/workplace/data/notMNIST_large.tar.gar'
path_02='D:/User/wgy/workplace/data/notMNIST_large'
root_01=os.path.splitext(path_01)
root_02=os.path.splitext(path_02)
print(root_01)
print(root_02)
結(jié)果:
('D:/User/wgy/workplace/data/notMNIST_large.tar', '.gar')
('D:/User/wgy/workplace/data/notMNIST_large', '')

可以看到早芭,就是在scrapy里這個函數(shù)就是獲取后綴的彼城。
綜上,文件名可以在這邊修改退个。

但是有一個問題募壕,如果想要下載的文件的url是經(jīng)過重定向,或者對應的url沒有后綴呢语盈。
由于網(wǎng)頁一般會將想要請求的文件類型放在response的頭部信息 content-type里舱馅,我們可以通過獲取content-type信息,在進行相應的操作刀荒。這樣我們就需要找到調(diào)用file_path的函數(shù)

    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里代嗤,第一行就是調(diào)用了file_path函數(shù),而且根據(jù)命名規(guī)則缠借,十分清晰干毅。 我們只要對上述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,直接正則獲取最后的文件路徑

\color{red}{Content-Disposition} 是一個擴展協(xié)議霹疫,對得到的內(nèi)容進行正則處理后拱绑,可以得到后綴综芥,一般建議先用這個丽蝎。但有的并不支持這種協(xié)議
\color{red}{Content-Type}一般網(wǎng)站都是支持的,但是它返回的文件類型可能沒法直接使用膀藐,所以建議先使用上面的那個

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屠阻,一起剝皮案震驚了整個濱河市酪耳,隨后出現(xiàn)的幾起案子穿香,更是在濱河造成了極大的恐慌,老刑警劉巖又憨,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虾啦,死亡現(xiàn)場離奇詭異麻诀,居然都是意外死亡痕寓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門蝇闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呻引,你說我怎么就攤上這事÷哂疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵单旁,是天一觀的道長饥伊。 經(jīng)常有香客問我,道長撵渡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任粒氧,我火速辦了婚禮节腐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翼雀。我一直安慰自己,他們只是感情好箱熬,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布狈邑。 她就那樣靜靜地躺著,像睡著了一般糕伐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上良瞧,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音褥蚯,去河邊找鬼。 笑死遵岩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的舍哄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼表悬,長吁一口氣:“原來是場噩夢啊……” “哼蟆沫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饭庞,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤熬荆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卤恳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡若债,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年蠢琳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挪凑。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡逛艰,死狀恐怖搞旭,靈堂內(nèi)的尸體忽然破棺而出菇绵,到底是詐尸還是另有隱情镇眷,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布永乌,位于F島的核電站,受9級特大地震影響翅雏,放射性物質(zhì)發(fā)生泄漏人芽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一橄抹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楼誓,春花似錦、人聲如沸慌随。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋艺。三九已至,卻和暖如春捎谨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涛救。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工检吆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹭沛。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓章鲤,卻偏偏與公主長得像咆贬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掏缎,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理眷蜈,服務發(fā)現(xiàn),斷路器端蛆,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 本文包括:1、文件上傳概述2嫌拣、利用 Commons-fileupload 組件實現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,528評論 5 91
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架异逐,建立于...
    Hsinwong閱讀 22,350評論 1 92
  • 我的第一任領導灰瞻,非常犀利。他的思路敏捷而清晰酝润,做事務實而高效,永遠沒有廢話要销,永遠雷厲風行。和他共事疏咐,絕對不會輕松。...
    幸福堂閱讀 198評論 0 0
  • 前段時間在“阿文來了”看到這本書----《顛覆平庸》浑塞。在一疊書籍中一眼挑中了它政己,淺嘗了一下,發(fā)現(xiàn)它是我的菜...
    小丸682閱讀 265評論 2 3