手把手教你寫網(wǎng)絡(luò)爬蟲(4)Scrapy入門-創(chuàng)新互聯(lián)

上期我們理性的分析了為什么要學(xué)習(xí)Scrapy,理由只有一個(gè),那就是免費(fèi),一分錢都不用花!

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都數(shù)千家客戶提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷型網(wǎng)站建設(shè),品牌網(wǎng)站制作,同時(shí)也為不同行業(yè)的客戶提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)建站

手把手教你寫網(wǎng)絡(luò)爬蟲(4)Scrapy入門

咦?怎么有人扔西紅柿?好吧,我承認(rèn)電視看多了。不過(guò)今天是沒(méi)得看了,為了趕稿,又是一個(gè)不眠夜。。。言歸正傳,我們將在這一期介紹完Scrapy的基礎(chǔ)知識(shí), 如果想深入研究,大家可以參考官方文檔,那可是出了名的全面,我就不占用公眾號(hào)的篇幅了。

架構(gòu)簡(jiǎn)介

下面是Scrapy的架構(gòu),包括組件以及在系統(tǒng)中發(fā)生的數(shù)據(jù)流的概覽(紅色箭頭所示)。 之后會(huì)對(duì)每個(gè)組件做簡(jiǎn)單介紹,數(shù)據(jù)流也會(huì)做一個(gè)簡(jiǎn)要描述。

手把手教你寫網(wǎng)絡(luò)爬蟲(4)Scrapy入門

組件

Engine: 引擎負(fù)責(zé)控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動(dòng),并在相應(yīng)動(dòng)作發(fā)生時(shí)觸發(fā)事件。

Scheduler: 調(diào)度器從引擎接受Request并將他們?nèi)腙?duì),以便之后引擎請(qǐng)求他們時(shí)提供給引擎。

Downloader: 下載器負(fù)責(zé)獲取頁(yè)面數(shù)據(jù)并提供給引擎,而后提供給Spider。

Spiders: Spider是Scrapy用戶編寫的用于分析Response并提取Item或提取更多需要下載的URL的類。 每個(gè)Spider負(fù)責(zé)處理特定網(wǎng)站。

Item Pipeline: 負(fù)責(zé)處理被Spider提取出來(lái)的Item。典型的功能有清洗、 驗(yàn)證及持久化操作。

Downloader middlewares: 下載器中間件是在Engine及Downloader之間的特定鉤子(specific hooks),處理Downloader傳遞給Engine的Response。 其提供了一個(gè)簡(jiǎn)便的機(jī)制,通過(guò)插入自定義代碼來(lái)擴(kuò)展Scrapy功能。

Spider middlewares: 是在Engine及Spider之間的特定鉤子(specific hook),處理Spider的輸入(Response)和輸出(Items及Requests)。 其提供了一個(gè)簡(jiǎn)便的機(jī)制,通過(guò)插入自定義代碼來(lái)擴(kuò)展Scrapy功能。

數(shù)據(jù)流

Scrapy中的數(shù)據(jù)流由執(zhí)行引擎控制,其過(guò)程如下:

  1. Engine從Spider獲取第一個(gè)需要爬取URL(s)。

  2. Engine用Scheduler調(diào)度Requests,并向Scheduler請(qǐng)求下一個(gè)要爬取的URL。

  3. Scheduler返回下一個(gè)要爬取的URL給Engine。

  4. Engine將URL通過(guò)Downloader middlewares轉(zhuǎn)發(fā)給Downloader。

  5. 一旦頁(yè)面下載完畢,下載器生成一個(gè)該頁(yè)面的Response,并將其通過(guò)Downloader middlewares發(fā)送給Engine。

  6. 引擎從Downloader中接收到Response并通過(guò)Spider middlewares發(fā)送給Spider處理。

  7. Spider處理Response并返回爬取到的Item及新的Request給Engine。

  8. Engine將爬取到的Item給Item Pipeline,然后將Request給Scheduler。

  9. 從第一步開始重復(fù)這個(gè)流程,直到Scheduler中沒(méi)有更多的URLs。

