filespipeline

之前的工作都是針對網(wǎng)頁內(nèi)容,進(jìn)行xpath解析之后整理入庫颅夺,
或者寫入csv朋截、doc之類,
然后突然收到要去某個(gè)網(wǎng)站搜索含“附件”關(guān)鍵詞的文章吧黄,
并將其中的附件下載部服,沒有下載標(biāo)簽的則保存內(nèi)容存為doc。
首先想到的是使用Scrapyd框架的下載器-官方文檔
使用方法也很簡單拗慨,如果不需要對文件進(jìn)行特殊處理只需要

settings.py
# 在配置文件的ITEM_PIPELINES模塊加上這一句廓八,啟用FilesPipeline
ITEM_PIPELINES = {
    'scrapy.pipelines.files.FilesPipeline': 1,
    'myproject.pipelines.MyFilePipelines': 1, # 自定義pipelines規(guī)則
}
# 配置文件存放目錄
FILES_STORE = '/pth/to/file/dir'
-------------------------------------------------------------------------------------------
item.py
# 類似于入庫操作,設(shè)置ITEM胆描,但必須包含file_urls和files
class MyFilesItem(scrapy.Item):
    files = scrapy.Filed()
    file_urls = scrapy.Field()
    file_name = scrapy.Field()   #如果需要自定義文件名
    pass
-------------------------------------------------------------------------------------------
pipelines.py
# 需要自定義pipeline規(guī)則時(shí)使用,使用默認(rèn)配置不需要更改,自己的項(xiàng)目文檔....懶的改
class MyFilePipeline(FilesPipeline):
    
    def file_path(self, request, response=None, info=None):
        # 對文件重命名時(shí)需要重寫的方法, Return file path 
        item = request.meta['item']
        dic_file_type = {'tzgg': u'通知公告', 'xmsyj': u'畜牧獸醫(yī)局', 'nyjstgzz': u'農(nóng)業(yè)技術(shù)推廣總站',
                         'ncjjtzyjyglc': u'農(nóng)村經(jīng)濟(jì)體制與經(jīng)營管理處', 'szzglzz': u'種子管理總站', 'ncjjzzglc': '農(nóng)產(chǎn)品加工辦公室',
                         'ncpzlaqjgc': u'農(nóng)產(chǎn)品質(zhì)量安全監(jiān)管局', 'kjjyc': u'科技教育處', 'zzyglc': u'種植業(yè)管理處',
                         'nyyw': u'農(nóng)業(yè)要聞'}
        file_type = dic_file_type[(request.url.split('/')[4])]
        file_name = item['file_name']
        file_path_name = u'full/{0}/{1}'.format(file_type, file_name)
        # file_dir = u'full/{0}'.format(file_type)
        # is_file_path = ''.join(['D:/work/studyscrapy/', file_path_name])
        # if not os.path.exists(is_file_path):
        #     os.makedirs(file_dir)
        return file_path_name

    def get_media_requests(self, item, info):
        # FilesPepeline 根據(jù)file_urls指定的url進(jìn)行爬取瘫想,該方法為每個(gè)url生成一個(gè)Request后 Return 
        for file_url in item['file_urls']:
            yield Request(file_url, meta={'item': item})

    def item_completed(self, results, item, info):
        # 所有圖片處理完畢后會調(diào)用該方法,也可以在該方法下進(jìn)行文件重命名
        file_paths = [x['path'] for ok, x in results if ok]
        if not file_paths:
            # 如果文件未下載
            raise DropItem("Item contains no file")
        item['file_paths'] = file_paths
        return item
-----------------------------------------------------------------------------------------
spider.py
# 局部代碼示例,僅作說明item使用方法
class mySpider(scrapy.Spider):
    # 初始化全局變量
    file_urls = []
    def parse(response):
        sel = Selector(response)
        item = myFileItem()
        a = sel.xpath('//a[@class="ul_list li"]')
        if len(a) != 0:
            for f in a:
                self.file_type.append(meta['type'])
                self.file.append(f.xpath('.//text()').extract_first(default='N/A'))
                f_url = f.xpath('.//@href').extract()[0]
                f_name = f.xpath('.//text()').extract()[0]
                if f_url[0] == '.':
                    f_site = response.url.split('/')
                    f_site[-1] = f_url[2::]
                    f_url = '/'.join(f_site)
                    item['files'] = f_name
                    item['file_urls'] = [f_url]
                    item['file_name'] = f_name
                yield item

如果不寫自己的filepipeline,文件名是使用file_url的SHA1 hash昌讲,不利于文章的分類整理国夜。
還沒有試過imagepipeline,不過具體用法類似短绸,用上了再看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末车吹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子醋闭,更是在濱河造成了極大的恐慌窄驹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件证逻,死亡現(xiàn)場離奇詭異乐埠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)囚企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門丈咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人龙宏,你說我怎么就攤上這事棵逊。” “怎么了银酗?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵辆影,是天一觀的道長徒像。 經(jīng)常有香客問我,道長蛙讥,這世上最難降的妖魔是什么锯蛀? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮键菱,結(jié)果婚禮上谬墙,老公的妹妹穿的比我還像新娘。我一直安慰自己经备,他們只是感情好拭抬,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侵蒙,像睡著了一般造虎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纷闺,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天算凿,我揣著相機(jī)與錄音,去河邊找鬼犁功。 笑死氓轰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浸卦。 我是一名探鬼主播署鸡,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼限嫌!你這毒婦竟也來了靴庆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤怒医,失蹤者是張志新(化名)和其女友劉穎炉抒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚叹,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰薄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒袖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞茅。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖僚稿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蟀伸,我是刑警寧澤蚀同,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布缅刽,位于F島的核電站,受9級特大地震影響蠢络,放射性物質(zhì)發(fā)生泄漏衰猛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一刹孔、第九天 我趴在偏房一處隱蔽的房頂上張望啡省。 院中可真熱鬧,春花似錦髓霞、人聲如沸卦睹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽结序。三九已至,卻和暖如春纵潦,著一層夾襖步出監(jiān)牢的瞬間徐鹤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工邀层, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返敬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓寥院,卻偏偏與公主長得像劲赠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子只磷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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