日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你写网络爬虫(4)Scrapy入门

發布時間:2025/6/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你写网络爬虫(4)Scrapy入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上期我們理性的分析了為什么要學習Scrapy,理由只有一個,那就是免費,一分錢都不用花!

?

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

?

架構簡介

下面是Scrapy的架構,包括組件以及在系統中發生的數據流的概覽(紅色箭頭所示)。 之后會對每個組件做簡單介紹,數據流也會做一個簡要描述。

?

組件

Engine: 引擎負責控制數據流在系統中所有組件中流動,并在相應動作發生時觸發事件。

Scheduler: 調度器從引擎接受Request并將他們入隊,以便之后引擎請求他們時提供給引擎。

Downloader: 下載器負責獲取頁面數據并提供給引擎,而后提供給Spider。

Spiders: Spider是Scrapy用戶編寫的用于分析Response并提取Item或提取更多需要下載的URL的類。 每個Spider負責處理特定網站。

Item Pipeline: 負責處理被Spider提取出來的Item。典型的功能有清洗、 驗證及持久化操作。

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

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

?

數據流

Scrapy中的數據流由執行引擎控制,其過程如下:

  • Engine從Spider獲取第一個需要爬取URL(s)。

  • Engine用Scheduler調度Requests,并向Scheduler請求下一個要爬取的URL。

  • Scheduler返回下一個要爬取的URL給Engine。

  • Engine將URL通過Downloader middlewares轉發給Downloader。

  • 一旦頁面下載完畢,下載器生成一個該頁面的Response,并將其通過Downloader middlewares發送給Engine。

  • 引擎從Downloader中接收到Response并通過Spider middlewares發送給Spider處理。

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

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

  • 從第一步開始重復這個流程,直到Scheduler中沒有更多的URLs。

  • 架構就是這樣,流程和我第二篇里介紹的迷你架構差不多,但擴展性非常強大。

    ?

    One more thing

    ?

    ?

    Scrapy基于事件驅動網絡框架 Twisted 編寫,Twisted是一個異步非阻塞框架。一說到網絡通信框架就會提什么同步、異步、阻塞和非阻塞,到底是些啥玩意啊?為啥老是有人暗示或者明示異步=非阻塞?比如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. 這種說法對嗎?舉個栗子:

    出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)

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

      老張覺得自己有點傻。

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

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

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

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

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

      老張覺得自己聰明了。

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

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

    ?

    入門教程

    ?

    創建項目

    在開始爬取之前,您必須創建一個新的Scrapy項目。 進入您打算存儲代碼的目錄中,運行下列命令:

    scrapy startproject tutorial

    該命令將會創建包含下列內容的 tutorial 目錄:

    tutorial/scrapy.cfg????????????#?項目的配置文件tutorial/?????????????#?該項目的python模塊。之后您將在此加入代碼__init__.pyitems.py??????????#?項目中的item文件pipelines.py??????#?項目中的pipelines文件settings.py???????#?項目的設置文件spiders/??????????#?放置spider代碼的目錄__init__.py



    編寫第一個爬蟲

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

    以下為我們的第一個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'?%?pagewith?open(filename,?'wb')?as?f:f.write(response.body)self.log('Saved?file?%s'?%?filename)


    ?

    ?

    為了創建一個Spider,你必須繼承 scrapy.Spider 類, 且定義以下三個屬性:

  • name: 用于區別Spider。 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字。

  • start_urls: 包含了Spider在啟動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 后續的URL則從初始的URL獲取到的數據中提取。

  • parse() 是spider的一個方法。 被調用時,每個初始URL完成下載后生成的Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據以及生成需要進一步處理的URL的 Request 對象。

  • ?

    運行我們的爬蟲

    進入項目的根目錄,執行下列命令啟動spider:

    scrapy crawl quotes

    這個命令啟動用于爬取 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)


    ?

    ?

    提取數據

    我們之前只是保存了HTML頁面,并沒有提取數據。現在升級一下代碼,把提取功能加進去。至于如何使用瀏覽器的開發者模式分析網頁,之前已經介紹過了。


    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(),}


    ?

    ?

    再次運行這個爬蟲,你將在日志里看到被提取出的數據:

    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.”"}

    ?

    保存爬取的數據

    最簡單存儲爬取的數據的方式是使用 Feed exports:

    scrapy crawl quotes -o quotes.json

    該命令將采用 JSON 格式對爬取的數據進行序列化,生成quotes.json文件。

    在類似本篇教程里這樣小規模的項目中,這種存儲方式已經足夠。如果需要對爬取到的item做更多更為復雜的操作,你可以編寫 Item Pipeline,tutorial/pipelines.py在最開始的時候已經自動創建了。


    最后,初學者進階的福音

    想學習,基礎不夠?沒關系,我們提供免費提供VIP基礎學習課程,讓你快速入門,掌握Python!

    ?

    有基礎的小伙伴想學習項目實戰?沒問題,每晚八點都有博士大牛帶你學習操作項目!

    ?

    只要你有一顆想學習的心,我們隨時歡迎~



    轉載于:https://blog.51cto.com/13887297/2298220

    總結

    以上是生活随笔為你收集整理的手把手教你写网络爬虫(4)Scrapy入门的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。