架構(gòu)就是這樣,流程和我第二篇里介紹的迷你架構(gòu)差不多,但擴(kuò)展性非常強(qiáng)大。

One more thing

 手把手教你寫網(wǎng)絡(luò)爬蟲(4)Scrapy入門

Scrapy基于事件驅(qū)動(dòng)網(wǎng)絡(luò)框架 Twisted 編寫,Twisted是一個(gè)異步非阻塞框架。一說(shuō)到網(wǎng)絡(luò)通信框架就會(huì)提什么同步、異步、阻塞和非阻塞,到底是些啥玩意???為啥老是有人暗示或者明示異步=非阻塞?比如Scrapy文檔里:Scrapy is written with Twisted, a popular event-driven networking framework for Python. Thus, it’s implemented using a non-blocking (aka asynchronous) code for concurrency. 這種說(shuō)法對(duì)嗎?舉個(gè)栗子:

出場(chǎng)人物:老張,水壺兩把(普通水壺,簡(jiǎn)稱水壺;會(huì)響的水壺,簡(jiǎn)稱響水壺)

1. 老張把水壺放到火上,立等水開。(同步阻塞)

老張覺得自己有點(diǎn)傻。

2. 老張把水壺放到火上,去客廳看電視,時(shí)不時(shí)去廚房看看水開沒(méi)有。(同步非阻塞)

老張還是覺得自己有點(diǎn)傻,于是變高端了,買了把會(huì)響笛的那種水壺。水開之后,能大聲發(fā)出嘀~~~~的噪音。

3. 老張把響水壺放到火上,立等水開。(異步阻塞)

老張覺得這樣傻等意義不大。

4. 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)

老張覺得自己聰明了。

所謂同步異步,只是對(duì)于水壺而言。普通水壺,同步;響水壺,異步。雖然都能干活,但響水壺可以在自己完工之后,提示老張水開了。這是普通水壺所不能及的。同步只能讓調(diào)用者去輪詢自己(情況2中),造成老張效率的低下。

所謂阻塞非阻塞,僅僅對(duì)于老張而言。立等的老張,阻塞;看電視的老張,非阻塞。情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對(duì)于立等的老張沒(méi)有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發(fā)揮異步的效用。

入門教程

創(chuàng)建項(xiàng)目

在開始爬取之前,您必須創(chuàng)建一個(gè)新的Scrapy項(xiàng)目。 進(jìn)入您打算存儲(chǔ)代碼的目錄中,運(yùn)行下列命令:

scrapy startproject tutorial

該命令將會(huì)創(chuàng)建包含下列內(nèi)容的 tutorial 目錄:

tutorial/
    scrapy.cfg            # 項(xiàng)目的配置文件
    tutorial/             # 該項(xiàng)目的python模塊。之后您將在此加入代碼
        __init__.py
        items.py          # 項(xiàng)目中的item文件
        pipelines.py      # 項(xiàng)目中的pipelines文件
        settings.py       # 項(xiàng)目的設(shè)置文件
        spiders/          # 放置spider代碼的目錄
            __init__.py

編寫第一個(gè)爬蟲

Spider是用戶編寫用于從單個(gè)網(wǎng)站(或者一些網(wǎng)站)爬取數(shù)據(jù)的類。其包含了一個(gè)用于下載的初始URL,以及如何跟進(jìn)網(wǎng)頁(yè)中的鏈接以及如何分析頁(yè)面中的內(nèi)容的方法。

以下為我們的第一個(gè)Spider代碼,保存在 tutorial/spiders 目錄下的 quotes_spider.py文件中:

import scrapyclass QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [            'http://quotes.toscrape.com/page/1/',            'http://quotes.toscrape.com/page/2/',
        ]        for url in urls:            yield scrapy.Request(url=url, callback=self.parse)    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

 

