Python爬蟲 --- 2.5 Scrapy之汽車之家爬蟲實(shí)踐

目的

Scrapy框架為文件和圖片的下載專門提供了兩個Item Pipeline 它們分別是:

FilePipeline

ImagesPipeline

這里主要介紹ImagesPipelineA甘苍!

目標(biāo)分析:

這次我們要爬的是 汽車之家:car.autohome.com.cn

最近喜歡吉利博越步脓,所以看了不少這款車的資料鸠姨。。。。

我們就點(diǎn)開博越汽車的圖片網(wǎng)站:

https://car.autohome.com.cn/pic/series/3788.html

傳統(tǒng)的Scrapy框架圖片下載

Scrapy 框架的實(shí)施:

  1. 創(chuàng)建scrapy項(xiàng)目和爬蟲:

    $ scrapy startproject Geely
    $ cd Geely
    $ scrapy genspider BoYue car.autohome.com.cn
    
  2. 編寫items.py:

    import scrapy
    
    class GeelyItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        
        # 存儲圖片分類
        catagory = scrapy.Field()
        
        # 存儲圖片地址
        image_urls = scrapy.Field()
        
        # ImagesPipeline 
        images = scrapy.Field()
    
  3. 編寫Spider:

    獲取高清圖片:

    通過分析縮略圖和高清圖的url,我們發(fā)現(xiàn)縮略圖只是多了t_罷了

    縮略圖地址:

    https://car3.autoimg.cn/cardfs/product/g25/M09/B0/61/t_autohomecar__wKgHIlpxMgyAWYh2AAaCZ2odx24585.jpg

    高清圖地址:

    https://car3.autoimg.cn/cardfs/product/g25/M09/B0/61/autohomecar__wKgHIlpxMgyAWYh2AAaCZ2odx24585.jpg

    # -*- coding: utf-8 -*-
    import scrapy
    
    #導(dǎo)入CrawlSpider模塊 需改寫原來的def parse(self,response)方法
    from scrapy.spiders import CrawlSpider ,Rule
    
    #導(dǎo)入鏈接提取模塊
    from scrapy.linkextractors import LinkExtractor 
    from Geely.items import GeelyItem
    
    class BoyueSpider(CrawlSpider):
        name = 'BoYue'
        allowed_domains = ['car.autohome.com.cn']
        start_urls = ['https://car.autohome.com.cn/pic/series/3788.html']
    
        #如需要進(jìn)行頁面解釋則使用callback回調(diào)函數(shù) 因?yàn)橛邢乱豁摿虢樱晕覀冃枰M(jìn),這里使用follow令其為True
        rules = {
            Rule(LinkExtractor(allow=r'https://car.autohome.com.cn/pic/series/3788.+'), callback= 'parse_page', follow=True),
        } 
    
        def parse_page(self, response):
            catagory = response.xpath('//div[@class = "uibox"]/div/text()').get()
            srcs = response.xpath('//div[contains(@class,"uibox-con")]/ul/li//img/@src').getall()
    
            #map(函數(shù)臼予,參數(shù)二)鸣戴,將參數(shù)二中的每個都進(jìn)行函數(shù)計(jì)算并返回一個列表
            srcs = list(map(lambda x:x.replace('t_',''),srcs))
            srcs = list(map(lambda x:response.urljoin(x),srcs))
            yield GeelyItem(catagory=catagory, image_urls = srcs)
    
  4. 編寫PIPELINE:

    import os
    from urllib import request
    
    class GeelyPipeline(object):
    
        def __init__(self):
            #os.path.dirname()獲取當(dāng)前文件的路徑,os.path.join()獲取當(dāng)前目錄并拼接成新目錄
            self.path = os.path.join(os.path.dirname(__file__), 'images')
    
            # 判斷路徑是否存在
            if not os.path.exists(self.path):  
                os.mkdir(self.path)
    
        def process_item(self, item, spider):
    
            #分類存儲
            catagory = item['catagory']
            urls = item['image_urls']
    
            catagory_path = os.path.join(self.path, catagory)
    
            #如果沒有該路徑即創(chuàng)建一個
            if not os.path.exists(catagory_path): 
                os.mkdir(catagory_path)
    
            for url in urls:
                #以_進(jìn)行切割并取最后一個單元
                image_name = url.split('_')[-1] 
                request.urlretrieve(url,os.path.join(catagory_path,image_name))
    
            return item
    
  5. 編寫settings.py

    BOT_NAME = 'Geely'
    
    SPIDER_MODULES = ['Geely.spiders']
    NEWSPIDER_MODULE = 'Geely.spiders'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    
    ITEM_PIPELINES = {
       'Geely.pipelines.GeelyPipeline': 1,
    }
    
  6. 讓項(xiàng)目跑起來:

    $ scrapy crawl BoYue
    
  7. 結(jié)果展示:

使用Images_pipeline進(jìn)行圖片下載

使用步驟:

  1. 定義好一個item,然后定義兩個屬性 image_urls 和 images。 image_urls是用來存儲需要下載的文件的url鏈接粘拾,列表類型窄锅;

  2. 當(dāng)文件下載完成后,會把文件下載的相關(guān)信息存儲到item的images屬性中。例如:下載路徑入偷,下載url 和文件的效驗(yàn)碼追驴;

  3. 再配置文件settings.py中配置FILES_STORE,指定文件下載路徑;

  4. 啟動pipeline,在ITEM_PIPELINES中設(shè)置自定義的中間件J柚5钛!

具體步驟

