從今天開始用Scrapy爬取網(wǎng)絡(luò)美女圖-爬取篇

共同的愛好箱舞,讓我們相聚在這里

還等什么歼狼,Scrapy啟動,爬取開始芥炭!

目標(biāo)網(wǎng)站

這里我們選取的目標(biāo)網(wǎng)站是我常逛的干貨集中營漓库,而要爬取的就是她:

準(zhǔn)確的說是她們,點擊右上角“今日力薦”园蝠,可以跳轉(zhuǎn)至往期“干貨”渺蒿,這里就不再貼圖了,下面我們先簡單說下Scrapy的架構(gòu)和各部分功能彪薛。

架構(gòu)說明

  • Scrapy Engine(引擎): 負(fù)責(zé)Spider茂装、ItemPipeline、Downloader善延、Scheduler中間的通訊训唱,信號、數(shù)據(jù)傳遞等挚冤。
  • Scheduler(調(diào)度器): 它負(fù)責(zé)接受引擎發(fā)送過來的Request請求况增,并按照一定的方式進(jìn)行整理排列,入隊训挡,當(dāng)引擎需要時澳骤,交還給引擎歧强。
  • Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎)为肮,由引擎交給Spider來處理摊册,
  • Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù)颊艳,并將需要跟進(jìn)的URL提交給引擎茅特,再次進(jìn)入Scheduler(調(diào)度器).
  • Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析棋枕、過濾白修、存儲等)的地方。
  • Downloader Middlewares(下載中間件):你可以當(dāng)作是一個可以自定義擴展下載功能的組件重斑。
  • Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)

下面正式開始爬取工作兵睛。

創(chuàng)建項目

在工作目錄shift+鼠標(biāo)右鍵打開命令窗口,輸入

scrapy startproject girls

之后一個名為“girls”的Scrapy項目就已經(jīng)創(chuàng)建了窥浪。

打開PyCharm選擇“open”方式打開已創(chuàng)建項目(這里不建議用把項目直接拖到PyCharm的方式打開祖很,筆者因此遇到了已經(jīng)下好的庫無法載入的問題)。好了漾脂,讓我們看下載入好的項目目錄:


馬賽克為后續(xù)工作產(chǎn)生的你們就當(dāng)沒看到假颇;)
  • scrapy.cfg: 項目的配置文件。
  • girls/:項目的Python模塊骨稿,后續(xù)代碼在該目錄添加笨鸡。
  • girls/items.py:項目中的item文件,保存爬取數(shù)據(jù)的容器啊终。
  • girls/pipelines.py:項目中的pipelines文件,用于處理獲取的item傲须。
  • girls/settings.py:項目的設(shè)置文件蓝牲。
  • girls/spiders/:放置spider代碼的目錄。

明確目標(biāo)

通過定義Item明確爬取目標(biāo)泰讽。Item使用方法類似Python的字典例衍,另外它還提供了額外保護(hù)機制防止拼寫錯誤。這里只需要爬取圖片已卸,所以源碼為:

import scrapy


class GirlsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 圖片url 
    image_urls = scrapy.Field()
    # 圖片信息
    images = scrapy.Field()
  • image_urls :圖片url佛玄,爬蟲(spider)抓取項目后會將對應(yīng)url放入image_urls 中
  • images :圖片信息,圖片下載完后更新到images結(jié)構(gòu)中累澡。它包含一個字典列表梦抢,其中包括下載路徑、源抓取地址(image_urls中獲得)愧哟、圖片校驗碼奥吩,并且圖片順序與image_urls保持一致哼蛆。如果下載失敗,將記錄錯誤信息霞赫,不再出現(xiàn)在images 中腮介。

(這里用到了ImagesPipeline,下面會詳情講)

制作爬蟲

即編寫girls/spiders/目錄下的spider端衰,spider類定義了爬取網(wǎng)站的邏輯叠洗,包括爬取的動作(如是否跟進(jìn)鏈接),將網(wǎng)頁內(nèi)容提取成結(jié)構(gòu)化數(shù)據(jù)(爬取Item)等旅东。

這里建議通過命令直接生成spider文件:
點擊打開PyCharm左下角Terminal窗口灭抑,輸入

scrapy genspider girl gank.io/

在girls/spiders/目錄下會生成對應(yīng)girl.py文件,文件內(nèi)容:

# -*- coding: utf-8 -*-
import scrapy


class GirlSpider(scrapy.Spider):
    name = 'girl'
    allowed_domains = ['gank.io/']
    start_urls = ['http://gank.io//']

    def parse(self, response):
        pass

