Scrapy 對接 Docker

環境配置問題可能一直會讓咱們頭疼,包括以下幾種狀況。
html

  • 咱們在本地寫好了一個Scrapy爬蟲項目,想要把它放到服務器上運行,可是服務器上沒有安裝Python環境。python

  • 其餘人給了咱們一個Scrapy爬蟲項目,項目使用包的版本和本地環境版本不一致,項目沒法直接運行。git

  • 咱們須要同時管理不一樣版本的Scrapy項目,如早期的項目依賴於Scrapy 0.25,如今的項目依賴於Scrapy 1.4.0。github

在這些狀況下,咱們須要解決的就是環境的安裝配置、環境的版本衝突解決等問題。mongodb

對於Python來講,VirtualEnv的確能夠解決版本衝突的問題。可是,VirtualEnv不太方便作項目部署,咱們仍是須要安裝Python環境,docker

如何解決上述問題呢?答案是用Docker。Docker能夠提供操做系統級別的虛擬環境,一個Docker鏡像通常都包含一個完整的操做系統,而這些系統內也有已經配置好的開發環境,如Python 3.6環境等。數據庫

咱們能夠直接使用此Docker的Python 3鏡像運行一個容器,將項目直接放到容器裏運行,就不用再額外配置Python 3環境。這樣就解決了環境配置的問題。bash

咱們也能夠進一步將Scrapy項目製做成一個新的Docker鏡像,鏡像裏只包含適用於本項目的Python環境。若是要部署到其餘平臺,只須要下載該鏡像並運行就行了,由於Docker運行時採用虛擬環境,和宿主機是徹底隔離的,因此也不須要擔憂環境衝突問題。服務器

若是咱們可以把Scrapy項目製做成一個Docker鏡像,只要其餘主機安裝了Docker,那麼只要將鏡像下載並運行便可,而沒必要再擔憂環境配置問題或版本衝突問題。微信

接下來,咱們嘗試把一個Scrapy項目製做成一個Docker鏡像。

1、本節目標

咱們要實現把前文Scrapy的入門項目打包成一個Docker鏡像的過程。項目爬取的網址爲:http://quotes.toscrape.com/。本章Scrapy入門一節已經實現了Scrapy對此站點的爬取過程,項目代碼爲:https://github.com/Python3WebSpider/ScrapyTutorial。若是本地不存在的話能夠將代碼Clone下來。

2、準備工做

請確保已經安裝好Docker和MongoDB並能夠正常運行。

3、建立Dockerfile

首先在項目的根目錄下新建一個requirements.txt文件,將整個項目依賴的Python環境包都列出來,以下所示:

scrapy
pymongo複製代碼

若是庫須要特定的版本,咱們還能夠指定版本號,以下所示:

scrapy>=1.4.0
pymongo>=3.4.0複製代碼

在項目根目錄下新建一個Dockerfile文件,文件不加任何後綴名,修改內容以下所示:

FROM python:3.6
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip3 install -r requirements.txt
CMD scrapy crawl quotes複製代碼

第一行的FROM表明使用的Docker基礎鏡像,在這裏咱們直接使用python:3.6的鏡像,在此基礎上運行Scrapy項目。

第二行ENV是環境變量設置,將/usr/local/bin:$PATH賦值給PATH,即增長/usr/local/bin這個環境變量路徑。

第三行ADD是將本地的代碼放置到虛擬容器中。它有兩個參數:第一個參數是.,表明本地當前路徑;第二個參數是/code,表明虛擬容器中的路徑,也就是將本地項目全部內容放置到虛擬容器的/code目錄下,以便於在虛擬容器中運行代碼。

第四行WORKDIR是指定工做目錄,這裏將剛纔添加的代碼路徑設成工做路徑。這個路徑下的目錄結構和當前本地目錄結構是相同的,因此咱們能夠直接執行庫安裝命令、爬蟲運行命令等。

第五行RUN是執行某些命令來作一些環境準備工做。因爲Docker虛擬容器內只有Python 3環境,而沒有所須要的Python庫,因此咱們運行此命令來在虛擬容器中安裝相應的Python庫如Scrapy,這樣就能夠在虛擬容器中執行Scrapy命令了。

第六行CMD是容器啓動命令。在容器運行時,此命令會被執行。在這裏咱們直接用scrapy crawl quotes來啓動爬蟲。

