天天看點

1.2 請求庫的安裝

1.2 請求庫的安裝

爬蟲可以簡單分為幾步:抓取頁面、分析頁面和存儲資料。

在抓取頁面的過程中,我們需要模拟浏覽器向伺服器送出請求,是以需要用到一些 Python 庫來實作 HTTP 請求操作。在本書中,我們用到的第三方庫有 requests、Selenium 和 aiohttp 等。

在本節中,我們介紹一下這些請求庫的安裝方法。

1.2.1 requests 的安裝

由于 requests 屬于第三方庫,也就是 Python 預設不會自帶這個庫,是以需要我們手動安裝。下面我們首先看一下它的安裝過程。

1. 相關連結

  • GitHub:https://github.com/requests/requests
  • PyPI:https://pypi.python.org/pypi/requests
  • 官方文檔:http://www.python-requests.org
  • 中文文檔:http://docs.python-requests.org/zh_CN/latest

2. pip 安裝

無論是 Windows、Linux 還是 Mac,都可以通過 pip 這個包管理工具來安裝。

在指令行界面中運作如下指令,即可完成 requests 庫的安裝:

pip3 install requests
           

這是最簡單的安裝方式,推薦使用這種方法安裝。

3. wheel 安裝

wheel 是 Python 的一種安裝包,其字尾為 .whl,在網速較差的情況下可以選擇下載下傳 wheel 檔案再安裝,然後直接用 pip3 指令加檔案名安裝即可。

不過在這之前需要先安裝 wheel 庫,安裝指令如下:

pip3 install wheel
           

然後到 PyPI 上下載下傳對應的 wheel 檔案,如最新版本為 2.17.3,則打開:https://pypi.python.org/pypi/requests/2.17.3#downloads,下載下傳 requests-2.17.3-py2.py3-none-any.whl 到本地。

随後在指令行界面進入 wheel 檔案目錄,利用 pip 安裝即可:

pip3 install requests-2.17.3-py2.py3-none-any.whl
           

這樣我們也可以完成 requests 的安裝。

4. 源碼安裝

如果你不想用 pip 來安裝,或者想擷取某一特定版本,可以選擇下載下傳源碼安裝。

此種方式需要先找到此庫的源碼位址,然後下載下傳下來再用指令安裝。

requests 項目的位址是:https://github.com/kennethreitz/requests

可以通過 Git 來下載下傳源代碼:

git clone git://github.com/kennethreitz/requests.git
           

或通過 curl 下載下傳:

curl -OL https://github.com/kennethreitz/requests/tarball/master
           

下載下傳下來之後,進入目錄,執行如下指令即可安裝:

cd requests
python3 setup.py install
           

指令執行結束後即可完成 requests 的安裝。由于這種安裝方式比較煩瑣,後面不再贅述。

5. 驗證安裝

為了驗證庫是否已經安裝成功,可以在指令行模式測試一下:

$ python3
>>> import requests
           

首先輸入 python3,進入指令行模式,然後輸入上述内容,如果什麼錯誤提示也沒有,就證明已經成功安裝了 requests。

1.2.2 Selenium 的安裝

Selenium 是一個自動化測試工具,利用它我們可以驅動浏覽器執行特定的動作,如點選、下拉等操作。對于一些 JavaScript 渲染的頁面來說,這種抓取方式非常有效。下面我們來看看 Selenium 的安裝過程。

1. 相關連結

  • 官方網站:http://www.seleniumhq.org
  • GitHub:https://github.com/SeleniumHQ/selenium/tree/master/py
  • PyPI:https://pypi.python.org/pypi/selenium
  • 官方文檔:http://selenium-python.readthedocs.io
  • 中文文檔:http://selenium-python-zh.readthedocs.io

2. pip 安裝

這裡推薦直接使用 pip 安裝,執行如下指令即可:

pip3 install selenium
           

3. wheel 安裝

此外,也可以到 PyPI 下載下傳對應的 wheel 檔案進行安裝,下載下傳位址為 https://pypi.python.org/pypi/selenium/#downloads,如最新版本為 3.4.3,則下載下傳 selenium-3.4.3-py2.py3-none-any.whl 即可。

然後進入 wheel 檔案目錄,使用 pip 安裝:

pip3 install selenium-3.4.3-py2.py3-none-any.whl
           

4. 驗證安裝

