分散式爬蟲的部署之Scrapyd對接Docker
我們使用了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 = eggslogs_dir = logsitems_dir =jobs_to_keep = 5dbs_dir = dbsmax_proc = 0max_proc_per_cpu = 10finished_to_keep = 100poll_interval = 5.0bind_address = 0.0.0.0http_port = 6800debug = offrunner = scrapyd.runnerapplication = scrapyd.app.applicationlauncher = scrapyd.launcher.Launcherwebroot = scrapyd.website.Root[services]schedule.json = scrapyd.webservice.Schedulecancel.json = scrapyd.webservice.Canceladdversion.json = scrapyd.webservice.AddVersionlistprojects.json = scrapyd.webservice.ListProjectslistversions.json = scrapyd.webservice.ListVersionslistspiders.json = scrapyd.webservice.ListSpidersdelproject.json = scrapyd.webservice.DeleteProjectdelversion.json = scrapyd.webservice.DeleteVersionlistjobs.json = scrapyd.webservice.ListJobsdaemonstatus.json = scrapyd.webservice.DaemonStatus
這裡實際上是修改自官方文檔的配置文件:https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file,其中修改的地方有兩個。
,原本是4,即CPU單核最多運行4個Scrapy任務,也就是說1核的主機最多同時只能運行4個Scrapy任務,這裡設置上限為10,也可以自行設置。
,原本是127.0.0.1,不能公開訪問,這裡修改為0.0.0.0即可解除此限制。
新建一個requirements.txt,將一些Scrapy項目常用的庫都列進去,內容如下:
requestsseleniumaiohttpbeautifulsoup4pyquerypymysqlredispymongoflaskdjangoscrapyscrapydscrapyd-clientscrapy-redisscrapy-splash
如果運行的Scrapy項目還需要用到其他的庫,這些庫可以自行添加到此文件中。
最後新建一個Dockerfile,內容如下:
FROM python:3.6ADD . /codeWORKDIR /codeCOPY ./scrapyd.conf /etc/scrapyd/EXPOSE 6800RUN pip3 install -r requirements.txtCMD scrapyd
第一行的是指在這個鏡像上構建,也就是說在構建時就已經有了Python 3.6的環境。
第二行的是將本地的代碼放置到虛擬容器中。它有兩個參數:第一個參數是 ,即代表本地當前路徑;第二個參數代表虛擬容器中的路徑,也就是將本地項目所有內容放置到虛擬容器的/code目錄下。
第三行的是指定工作目錄,這裡將剛才添加的代碼路徑設成工作路徑,這個路徑下的目錄結構和當前本地目錄結構是相同的,所以在這個目錄下可以直接執行庫安裝命令。
第四行的是將當前目錄下的scrapyd.conf文件複製到虛擬容器的/etc/scrapyd/目錄下,Scrapyd在運行的時候會默認讀取這個配置。
第五行的是聲明運行時容器提供服務埠,注意這裡只是一個聲明,運行時不一定會在此埠開啟服務。這個聲明的作用,一是告訴使用者這個鏡像服務的運行埠,以方便配置映射,二是在運行使用隨機埠映射時,容器會自動隨機映射的埠。
第六行的是執行某些命令,一般做一些環境準備工作。由於Docker虛擬容器內只有Python 3環境,而沒有Python庫,所以我們運行此命令來在虛擬容器中安裝相應的Python庫,這樣項目部署到Scrapyd中便可以正常運行。
第七行的是容器啟動命令,容器運行時,此命令會被執行。這裡我們直接用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的問題。
TAG:進擊的Coder |