Python爬蟲框架Scrapy簡介
在爬蟲的路上,學習scrapy是一個必不可少的環(huán)節(jié)。也許有好多朋友此時此刻也正在接觸并學習scrapy,那么很好,我們一起學習。開始接觸scrapy的朋友可能會有些疑惑,畢竟是一個框架,上來不知從何學起。從本篇起,博主將開啟scrapy學習的系列,分享如何快速入門scrapy并熟練使用它。
本篇作為第一篇,主要介紹和了解scrapy,在結尾會向大家推薦一本關于學習scrapy的書,以及獲取的方式。
為什么要用爬蟲框架?
如果你對爬蟲的基礎知識有了一定了解的話,那么是時候該了解一下爬蟲框架了。那么為什么要使用爬蟲框架?
- 學習框架的根本是學習一種編程思想,而不應該僅僅局限于是如何使用它。從了解到掌握一種框架,其實是對一種思想理解的過程。
- 框架也給我們的開發(fā)帶來了極大的方便。許多條條框框都已經(jīng)是寫好了的,并不需要我們重復造輪子,我們只需要根據(jù)自己的需求定制自己要實現(xiàn)的功能就好了,大大減少了工作量。
- 參考并學習優(yōu)秀的框架代碼,提升編程代碼能力。
博主當時是根據(jù)這幾點來進行爬蟲框架的學習的,但是切記核心目標是掌握一種框架思想,一種框架的能力,掌握了這種思想你才能更好的去使用它,甚至擴展它。
scrapy框架的介紹
比較流行的爬蟲的框架有scrapy和pyspider,但是被大家所鐘愛的我想非scrapy莫屬了。scrapy是一個開源的高級爬蟲框架,我們可以稱它為"scrapy語言"。它使用python編寫,用于爬取網(wǎng)頁,提取結構性數(shù)據(jù),并可將抓取得結構性數(shù)據(jù)較好的應用于數(shù)據(jù)分析和數(shù)據(jù)挖掘。scrapy有以下的一些特點:
- scrapy基于事件的機制,利用twisted的設計實現(xiàn)了非阻塞的異步操作。這相比于傳統(tǒng)的阻塞式請求,極大的提高了CPU的使用率,以及爬取效率。
- 配置簡單,可以簡單的通過設置一行代碼實現(xiàn)復雜功能。
- 可拓展,插件豐富,比如分布式scrapy + redis、爬蟲可視化等插件。
- 解析方便易用,scrapy封裝了xpath等解析器,提供了更方便更高級的selector構造器,可有效的處理破損的HTML代碼和編碼。
scrapy和requests+bs用哪個好?
有的朋友問了,為什么要使用scrapy,不使用不行嗎?用resquests + beautifulsoup組合難道不能完成嗎?
不用糾結,根據(jù)自己方便來。resquests + beautifulsoup當然可以了,requests + 任何解析器都行,都是非常好的組合。這樣用的優(yōu)點是我們可以靈活的寫我們自己的代碼,不必拘泥于固定模式。對于使用固定的框架有時候不一定用起來方便,比如scrapy對于反反爬的處理并沒有很完善,好多時候也要自己來解決。
但是對于一些中小型的爬蟲任務來講,scrapy確實是非常好的選擇,它避免了我們來寫一些重復的代碼,并且有著出色的性能。我們自己寫代碼的時候,比如為了提高爬取效率,每次都自己碼多線程或異步等代碼,大大浪費了開發(fā)時間。這時候使用已經(jīng)寫好的框架是再好不過的選擇了,我們只要簡單的寫寫解析規(guī)則和pipeline就好了。那么具體哪些是需要我們做的呢?看看下面這個圖就明白了。
因此,對于該用哪個,根據(jù)個人需求和喜好決定。但是至于學習的先后順序,建議先學學resquests + beautifulsoup,然后再接觸Scrapy效果可能會更好些,僅供參考。
scrapy的架構
在學習Scrapy之前,我們需要了解Scrapy的架構,明白這個架構對學習scrapy至關重要。
Scrapy官方文檔的圖片
下面的描述引自官方doc文檔(在此引用),講的很清楚明白,對照這個圖看就能明白。
組件
Scrapy Engine
引擎負責控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動,并在相應動作發(fā)生時觸發(fā)事件。 詳細內(nèi)容查看下面的數(shù)據(jù)流(Data Flow)部分。
調(diào)度器(Scheduler)
調(diào)度器從引擎接受request并將他們?nèi)腙?,以便之后引擎請求他們時提供給引擎。
下載器(Downloader)
下載器負責獲取頁面數(shù)據(jù)并提供給引擎,而后提供給spider。
Spiders
Spider是Scrapy用戶編寫用于分析response并提取item(即獲取到的item)或額外跟進的URL的類。 每個spider負責處理一個特定(或一些)網(wǎng)站。
Item Pipeline
Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到數(shù)據(jù)庫中)。
下載器中間件(Downloader middlewares)
下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的response。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
Spider中間件(Spider middlewares)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
數(shù)據(jù)流過程
- 引擎打開一個網(wǎng)站(open a domain),找到處理該網(wǎng)站的Spider并向該spider請求第一個要爬取的URL(s)。
- 引擎從Spider中獲取到第一個要爬取的URL并在調(diào)度器(Scheduler)以Request調(diào)度。
- 引擎向調(diào)度器請求下一個要爬取的URL。
- 調(diào)度器返回下一個要爬取的URL給引擎,引擎將URL通過下載中間件(請求(request)方向)轉發(fā)給下載器(Downloader)。
- 一旦頁面下載完畢,下載器生成一個該頁面的Response,并將其通過下載中間件(返回(response)方向)發(fā)送給引擎。
- 引擎從下載器中接收到Response并通過Spider中間件(輸入方向)發(fā)送給Spider處理。
- Spider處理Response并返回爬取到的Item及(跟進的)新的Request給引擎。
- 引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給調(diào)度器。
- (從第二步)重復直到調(diào)度器中沒有更多地request,引擎關閉該網(wǎng)站。
到此這篇關于Python爬蟲框架Scrapy的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解
這篇文章主要介紹了Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解,具有一定借鑒價值,需要的朋友可以參考下2017-12-12pandas庫之DataFrame滑動窗口的實現(xiàn)
本文主要介紹了pandas庫之DataFrame滑動窗口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03python多版本工具miniconda的配置優(yōu)化實現(xiàn)
通過Miniconda,您可以輕松地創(chuàng)建和管理多個Python環(huán)境,同時確保每個環(huán)境具有所需的依賴項和軟件包,本文主要介紹了python多版本工具miniconda的配置優(yōu)化實現(xiàn),感興趣的可以了解一下2024-01-01Python中模塊(Module)和包(Package)的區(qū)別詳解
這篇文章主要介紹了Python中模塊(Module)和包(Package)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08