分散式爬蟲的部署之Scrapyd對接Docker

崔慶才丨靜覓發表於2018-06-04

我們使用了Scrapyd-Client成功將Scrapy專案部署到Scrapyd執行,前提是需要提前在伺服器上安裝好Scrapyd並執行Scrapyd服務,而這個過程比較麻煩。如果同時將一個Scrapy專案部署到100臺伺服器上,我們需要手動配置每臺伺服器的Python環境,更改Scrapyd配置嗎?如果這些伺服器的Python環境是不同版本,同時還執行其他的專案,而版本衝突又會造成不必要的麻煩。

所以,我們需要解決一個痛點,那就是Python環境配置問題和版本衝突解決問題。如果我們將Scrapyd直接打包成一個Docker映象,那麼在伺服器上只需要執行Docker命令就可以啟動Scrapyd服務,這樣就不用再關心Python環境問題,也不需要擔心版本衝突問題。

接下來,我們就將Scrapyd打包製作成一個Docker映象。

一、準備工作

請確保本機已經正確安裝好了Docker。

二、對接Docker

新建一個專案,新建一個scrapyd.conf,即Scrapyd的配置檔案,內容如下:

[scrapyd]
eggs_dir    = eggs
logs_dir    = logs
items_dir   =
jobs_to_keep = 5
dbs_dir     = dbs
max_proc    = 0
max_proc_per_cpu = 10
finished_to_keep = 100
poll_interval = 5.0
bind_address = 0.0.0.0
http_port   = 6800
debug       = off
runner      = scrapyd.runner
application = scrapyd.app.application
launcher    = scrapyd.launcher.Launcher
webroot     = scrapyd.website.Root

[services]
schedule.json     = scrapyd.webservice.Schedule
cancel.json       = scrapyd.webservice.Cancel
addversion.json   = scrapyd.webservice.AddVersion
listprojects.json = scrapyd.webservice.ListProjects
listversions.json = scrapyd.webservice.ListVersions
listspiders.json  = scrapyd.webservice.ListSpiders
delproject.json   = scrapyd.webservice.DeleteProject
delversion.json   = scrapyd.webservice.DeleteVersion
listjobs.json     = scrapyd.webservice.ListJobs
daemonstatus.json = scrapyd.webservice.DaemonStatus複製程式碼

這裡實際上是修改自官方文件的配置檔案:https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file,其中修改的地方有兩個。

  • max_proc_per_cpu=10,原本是4,即CPU單核最多執行4個Scrapy任務,也就是說1核的主機最多同時只能執行4個Scrapy任務,這裡設定上限為10,也可以自行設定。

  • bind_address = 0.0.0.0,原本是127.0.0.1,不能公開訪問,這裡修改為0.0.0.0即可解除此限制。

新建一個requirements.txt,將一些Scrapy專案常用的庫都列進去,內容如下:

requests
selenium
aiohttp
beautifulsoup4
pyquery
pymysql
redis
pymongo
flask
django
scrapy
scrapyd
scrapyd-client
scrapy-redis
scrapy-splash複製程式碼

如果執行的Scrapy專案還需要用到其他的庫,這些庫可以自行新增到此檔案中。

最後新建一個Dockerfile,內容如下:

FROM python:3.6
ADD . /code
WORKDIR /code
COPY ./scrapyd.conf /etc/scrapyd/
EXPOSE 6800
RUN pip3 install -r requirements.txt
CMD scrapyd複製程式碼

第一行的FROM是指在python:3.6這個映象上構建,也就是說在構建時就已經有了Python 3.6的環境。

第二行的ADD是將本地的程式碼放置到虛擬容器中。它有兩個引數:第一個引數是. ,即代表本地當前路徑;第二個引數/code代表虛擬容器中的路徑,也就是將本地專案所有內容放置到虛擬容器的/code目錄下。

第三行的WORKDIR是指定工作目錄,這裡將剛才新增的程式碼路徑設成工作路徑,這個路徑下的目錄結構和當前本地目錄結構是相同的,所以在這個目錄下可以直接執行庫安裝命令。

第四行的COPY是將當前目錄下的scrapyd.conf檔案複製到虛擬容器的/etc/scrapyd/目錄下,Scrapyd在執行的時候會預設讀取這個配置。

第五行的EXPOSE是宣告執行時容器提供服務埠,注意這裡只是一個宣告,執行時不一定會在此埠開啟服務。這個宣告的作用,一是告訴使用者這個映象服務的執行埠,以方便配置對映,二是在執行使用隨機埠對映時,容器會自動隨機對映EXPOSE的埠。

第六行的RUN是執行某些命令,一般做一些環境準備工作。由於Docker虛擬容器內只有Python 3環境,而沒有Python庫,所以我們執行此命令來在虛擬容器中安裝相應的Python庫,這樣專案部署到Scrapyd中便可以正常執行。

第七行的CMD是容器啟動命令,容器執行時,此命令會被執行。這裡我們直接用scrapyd來啟動Scrapyd服務。

基本工作完成了,我們執行如下命令進行構建:

docker build -t scrapyd:latest .複製程式碼

構建成功後即可執行測試:

docker run -d -p 6800:6800 scrapyd複製程式碼

開啟:http://localhost:6800,即可觀察到Scrapyd服務,如下圖所示。

分散式爬蟲的部署之Scrapyd對接Docker

這樣,Scrapyd Docker映象構建完成併成功執行。

我們可以將此映象上傳到Docker Hub。例如,我的Docker Hub使用者名稱為germey,新建一個名為scrapyd的專案,首先可以為映象打一個標籤來標識一下:

docker tag scrapyd:latest germey/scrapyd:latest複製程式碼

這裡請自行替換成你的專案名稱。

然後 Push 即可:

docker push germey/scrapyd:latest複製程式碼

之後在其他主機執行此命令即可啟動Scrapyd服務:

docker run -d -p 6800:6800 germey/scrapyd複製程式碼

Scrapyd成功在其他伺服器上執行。

三、結語

我們利用Docker解決了Python環境的問題。接下來,我們再解決批量部署Docker的問題。


本資源首發於崔慶才的個人部落格靜覓: Python3網路爬蟲開發實戰教程 | 靜覓

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

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


相關文章