在上面的基礎(chǔ)上修改

  1. 修改settings.py

    ITEM_PIPELINES = {
       # 'Geely.pipelines.GeelyPipeline': 1,
       # 'scrapy.pipelines.images.ImagesPipeline': 1,
       'Geely.pipelines.GeelyImagesPipeline': 1,
    }
    
    #工程根目錄
    project_dir = os.path.dirname(__file__)
    #下載圖片存儲位置
    IMAGES_STORE = os.path.join(project_dir, 'images')
    
  2. 改寫pipelines,py

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import os
    from urllib import request
    
    from scrapy.pipelines.images import ImagesPipeline
    from Geely import settings
    
    # class GeelyPipeline(object):
    
    #     def __init__(self):
    #         #os.path.dirname()獲取當(dāng)前文件的路徑,os.path.join()獲取當(dāng)前目錄并拼接成新目錄
    #         self.path = os.path.join(os.path.dirname(__file__), 'images')
    
    #         # 判斷路徑是否存在
    #         if not os.path.exists(self.path):  
    #             os.mkdir(self.path)
    
    #     def process_item(self, item, spider):
    
    #         #分類存儲
    #         catagory = item['catagory']
    #         urls = item['image_urls']
    
    #         catagory_path = os.path.join(self.path, catagory)
    
    #         #如果沒有該路徑即創(chuàng)建一個
    #         if not os.path.exists(catagory_path): 
    #             os.mkdir(catagory_path)
    
    #         for url in urls:
    #             #以_進(jìn)行切割并取最后一個單元
    #             image_name = url.split('_')[-1] 
    #             request.urlretrieve(url,os.path.join(catagory_path,image_name))
    
    #         return item
    
    # 繼承ImagesPipeline
    class GeelyImagesPipeline(ImagesPipeline):
    
        # 該方法在發(fā)送下載請求前調(diào)用锋爪,本身就是發(fā)送下載請求的
        def get_media_requests(self, item, info):
    
            # super()直接調(diào)用父類對象
            request_objects = super(GeelyImagesPipeline, self).get_media_requests(item, info)
            for request_object in request_objects:
                request_object.item = item
            return request_objects
    
        def file_path(self, request, response=None, info=None):
    
            path = super(GeelyImagesPipeline, self).file_path(request, response, info)
    
            # 該方法是在圖片將要被存儲時調(diào)用丙曙,用于獲取圖片存儲的路徑
            catagory = request.item.get('catagory')
        
            # 拿到IMAGES_STORE
            images_stores = settings.IMAGES_STORE
            catagory_path = os.path.join(images_stores, catagory)
            
            #判斷文件名是否存在,如果不存在創(chuàng)建文件
            if not os.path.exists(catagory_path): 
                os.mkdir(catagory_path)
    
            image_name = path.replace('full/','')
            image_path = os.path.join(catagory+'/',image_name)
            
            return image_path
    
  3. 讓項(xiàng)目跑起來:

    $ scrapy crawl BoYue
    

將會得到與原來相同的結(jié)果!F浣尽?髁!

此文章同時同步到我的個人博客緣來來來 ? Python爬蟲 --- 2.5 Scrapy之汽車之家爬蟲實(shí)踐

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拯爽,一起剝皮案震驚了整個濱河市索抓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毯炮,老刑警劉巖逼肯,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桃煎,居然都是意外死亡汉矿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門备禀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奈揍,你說我怎么就攤上這事曲尸。” “怎么了男翰?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵另患,是天一觀的道長。 經(jīng)常有香客問我蛾绎,道長昆箕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任租冠,我火速辦了婚禮鹏倘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顽爹。我一直安慰自己纤泵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布镜粤。 她就那樣靜靜地躺著捏题,像睡著了一般玻褪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上公荧,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天带射,我揣著相機(jī)與錄音,去河邊找鬼循狰。 笑死窟社,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晤揣。 我是一名探鬼主播桥爽,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昧识!你這毒婦竟也來了钠四?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跪楞,失蹤者是張志新(化名)和其女友劉穎缀去,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甸祭,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缕碎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了池户。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咏雌。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖校焦,靈堂內(nèi)的尸體忽然破棺而出赊抖,到底是詐尸還是另有隱情,我是刑警寧澤寨典,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布氛雪,位于F島的核電站,受9級特大地震影響耸成,放射性物質(zhì)發(fā)生泄漏报亩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一井氢、第九天 我趴在偏房一處隱蔽的房頂上張望弦追。 院中可真熱鬧,春花似錦花竞、人聲如沸骗卜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寇仓。三九已至举户,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遍烦,已是汗流浹背俭嘁。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留服猪,地道東北人供填。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像罢猪,于是被迫代替她去往敵國和親近她。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,705評論 4 46
  • 學(xué)習(xí)python時膳帕,爬蟲是一種簡單上手的方式粘捎,應(yīng)該也是一個必經(jīng)階段。本項(xiàng)目用Scrapy框架實(shí)現(xiàn)了抓取豆瓣top2...
    豌豆花下貓閱讀 1,139評論 0 6
  • 1 安裝Scrapy Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù)危彩,提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架攒磨。 可以應(yīng)用在包括數(shù)據(jù)挖掘...
    superzhan閱讀 1,438評論 0 11
  • 奇跡真的發(fā)生在了我的身上,感恩我的天使李茹汤徽,感恩我的朋友娩缰,感恩我的家人,感恩所以幫助我的人谒府,謝謝你們拼坎!謝謝,謝謝完疫,...
    Aries_e074閱讀 325評論 0 0
  • 每個人的生命中都有一個特殊的時刻泰鸡,他就是為此而生。這個特殊的機(jī)遇趋惨,如果他能夠把握,將使他得以完成自己的使命—一個只...
    truth旭閱讀 239評論 0 0