環境配置問題可能一直會讓咱們頭疼,包括以下幾種狀況。
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鏡像。
咱們要實現把前文Scrapy的入門項目打包成一個Docker鏡像的過程。項目爬取的網址爲:http://quotes.toscrape.com/。本章Scrapy入門一節已經實現了Scrapy對此站點的爬取過程,項目代碼爲:https://github.com/Python3WebSpider/ScrapyTutorial。若是本地不存在的話能夠將代碼Clone下來。
請確保已經安裝好Docker和MongoDB並能夠正常運行。
首先在項目的根目錄下新建一個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來啓動爬蟲。
接下來咱們須要修改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數據庫地址。
這樣項目的配置就完成了。
接下來咱們構建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複製代碼
這就是咱們新構建的鏡像。
鏡像能夠先在本地測試運行,咱們執行以下命令:
docker run quotes複製代碼
這樣咱們就利用此鏡像新建並運行了一個Docker容器,運行效果徹底一致,以下圖所示。
若是出現相似圖上的運行結果,這就證實構建的鏡像沒有問題。
構建完成以後,咱們能夠將鏡像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環境,不須要關心版本衝突問題。
運行效果以下圖所示。
整個項目爬取完成後,數據就能夠存儲到指定的數據庫中。
咱們講解了將Scrapy項目製做成Docker鏡像並部署到遠程服務器運行的過程。使用此種方式,咱們在本節開頭所列出的問題都迎刃而解。
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)