4、修改MongDB鏈接

接下來咱們須要修改MongoDB的鏈接信息。若是咱們繼續用localhost是沒法找到MongoDB的,由於在Docker虛擬容器裏localhost實際指向容器自己的運行IP,而容器內部並無安裝MongoDB,因此爬蟲沒法鏈接MongoDB。

這裏的MongoDB地址能夠有以下兩種選擇。

  • 若是隻想在本機測試,咱們能夠將地址修改成宿主機的IP,也就是容器外部的本機IP,通常是一個局域網IP,使用ifconfig命令便可查看。

  • 若是要部署到遠程主機運行,通常MongoDB都是可公網訪問的地址,修改成此地址便可。

在本節中,咱們的目標是將項目打包成一個鏡像,讓其餘遠程主機也可運行這個項目。因此咱們直接將此處MongoDB地址修改成某個公網可訪問的遠程數據庫地址,修改MONGO_URI以下所示:

MONGO_URI = 'mongodb://admin:admin123@120.27.34.25:27017'複製代碼

此處地址能夠修改成本身的遠程MongoDB數據庫地址。

這樣項目的配置就完成了。

5、構建鏡像

接下來咱們構建Docker鏡像,執行以下命令:

docker build -t quotes:latest .複製代碼

執行過程當中的輸出以下所示:

Sending build context to Docker daemon 191.5 kB
Step 1/6 : FROM python:3.6
 ---> 968120d8cbe8
Step 2/6 : ENV PATH /usr/local/bin:$PATH
 ---> Using cache
 ---> 387abbba1189
Step 3/6 : ADD . /code
 ---> a844ee0db9c6
Removing intermediate container 4dc41779c573
Step 4/6 : WORKDIR /code
 ---> 619b2c064ae9
Removing intermediate container bcd7cd7f7337
Step 5/6 : RUN pip3 install -r requirements.txt
 ---> Running in 9452c83a12c5
...
Removing intermediate container 9452c83a12c5
Step 6/6 : CMD scrapy crawl quotes
 ---> Running in c092b5557ab8
 ---> c8101aca6e2a
Removing intermediate container c092b5557ab8
Successfully built c8101aca6e2a複製代碼

這樣的輸出就說明鏡像構建成功。這時咱們查看一下構建的鏡像,以下所示:

docker images複製代碼

返回結果中的一行代碼以下所示:

quotes  latest  41c8499ce210    2 minutes ago   769 MB複製代碼

這就是咱們新構建的鏡像。

6、運行

鏡像能夠先在本地測試運行,咱們執行以下命令:

docker run quotes複製代碼

這樣咱們就利用此鏡像新建並運行了一個Docker容器,運行效果徹底一致,以下圖所示。

若是出現相似圖上的運行結果,這就證實構建的鏡像沒有問題。

7、推送至Docker Hub

構建完成以後,咱們能夠將鏡像Push到Docker鏡像託管平臺,如Docker Hub或者私有的Docker Registry等,這樣咱們就能夠從遠程服務器下拉鏡像並運行了。

以Docker Hub爲例,若是項目包含一些私有的鏈接信息(如數據庫),咱們最好將Repository設爲私有或者直接放到私有的Docker Registry。

首先在https://hub.docker.com註冊一個帳號,新建一個Repository,名爲quotes。好比,個人用戶名爲germey,新建的Repository名爲quotes,那麼此Repository的地址就能夠用germey/quotes來表示。

爲新建的鏡像打一個標籤,命令以下所示:

docker tag quotes:latest germey/quotes:latest複製代碼

Push鏡像到Docker Hub便可,命令以下所示:

docker push germey/quotes複製代碼

Docker Hub便會出現新Push的Docker鏡像了,以下圖所示。

若是咱們想在其餘的主機上運行這個鏡像,主機上裝好Docker後,能夠直接執行以下命令:

docker run germey/quotes複製代碼

這樣就會自動下載鏡像,啓動容器運行。不須要配置Python環境,不須要關心版本衝突問題。

運行效果以下圖所示。

整個項目爬取完成後,數據就能夠存儲到指定的數據庫中。

8、結語

咱們講解了將Scrapy項目製做成Docker鏡像並部署到遠程服務器運行的過程。使用此種方式,咱們在本節開頭所列出的問題都迎刃而解。


本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓

如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder

weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)

相關文章
相關標籤/搜索