當(dāng)然手動創(chuàng)建也是一樣的效果玉锌,命令只是省去了書寫樣板代碼過程名挥。解釋下代碼:

  • name:爬蟲名字,必須且唯一主守,后續(xù)命令也以此名字為準(zhǔn)禀倔。
  • allowed_domains:爬蟲允許的域名列表,域名不在列表時將不再跟進(jìn)参淫,可選救湖。
  • start_urls:爬取的url列表,未制定特定url時涎才,爬蟲從該列表開始爬取鞋既。
  • parse(self, response):負(fù)責(zé)處理response并返回數(shù)據(jù)以及跟進(jìn)的url(如果需要的話)。

在生成文件基礎(chǔ)上添加我們的爬取邏輯:

# -*- coding: utf-8 -*-
import scrapy

from girls.items import GirlsItem


class GirlSpider(scrapy.Spider):
    name = 'girl'
    allowed_domains = []
    start_urls = ['http://gank.io//']

    def parse(self, response):
        item = GirlsItem()
        item["image_urls"] = response.xpath("/html/body/div[1]/div[1]/div[2]/p[1]/img/@src").extract()
        print(item)
        yield item
        new_url = response.xpath("/html/body/div[1]/div[1]/div[1]/div[2]/p/a/@href").extract_first()
        if new_url:
            # 將相對路徑轉(zhuǎn)為絕對路徑
            new_url = response.urljoin(new_url)
            print(new_url)
            yield scrapy.Request(new_url, callback=self.parse)

簡單說下代碼中網(wǎng)頁元素xpath獲取方法耍铜,這里用的瀏覽器是Chrome邑闺。

  1. 在想要獲取xpath的網(wǎng)頁元素上點擊右鍵,選擇檢查棕兼;
  2. 在被選擇的標(biāo)簽上右鍵陡舅,Copy →Copy XPath,



    粘貼至代碼中即可伴挚。

存儲內(nèi)容

這里主要指設(shè)計管道( item pipeline)存儲爬取到的內(nèi)容靶衍,即上邊提到的ImagesPipeline
ImagesPipeline即Scrapy提供的一個item pipeline茎芋,用來下載某個特定項目中的圖片并保存到本地颅眶,并且具有如下特點:

  • 將所有下載的圖片轉(zhuǎn)換成通用的格式(JPG)和模式(RGB)
  • 避免重新下載最近已經(jīng)下載過的圖片
  • 縮略圖生成
  • 檢測圖像的寬/高,確保它們滿足最小限制

這里如果需要生成縮略圖田弥,請下載Pillow庫涛酗,下載方法“安裝篇”里有提到。

使用ImagesPipeline除了items.py中的代碼外,只需要在settings.py配置相關(guān)設(shè)置即可煤杀,貼上源碼根據(jù)需求設(shè)置:

# 開啟圖片管道 ImagesPipeline地址項目實際地址為準(zhǔn)
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 300}
# 設(shè)置圖片存儲目錄眷蜈,一個有效的文件夾
IMAGES_STORE = 'girls/bitmap'
# 圖片開始下載延時
# DOWNLOAD_DELAY = 0.25
#縮略圖的尺寸,設(shè)置這個值就會產(chǎn)生縮略圖
# IMAGES_THUMBS = {
#     'small': (50, 50),
#     'big': (200, 200),
# }
# 90天的圖片失效期限
# 避免下載最近已經(jīng)下載的圖片
# IMAGES_EXPIRES = 90
# 濾出小圖片
# IMAGES_MIN_HEIGHT = 110
# IMAGES_MIN_WIDTH = 110

注意:開啟圖片管道設(shè)置ImagesPipeline地址應(yīng)以項目實際地址為準(zhǔn)這里是scrapy.pipelines.images.ImagesPipeline沈自,這點官方中文文檔有誤酌儒。
另外如果需要定制圖片管道請參考官方文檔的 實現(xiàn)定制圖片管道,這里不再贅述枯途。

開始爬取(?ω?)

雖然直接在命令行中輸入命令即可開始爬取忌怎,但是既然我們使用了PyCharm不妨使用IDE的方式:

  1. 在scrapy.cfg文件同級目錄創(chuàng)建start.py文件,輸入
# -*- coding:utf-8 -*-
from scrapy import cmdline

cmdline.execute("scrapy crawl girl".split())

  1. 右上角


    左邊或者Run菜單中選擇

  2. 彈出菜單點擊加+號酪夷,選擇Python

  3. 做如下設(shè)置

    設(shè)置完榴啸,OK結(jié)束。

  4. 點擊右上角

    即可開始爬取晚岭。

稍等片刻圖片就爬取完啦鸥印,如圖?(????ω????)?


總結(jié)