進入 Python 指令行互動模式,導入 Selenium 包,如果沒有報錯,則證明安裝成功:

$ python3
>>> import selenium
           

但這樣做還不夠,因為我們還需要用浏覽器(如 Chrome、Firefox 等)來配合 Selenium 工作。

後面我們會介紹 Chrome、Firefox、PhantomJS 三種浏覽器的配置方式。有了浏覽器,我們才可以配合 Selenium 進行頁面的抓取。

1.2.3 ChromeDriver 的安裝

前面我們成功安裝好了 Selenium 庫,但是它是一個自動化測試工具,需要浏覽器來配合使用,本節中我們就介紹一下 Chrome 浏覽器及 ChromeDriver 驅動的配置。

首先,下載下傳 Chrome 浏覽器,方法有很多,在此不再贅述。

随後安裝 ChromeDriver。因為隻有安裝 ChromeDriver,才能驅動 Chrome 浏覽器完成相應的操作。下面我們來介紹下怎樣安裝 ChromeDriver。

1. 相關連結

  • 官方網站:https://sites.google.com/a/chromium.org/chromedriver
  • 下載下傳位址:https://chromedriver.storage.googleapis.com/index.html

2. 準備工作

在這之前請確定已經正确安裝好了 Chrome 浏覽器并可以正常運作,安裝過程不再贅述。

3. 檢視版本

點選 Chrome 菜單 “幫助”→“關于 Google Chrome”,即可檢視 Chrome 的版本号,如圖 1-13 所示。

圖 1-13 Chrome 版本号

這裡我的 Chrome 版本是 58.0。

請記住 Chrome 版本号,因為選擇 ChromeDriver 版本時需要用到。

4. 下載下傳 ChromeDriver

打開 ChromeDriver 的官方網站,可以看到最新版本為 2.31,其支援的 Chrome 浏覽器版本為 58~60,官網頁面如圖 1-14 所示。

圖 1-14 官網頁面

如果你的 Chrome 版本号是 58~60,那麼可以選擇此版本下載下傳。

如果你的 Chrome 版本号不在此範圍,可以繼續檢視之前的 ChromeDriver 版本。每個版本都有相應的支援 Chrome 版本的介紹,請找好自己的 Chrome 浏覽器版本對應的 ChromeDriver 版本再下載下傳,否則可能無法正常工作。

找好對應的版本号後,随後到 ChromeDriver 鏡像站下載下傳對應的安裝包即可,連結為 https://chromedriver.storage.googleapis.com/index.html。在不同平台下,可以下載下傳不同的安裝包。

5. 環境變量配置

下載下傳完成後,将 ChromeDriver 的可執行檔案配置到環境變量下。

在 Windows 下,建議直接将 chromedriver.exe 檔案拖到 Python 的 Scripts 目錄下,如圖 1-15 所示。

圖 1-15 Python Scripts 目錄

此外,也可以單獨将其所在路徑配置到環境變量,具體的配置方法請參見 1.1 節。

在 Linux 和 Mac 下,需要将可執行檔案配置到環境變量或将檔案移動到屬于環境變量的目錄裡。

例如,要移動檔案到 /usr/bin 目錄。首先,需要在指令行模式下進入其所在路徑,然後将其移動到 /usr/bin 目錄:

sudo mv chromedriver /usr/bin
           

另外,如果你的系統是 Mac OS X El Capitan 10.11 及更新的系統版本的話,需要先關閉 Rootless 核心保護機制,具體可參考:http://www.pc6.com/edu/86809.html。

當然,也可以将 ChromeDriver 配置到 $PATH。首先,可以将可執行檔案放到某一目錄,目錄可以任意選擇,例如将目前可執行檔案放在 /usr/local/chromedriver 目錄下,接下來在 Linux 下可以修改~/.profile 檔案,在 Mac 下可以修改~/.bash_profile 檔案,添加如下内容:

export PATH="$PATH:/usr/local/chromedriver"
           

儲存後在 Linux 下執行如下指令:

source ~/.profile
           

在 Mac 下執行如下指令:

source ~/.bash_profile
           

即可完成環境變量的添加。

6. 驗證安裝

配置完成後,就可以在指令行下直接執行 chromedriver 指令了:

chromedriver
           

如果輸入控制台有類似圖 1-16 所示的輸出,則證明 ChromeDriver 的環境變量配置好了。

