咱們使用了Scrapyd-Client成功將Scrapy項目部署到Scrapyd運行,前提是須要提早在服務器上安裝好Scrapyd並運行Scrapyd服務,而這個過程比較麻煩。若是同時將一個Scrapy項目部署到100臺服務器上,咱們須要手動配置每臺服務器的Python環境,更改Scrapyd配置嗎?若是這些服務器的Python環境是不一樣版本,同時還運行其餘的項目,而版本衝突又會形成沒必要要的麻煩。html
因此,咱們須要解決一個痛點,那就是Python環境配置問題和版本衝突解決問題。若是咱們將Scrapyd直接打包成一個Docker鏡像,那麼在服務器上只須要執行Docker命令就能夠啓動Scrapyd服務,這樣就不用再關心Python環境問題,也不須要擔憂版本衝突問題。python
接下來,咱們就將Scrapyd打包製做成一個Docker鏡像。mysql
請確保本機已經正確安裝好了Docker。
web
新建一個項目,新建一個scrapyd.conf,即Scrapyd的配置文件,內容以下:
redis
[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,其中修改的地方有兩個。sql
max_proc_per_cpu=10
,本來是4,即CPU單核最多運行4個Scrapy任務,也就是說1核的主機最多同時只能運行4個Scrapy任務,這裏設置上限爲10,也能夠自行設置。docker
bind_address = 0.0.0.0
,本來是127.0.0.1,不能公開訪問,這裏修改成0.0.0.0便可解除此限制。django
新建一個requirements.txt,將一些Scrapy項目經常使用的庫都列進去,內容以下:json
requests
selenium
aiohttp
beautifulsoup4
pyquery
pymysql
redis
pymongo
flask
django
scrapy
scrapyd
scrapyd-client
scrapy-redis
scrapy-splash複製代碼
若是運行的Scrapy項目還須要用到其餘的庫,這些庫能夠自行添加到此文件中。flask
最後新建一個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… (二維碼自動識別)