綜上可見一個標(biāo)準(zhǔn)的Scrapy爬取流程是:

  1. 創(chuàng)建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
  2. 明確目標(biāo) (編寫items.py):明確你想要抓取并存儲的目標(biāo)
  3. 制作爬蟲 (spiders/xxspider.py):制作爬蟲,明確爬取的網(wǎng)頁元素及爬取動作
  4. 存儲內(nèi)容 (pipelines.py):設(shè)計管道存儲爬取內(nèi)容

那么以上各個部分在爬取過程中是如何運行和配合的呢坦报?

結(jié)合上面提到的架構(gòu)圖可知:

  1. Scrapy引擎從爬蟲(Spider)文件中獲取開始的url库说,并交由調(diào)度器和下載器處理,處理好后得到的response交還爬蟲片择;
  2. 爬蟲根據(jù)爬蟲文件中設(shè)置的爬取動作潜的,爬取image_urls并儲存至items中,需要跟進(jìn)的url提交給引擎字管;
  3. Scrapy引擎將items中image_urls交給管道(Item Pipeline)處理啰挪,跟進(jìn)的url交給調(diào)度器;
  4. 管道這里根據(jù)ImagesPipeline及settings.py中的設(shè)置處理并將image_urls通過引擎交由調(diào)度器和下載器下載嘲叔,項目會在這個特定的管道階段保持“l(fā)ocker”的狀態(tài)亡呵,直到完成圖片的下載(或者由于某些原因未完成下載),下載完后硫戈,圖片信息更新到images中锰什。之后調(diào)度器根據(jù)需跟進(jìn)的url從1.開始循環(huán),直到調(diào)度器中不再有任何request掏愁,爬取結(jié)束歇由。

總結(jié)完畢

參考文章:
官方文檔:https://scrapy-chs.readthedocs.io/zh_CN/0.24/index.html
Scrapy 入門教程:http://www.runoob.com/w3cnote/scrapy-detail.html
Scrapy爬取美女:https://www.cnblogs.com/qiyeboy/p/5428240.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卵牍,一起剝皮案震驚了整個濱河市果港,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌糊昙,老刑警劉巖辛掠,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡萝衩,警方通過查閱死者的電腦和手機回挽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猩谊,“玉大人千劈,你說我怎么就攤上這事∨平荩” “怎么了墙牌?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暗甥。 經(jīng)常有香客問我喜滨,道長,這世上最難降的妖魔是什么撤防? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任虽风,我火速辦了婚禮,結(jié)果婚禮上寄月,老公的妹妹穿的比我還像新娘辜膝。我一直安慰自己,他們只是感情好剥懒,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布内舟。 她就那樣靜靜地躺著,像睡著了一般初橘。 火紅的嫁衣襯著肌膚如雪验游。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天保檐,我揣著相機與錄音耕蝉,去河邊找鬼。 笑死夜只,一個胖子當(dāng)著我的面吹牛垒在,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扔亥,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼场躯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旅挤?” 一聲冷哼從身側(cè)響起踢关,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粘茄,沒想到半個月后签舞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秕脓,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年儒搭,在試婚紗的時候發(fā)現(xiàn)自己被綠了吠架。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡搂鲫,死狀恐怖傍药,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魂仍,我是刑警寧澤怔檩,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蓄诽,受9級特大地震影響薛训,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仑氛,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一乙埃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锯岖,春花似錦介袜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捶牢,卻和暖如春鸠珠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秋麸。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工渐排, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灸蟆。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓驯耻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炒考。 傳聞我的和親對象是個殘疾皇子可缚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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

  • 說起寫爬蟲,大多數(shù)第一時間想到的就是python了斋枢。python語法簡潔明了帘靡,加上及其豐富好用的庫,用它來寫爬蟲有...
    瘋狂的哈丘閱讀 8,187評論 1 15
  • 這兩天摸索了下scrapy杏慰,剛看文檔的時候覺得有點生無可戀测柠,scrapy框架個人還是覺得比較難懂的,需要學(xué)習(xí)的地方...
    Treehl閱讀 5,638評論 7 10
  • 本主題主要是scrapy入門缘滥,包含內(nèi)容如下:??1. Scrapy框架環(huán)境搭建轰胁;??2. 理解scrapy框架結(jié)...
    楊強AT南京閱讀 1,341評論 0 10
  • 有些事說了矯情,不說憋屈朝扼。選擇不說赃阀,結(jié)果就變成了什么事都沒有,天天無所事事擎颖,什么都不想不愁不上進(jìn)榛斯。真是一千萬只那什...
    綿綿魚閱讀 214評論 0 0
  • 推開窗 三月的清風(fēng) 吹去夢里的哀愁 陽光打進(jìn)我眼中的 那片湖 激起圈圈漣漪 窗外跳躍著的 是早春的鳥兒 拾起園里的...
    少年也老閱讀 732評論 8 22