圖 1-16 控制台輸出

随後再在程式中測試。執行如下 Python 代碼:

from selenium import webdriver
browser = webdriver.Chrome()
           

運作之後,如果彈出一個空白的 Chrome 浏覽器,則證明所有的配置都沒有問題。如果沒有彈出,請檢查之前的每一步配置。

如果彈出後閃退,則可能是 ChromeDriver 版本和 Chrome 版本不相容,請更換 ChromeDriver 版本。

如果沒有問題,接下來就可以利用 Chrome 來做網頁抓取了。

1.2.4 GeckoDriver 的安裝

上一節中,我們了解了 ChromeDriver 的配置方法,配置完成之後便可以用 Selenium 驅動 Chrome 浏覽器來做相應網頁的抓取。

那麼對于 Firefox 來說,也可以使用同樣的方式完成 Selenium 的對接,這時需要安裝另一個驅動 GeckoDriver。

本節中,我們來介紹一下 GeckoDriver 的安裝過程。

1. 相關連結

  • GitHub:https://github.com/mozilla/geckodriver
  • 下載下傳位址:https://github.com/mozilla/geckodriver/releases

2. 準備工作

在這之前請確定已經正确安裝好了 Firefox 浏覽器并可以正常運作,安裝過程不再贅述。

3. 下載下傳 GeckoDriver

我們可以在 GitHub 上找到 GeckoDriver 的發行版本,目前最新版本為 0.18,下載下傳頁面如圖 1-17 所示。

圖 1-17 GeckoDriver 下載下傳頁面

這裡可以在不同的平台上下載下傳,如 Windows、Mac、Linux、ARM 等平台,我們可以根據自己的系統和位數選擇對應的驅動下載下傳,若是 Windows 64 位,就下載下傳 geckodriver-v0.18.0-win64.zip。

4. 環境變量配置

在 Windows 下,可以直接将 geckodriver.exe 檔案拖到 Python 的 Scripts 目錄下,如圖 1-18 所示。

圖 1-18 将 geckodriver.exe 檔案拖到 Python Scripts 目錄

此外,也可以單獨将其所在路徑配置到環境變量,具體的配置方法請參 1.1 節。

在 Linux 和 Mac 下,需要将可執行檔案配置到環境變量或将檔案移動到屬于環境變量的目錄裡。

例如,要移動檔案到 /usr/bin 目錄。首先在指令行模式下進入其所在路徑,然後将其移動到 /usr/bin:

sudo mv geckodriver /usr/bin
           

當然,也可以将 GeckoDriver 配置到 $PATH。首先,可以将可執行檔案放到某一目錄,目錄可以任意選擇,例如将目前可執行檔案放在 /usr/local/geckodriver 目錄下。接下來可以修改~/.profile 檔案,然後添加如下一句配置:

export PATH="$PATH:/usr/local/geckodriver"
           

儲存後執行如下指令即可完成配置:

source ~/.profile
           

5. 驗證安裝

配置完成後,就可以在指令行下直接執行 geckodriver 指令測試:

geckodriver
           

這時如果控制台有類似圖 1-19 所示的輸出,則證明 GeckoDriver 的環境變量配置好了。

圖 1-19 控制台輸出

随後執行如下 Python 代碼。在程式中測試一下:

from selenium import webdriver  
browser = webdriver.Firefox()
           

運作之後,若彈出一個空白的 Firefox 浏覽器,則證明所有的配置都沒有問題;如果沒有彈出,請檢查之前的每一步配置。

如果沒有問題,接下來就可以利用 Firefox 配合 Selenium 來做網頁抓取了。

現在我們就可以使用 Chrome 或 Firefox 進行網頁抓取了,但是這樣可能有個不友善之處:因為程式運作過程中需要一直開着浏覽器,在爬取網頁的過程中浏覽器可能一直動來動去。目前最新的 Chrome 浏覽器版本已經支援無界面模式了,但如果版本較舊的話,就不支援。是以這裡還有另一種選擇,那就是安裝一個無界面浏覽器 PhantomJS,此時抓取過程會在背景運作,不會再有視窗出現。在下一節中,我們就來了解一下 PhantomJS 的相關安裝方法。

1.2.5 PhantomJS 的安裝

