我們使用了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映象構建完成併成功執行。
我們可以將此映象上傳到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… (二維碼自動識別)