scrapy框架案例分析

作為一名爬蟲愛好者,雖然requests庫已經(jīng)足夠我們做一些簡單的小爬蟲,selenium能幫助我們模仿瀏覽器行為,但學(xué)會使用框架能幫助我們更加便捷高效的完成爬取任務(wù)辑鲤。

案例分析:爬取寶馬五系汽車圖片

1.新建一個爬蟲項目

scrapy startproject bw
cd bw
scrapy genspider bw5 "XXXXXXX域名"

2.在item.py中創(chuàng)建三個容器

import scrapy


class BwItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field() #裝子分類名字
    image_urls = scrapy.Field() #裝圖片鏈接
    images = scrapy.Field()

3.在爬蟲文件bw5.py中導(dǎo)入BwItem并解析網(wǎng)頁

import scrapy
from bw.items import BwItem

class Bw5Spider(scrapy.Spider):
    name = 'bw5'
    allowed_domains = ['car.autohome.com.cn']
    start_urls = ['https://car.autohome.com.cn/pic/series/65.html']

    def parse(self, response):
        uiboxs = response.xpath("http://div[@class='uibox']")[1:]
        for uibox in uiboxs:
            title = uibox.xpath(".//div[@class='uibox-title']/a/text()").get()
            urls = uibox.xpath(".//div[@class='uibox-con carpic-list03']/ul/li/a/img/@src").getall()
            # for x in urls:
            #     url = response.urljoin(x)
            #     print(url)
            #獲取所有圖片url
            urls = list(map(lambda url:response.urljoin(url),urls))
            item = BwItem(title=title,image_urls=urls)
            yield item

4.scrapy框架中幫我們寫好了異步下載程序,只需按步驟打開下載器開關(guān)配置相應(yīng)路徑即可

當(dāng)使用File Pipeline下載文件的時候杠茬,按照以下步驟來完成:
1.定義好一個Item月褥,然后在這個item中定義兩個屬性,分別為file_urls以及files 瓢喉。file_urls是用來存儲需要下載的文件的url鏈接吓坚,需要一個列表
⒉.當(dāng)文件下載完成后,會把文件下載的相關(guān)信息存儲到item的files屬性中灯荧。比如下載路徑礁击、下載的url和文件的校驗(yàn)碼等。
3.在配置文件 settings.py中配置FILEs_STORE,這個配置是用來設(shè)置文件下載下來的路徑哆窿。
4.啟動pipeline在ITEN_PIPELNES中設(shè)置scrapy.pipelines.files.FilesPipeline:1.
下載圖片的Images Pipeline:
1.定義好一個Item链烈,然后在這個item中定義兩個屬性,分別為image_urls以及images 挚躯。image_urls是用來存儲需要下載的文件的url鏈接强衡,需要一個列表
⒉.當(dāng)文件下載完成后,會把文件下載的相關(guān)信息存儲到item的images屬性中码荔。比如下載路徑漩勤、下載的url和文件的校驗(yàn)碼等。
3.在配置文件 settings.py中配置IMAGES_STORE缩搅,這個配置是用來設(shè)置文件下載下來的路徑越败。
4.啟動pipeline在ITEN_PIPELNES中設(shè)置scrapy.pipelines.images.ImagesPipeline:1

若有下載要求,需要在pipelines.py中重寫相關(guān)方法

import os
from urllib import request
from scrapy.pipelines.images import ImagesPipeline
from bw import settings

class BwImagesPipeline(ImagesPipeline):#繼承父類ImagesPipeline
    def get_media_requests(self, item, info):#重寫父類方法
        request_objs = super(BwImagesPipeline,self).get_media_requests(item,info)
        for request_obj in request_objs:
            request_obj.item = item
        return request_objs
    def file_path(self, request, response=None, info=None):
        path = super(BwImagesPipeline,self).file_path(request,response,info)
        title = request.item.get("title")
        images_store = settings.IMAGES_STORE
        title_path = os.path.join(images_store,title)
        if not os.path.exists(title_path):
            os.mkdir(title_path)
        image_name = path.replace("full/","")
        image_path = os.path.join(title_path,image_name)
        return image_path

5.在setting.py中開啟相關(guān)設(shè)置

# Obey robots.txt rules
ROBOTSTXT_OBEY = False #關(guān)閉機(jī)器人協(xié)議
#設(shè)置默認(rèn)請求頭
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
}
#開啟item_pipelines
ITEM_PIPELINES = {
   # 'bw.pipelines.BwPipeline': 300,
   #  'scrapy.pipelines.images.ImagesPipeline':1,
    'bw.pipelines.BwImagesPipeline':1,
}
#圖片下載路徑硼瓣,供image pipelines使用
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')

6.在工程目錄下創(chuàng)建start.py文件以啟動爬蟲

from scrapy import cmdline
cmdline.execute("scrapy crawl bw5".split())

效果圖

總結(jié):相比普通爬蟲究飞,scrapy框架的運(yùn)行速率,下載速率都更快堂鲤,效率更高亿傅,學(xué)會使用框架能提高我們的效率,特別是爬取的數(shù)據(jù)較多的情況下瘟栖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葵擎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子半哟,更是在濱河造成了極大的恐慌酬滤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜沽,死亡現(xiàn)場離奇詭異,居然都是意外死亡贱田,警方通過查閱死者的電腦和手機(jī)缅茉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來男摧,“玉大人蔬墩,你說我怎么就攤上這事『耐兀” “怎么了拇颅?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乔询。 經(jīng)常有香客問我樟插,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任黄锤,我火速辦了婚禮搪缨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸵熟。我一直安慰自己副编,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布流强。 她就那樣靜靜地躺著痹届,像睡著了一般。 火紅的嫁衣襯著肌膚如雪打月。 梳的紋絲不亂的頭發(fā)上队腐,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音僵控,去河邊找鬼香到。 笑死,一個胖子當(dāng)著我的面吹牛报破,可吹牛的內(nèi)容都是我干的悠就。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼充易,長吁一口氣:“原來是場噩夢啊……” “哼梗脾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盹靴,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤炸茧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稿静,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梭冠,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年改备,在試婚紗的時候發(fā)現(xiàn)自己被綠了控漠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悬钳,死狀恐怖盐捷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情默勾,我是刑警寧澤碉渡,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站母剥,受9級特大地震影響滞诺,放射性物質(zhì)發(fā)生泄漏形导。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一铭段、第九天 我趴在偏房一處隱蔽的房頂上張望骤宣。 院中可真熱鬧,春花似錦序愚、人聲如沸憔披。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芬膝。三九已至,卻和暖如春形娇,著一層夾襖步出監(jiān)牢的瞬間锰霜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工桐早, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癣缅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓哄酝,卻偏偏與公主長得像友存,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陶衅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354