PhantomJS 是一個無界面的、可腳本程式設計的 WebKit 浏覽器引擎,它原生支援多種 Web 标準:DOM 操作、CSS 選擇器、JSON、Canvas 以及 SVG。

Selenium 支援 PhantomJS,這樣在運作的時候就不會再彈出一個浏覽器了。而且 PhantomJS 的運作效率也很高,還支援各種參數配置,使用非常友善。下面我們就來了解一下 PhantomJS 的安裝過程。

1. 相關連結

  • 官方網站:http://phantomjs.org
  • 官方文檔:http://phantomjs.org/quick-start.html
  • 下載下傳位址:http://phantomjs.org/download.html
  • API 接口說明:http://phantomjs.org/api/command-line.html

2. 下載下傳 PhantomJS

我們需要在官方網站下載下傳對應的安裝包,PhantomJS 支援多種作業系統,比如 Windows、Linux、Mac、FreeBSD 等,我們可以選擇對應的平台并将安裝包下載下傳下來。

下載下傳完成後,将 PhantomJS 可執行檔案所在的路徑配置到環境變量裡。比如在 Windows 下,将下載下傳的檔案解壓之後并打開,會看到一個 bin 檔案夾,裡面包括一個可執行檔案 phantomjs.exe,我們需要将它直接放在配置好環境變量的路徑下或者将它所在的路徑配置到環境變量裡。比如,我們既可以将它直接複制到 Python 的 Scripts 檔案夾,也可以将它所在的 bin 目錄加入到環境變量。

Windows 下環境變量的配置可以參見 1.1 節,Linux 及 Mac 環境變量的配置可以參見 1.2.3 節,在此不再贅述,關鍵在于将 PhantomJS 的可執行檔案所在路徑配置到環境變量裡。

配置成功後,可以在指令行下測試一下,輸入:

phantomjs
           

如果可以進入到 PhantomJS 的指令行,那就證明配置完成了,如圖 1-20 所示。

圖 1-20 控制台

3. 驗證安裝

在 Selenium 中使用的話,我們隻需要将 Chrome 切換為 PhantomJS 即可:

from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get('https://www.baidu.com')
print(browser.current_url)
           

運作之後,我們就不會發現有浏覽器彈出了,但實際上 PhantomJS 已經運作起來了。這裡我們通路了百度,然後将目前的 URL 列印出來。

控制台的輸出如下:

https://www.baidu.com/
           

如此一來,我們便完成了 PhantomJS 的配置,後面可以利用它來完成一些頁面的抓取。

這裡我們介紹了 Selenium 對應的三大主流浏覽器的對接方式,後面我們會對 Selenium 及各個浏覽器的對接方法進行更加深入的探究。

1.2.6 aiohttp 的安裝

之前介紹的 requests 庫是一個阻塞式 HTTP 請求庫,當我們發出一個請求後,程式會一直等待伺服器響應,直到得到響應後,程式才會進行下一步處理。其實,這個過程比較耗費時間。如果程式可以在這個等待過程中做一些其他的事情,如進行請求的排程、響應的處理等,那麼爬取效率一定會大大提高。

aiohttp 就是這樣一個提供異步 Web 服務的庫,從 Python 3.5 版本開始,Python 中加入了 async/await 關鍵字,使得回調的寫法更加直覺和人性化。aiohttp 的異步操作借助于 async/await 關鍵字的寫法變得更加簡潔,架構更加清晰。使用異步請求庫進行資料抓取時,會大大提高效率,下面我們來看一下這個庫的安裝方法。

1. 相關連結

  • 官方文檔:http://aiohttp.readthedocs.io/en/stable
  • GitHub:https://github.com/aio-libs/aiohttp
  • PyPI:https://pypi.python.org/pypi/aiohttp

2. pip 安裝

這裡推薦使用 pip 安裝,指令如下:

pip3 install aiohttp
           

另外,官方還推薦安裝如下兩個庫:一個是字元編碼檢測庫 cchardet,另一個是加速 DNS 的解析庫 aiodns。安裝指令如下:

pip3 install cchardet aiodns
           

3. 測試安裝

安裝完成之後,可以在 Python 指令行下測試:

$ python3
>>> import aiohttp
           

如果沒有錯誤報出,則證明庫已經安裝好了。

我們會在後面的執行個體中用到這個庫,比如維護一個代理池時,利用異步方式檢測大量代理的運作狀況,會極大地提升效率。