為了創(chuàng)建一個(gè)Spider,你必須繼承 scrapy.Spider 類, 且定義以下三個(gè)屬性:

  1. name: 用于區(qū)別Spider。 該名字必須是唯一的,您不可以為不同的Spider設(shè)定相同的名字。

  2. start_urls: 包含了Spider在啟動(dòng)時(shí)進(jìn)行爬取的url列表。 因此,第一個(gè)被獲取到的頁(yè)面將是其中之一。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。

  3. parse() 是spider的一個(gè)方法。 被調(diào)用時(shí),每個(gè)初始URL完成下載后生成的Response 對(duì)象將會(huì)作為唯一的參數(shù)傳遞給該函數(shù)。 該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data),提取數(shù)據(jù)以及生成需要進(jìn)一步處理的URL的 Request 對(duì)象。

運(yùn)行我們的爬蟲

進(jìn)入項(xiàng)目的根目錄,執(zhí)行下列命令啟動(dòng)spider:

scrapy crawl quotes

這個(gè)命令啟動(dòng)用于爬取 quotes.toscrape.com 的spider,你將得到類似的輸出:

2017-05-10 20:36:17 [scrapy.core.engine] INFO: Spider opened
2017-05-10 20:36:17 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-05-10 20:36:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-1.html2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-2.html
2017-05-10 20:36:17 [scrapy.core.engine] INFO: Closing spider (finished)

 

提取數(shù)據(jù)

我們之前只是保存了HTML頁(yè)面,并沒(méi)有提取數(shù)據(jù)?,F(xiàn)在升級(jí)一下代碼,把提取功能加進(jìn)去。至于如何使用瀏覽器的開發(fā)者模式分析網(wǎng)頁(yè),之前已經(jīng)介紹過(guò)了。

import scrapyclass QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [        'http://quotes.toscrape.com/page/1/',        'http://quotes.toscrape.com/page/2/',
    ]    def parse(self, response):        for quote in response.css('div.quote'):            yield {                'text': quote.css('span.text::text').extract_first(),                'author': quote.css('small.author::text').extract_first(),                'tags': quote.css('div.tags a.tag::text').extract(),
            }

 

再次運(yùn)行這個(gè)爬蟲,你將在日志里看到被提取出的數(shù)據(jù):

2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>{'tags': ['life', 'love'], 'author': 'André Gide', 'text': '“It is better to be hated for what you are than to be loved for what you are not.”'}2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/>{'tags': ['edison', 'failure', 'inspirational', 'paraphrased'], 'author': 'Thomas A. Edison', 'text': "“I have not failed. I've just found 10,000 ways that won't work.”"}

保存爬取的數(shù)據(jù)

最簡(jiǎn)單存儲(chǔ)爬取的數(shù)據(jù)的方式是使用 Feed exports:

scrapy crawl quotes -o quotes.json

該命令將采用 JSON 格式對(duì)爬取的數(shù)據(jù)進(jìn)行序列化,生成quotes.json文件。

在類似本篇教程里這樣小規(guī)模的項(xiàng)目中,這種存儲(chǔ)方式已經(jīng)足夠。如果需要對(duì)爬取到的item做更多更為復(fù)雜的操作,你可以編寫 Item Pipeline,tutorial/pipelines.py在最開始的時(shí)候已經(jīng)自動(dòng)創(chuàng)建了。

最后,初學(xué)者進(jìn)階的福音

想學(xué)習(xí),基礎(chǔ)不夠?沒(méi)關(guān)系,我們提供免費(fèi)提供VIP基礎(chǔ)學(xué)習(xí)課程,讓你快速入門,掌握Python!

有基礎(chǔ)的小伙伴想學(xué)習(xí)項(xiàng)目實(shí)戰(zhàn)?沒(méi)問(wèn)題,每晚八點(diǎn)都有博士大牛帶你學(xué)習(xí)操作項(xiàng)目!

只要你有一顆想學(xué)習(xí)的心,我們隨時(shí)歡迎~

手把手教你寫網(wǎng)絡(luò)爬蟲(4)Scrapy入門

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:手把手教你寫網(wǎng)絡(luò)爬蟲(4)Scrapy入門-創(chuàng)新互聯(lián)
文章起源:http://muchs.cn/article26/dpogjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、全網(wǎng)營(yíng)銷推廣營(yíng)銷型網(wǎng)站建設(shè)、企業(yè)建站、電子商務(wù)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化