我們直接用 Requests、Selenium 等庫(kù)寫(xiě)爬蟲(chóng),如果爬取量不是太大,速度要求不高,是完全可以滿足需求的。但是寫(xiě)多了會(huì)發(fā)現(xiàn)其內(nèi)部許多代碼和組件是可以復(fù)用的,如果我們把這些組件抽離出來(lái),將各個(gè)功能模塊化,就慢慢會(huì)形成一個(gè)框架雛形,久而久之,爬蟲(chóng)框架就誕生了。

利用框架我們可以不用再去關(guān)心某些功能的具體實(shí)現(xiàn),只需要去關(guān)心爬取邏輯即可。有了它們,可以大大簡(jiǎn)化代碼量,而且架構(gòu)也會(huì)變得清晰,爬取效率也會(huì)高許多。所以如果對(duì)爬蟲(chóng)有一定基礎(chǔ),上手框架是一種好的選擇。

本書(shū)主要介紹的爬蟲(chóng)框架有PySpider和Scrapy,本節(jié)我們來(lái)介紹一下 PySpider、Scrapy 以及它們的一些擴(kuò)展庫(kù)的安裝方式。

PySpider的安裝

PySpider 是國(guó)人 binux 編寫(xiě)的強(qiáng)大的網(wǎng)絡(luò)爬蟲(chóng)框架,它帶有強(qiáng)大的 WebUI、腳本編輯器、任務(wù)監(jiān)控器、項(xiàng)目管理器以及結(jié)果處理器,同時(shí)它支持多種數(shù)據(jù)庫(kù)后端、多種消息隊(duì)列,另外它還支持 JavaScript 渲染頁(yè)面的爬取,使用起來(lái)非常方便,本節(jié)介紹一下它的安裝過(guò)程。

1. 相關(guān)鏈接

  • 官方文檔:http://docs.pyspider.org/
  • PyPi:https://pypi.python.org/pypi/...
  • GitHub:https://github.com/binux/pysp...
  • 官方教程:http://docs.pyspider.org/en/l...
  • 在線實(shí)例:http://demo.pyspider.org

2. 準(zhǔn)備工作

PySpider 是支持 JavaScript 渲染的,而這個(gè)過(guò)程是依賴(lài)于 PhantomJS 的,所以還需要安裝 PhantomJS,所以在安裝之前請(qǐng)安裝好 PhantomJS,安裝方式在前文有介紹。

3. Pip安裝

推薦使用 Pip 安裝,命令如下:

            
              pip3 install pyspider
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
            
          

命令執(zhí)行完畢即可完成安裝。

4. 常見(jiàn)錯(cuò)誤

Windows 下可能會(huì)出現(xiàn)這樣的錯(cuò)誤提示:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-vXo1W3/pycurl
這個(gè)是 PyCurl 安裝錯(cuò)誤,一般會(huì)出現(xiàn)在 Windows 下,需要安裝 PyCurl 庫(kù),下載鏈接為:http://www.lfd.uci.edu/~gohlk...,找到對(duì)應(yīng) Python 版本然后下載相應(yīng)的 Wheel 文件。
如 Windows 64 位,Python3.6 則下載 pycurl?7.43.0?cp36?cp36m?win_amd64.whl,隨后用 Pip 安裝即可,命令如下:

            
              pip3 install pycurl?7.43.0?cp36?cp36m?win_amd64.whl
            
          

Linux 下如果遇到 PyCurl 的錯(cuò)誤可以參考本文:https://imlonghao.com/19.html

Mac遇到這種情況,執(zhí)行下面操作:

            
              brew install openssl

openssl version 
查看版本
find /usr/local -name ssl.h

可以看到形如:
usr/local/Cellar/openssl/1.0.2s/include/openssl/ssl.h

添加環(huán)境變量
export PYCURL_SSL_LIBRARY=openssl
export LDFLAGS=-L/usr/local/Cellar/openssl/1.0.2s/lib
export CPPFLAGS=-I/usr/local/Cellar/openssl/1.0.2s/include

 pip3 install pyspider
            
          

5. 驗(yàn)證安裝

安裝完成之后,可以直接在命令行下啟動(dòng) PySpider:

            
              pyspider all
            
          

圖 1-75 控制臺(tái)
這時(shí) PySpider 的 Web 服務(wù)就會(huì)在本地 5000 端口運(yùn)行,直接在瀏覽器打開(kāi):http://localhost:5000/ 即可進(jìn)入 PySpider 的 WebUI 管理頁(yè)面,如圖 1-76 所示:

Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)-10、爬蟲(chóng)框架的安裝:PySpider、Scrapy_第1張圖片

圖 1-76 管理頁(yè)面
如果出現(xiàn)類(lèi)似頁(yè)面那證明 PySpider 已經(jīng)安裝成功了。
在后文會(huì)介紹 PySpider 的詳細(xì)用法。

這里有一個(gè)深坑,PySpider在Python3.7上運(yùn)行時(shí)會(huì)報(bào)錯(cuò)

            
              File "/usr/local/lib/python3.7/site-packages/pyspider/run.py", line 231
    async=True, get_object=False, no_input=False):
        ^
SyntaxError: invalid syntax
            
          

原因是python3.7中async已經(jīng)變成了關(guān)鍵字。因此出現(xiàn)這個(gè)錯(cuò)誤。
修改方式是手動(dòng)替換一下

            
              下面位置的async改為mark_async

/usr/local/lib/python3.7/site-packages/pyspider/run.py  的231行、245行(兩個(gè))、365行

/usr/local/lib/python3.7/site-packages/pyspider/webui/app.py 的95行

/usr/local/lib/python3.7/site-packages/pyspider/fetcher/tornado_fetcher.py 的81行、89行(兩個(gè))、95行、117行

            
          

Scrapy的安裝

Scrapy 是一個(gè)十分強(qiáng)大的爬蟲(chóng)框架,依賴(lài)的庫(kù)比較多,至少需要依賴(lài)庫(kù)有 Twisted 14.0,lxml 3.4,pyOpenSSL 0.14。而在不同平臺(tái)環(huán)境又各不相同,所以在安裝之前最好確保把一些基本庫(kù)安裝好。本節(jié)介紹一下 Scrapy 在不同平臺(tái)的安裝方法。

1. 相關(guān)鏈接

  • 官方網(wǎng)站:https://scrapy.org
  • 官方文檔:https://docs.scrapy.org
  • PyPi:https://pypi.python.org/pypi/...
  • GitHub:https://github.com/scrapy/scrapy
  • 中文文檔:http://scrapy-chs.readthedocs.io

3. Mac下的安裝

在 Mac 上構(gòu)建 Scrapy 的依賴(lài)庫(kù)需要 C 編譯器以及開(kāi)發(fā)頭文件,它一般由 Xcode 提供,運(yùn)行如下命令安裝即可:

            
              xcode-select --install
            
          

隨后利用 Pip 安裝 Scrapy 即可,運(yùn)行如下命令:

            
              pip3 install Scrapy
            
          

運(yùn)行完畢之后即可完成 Scrapy 的安裝。

4. 驗(yàn)證安裝

安裝之后,在命令行下輸入 scrapy,如果出現(xiàn)類(lèi)似下方的結(jié)果,就證明 Scrapy 安裝成功,如圖 1-80 所示:

Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)-10、爬蟲(chóng)框架的安裝:PySpider、Scrapy_第2張圖片

圖 1-80 驗(yàn)證安裝

5. 常見(jiàn)錯(cuò)誤

            
              pkg_resources.VersionConflict: (six 1.5.2 (/usr/lib/python3/dist-packages), Requirement.parse('six>=1.6.0'))
            
          

six 包版本過(guò)低,six包是一個(gè)提供兼容 Python2 和 Python3 的庫(kù),升級(jí) six 包即可:

            
              sudo pip3 install -U six
            
          

            
              c/_cffi_backend.c:15:17: fatal error: ffi.h: No such file or directory
            
          

這是在 Linux 下常出現(xiàn)的錯(cuò)誤,缺少 Libffi 這個(gè)庫(kù)。什么是 libffi?“FFI” 的全名是 Foreign Function Interface,通常指的是允許以一種語(yǔ)言編寫(xiě)的代碼調(diào)用另一種語(yǔ)言的代碼。而 Libffi 庫(kù)只提供了最底層的、與架構(gòu)相關(guān)的、完整的”FFI”。
安裝相應(yīng)的庫(kù)即可。
Ubuntu、Debian:

            
              sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
            
          

CentOS、RedHat:

            
              sudo yum install gcc libffi-devel python-devel openssl-devel
            
          

            
              Command "python setup.py egg_info" failed with error code 1 in/tmp/pip-build/cryptography/
            
          

這是缺少加密的相關(guān)組件,利用Pip 安裝即可。

            
              pip3 install cryptography
            
          

            
              ImportError: No module named 'packaging'
            
          

缺少 packaging 這個(gè)包,它提供了 Python 包的核心功能,利用 Pip 安裝即可。


            
              ImportError: No module named '_cffi_backend'
            
          

缺少 cffi 包,使用 Pip 安裝即可:

            
              pip3 install cffi
            
          

            
              ImportError: No module named 'pyparsing'
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
            
          

缺少 pyparsing 包,使用 Pip 安裝即可:

            
              pip3 install pyparsing appdirs