我以前作的項目:一直用的 Linux的Screen會話工具+ Scrapy的JOBDIR來控制爬蟲開關。
可是有後來想到用 Web 來控制爬蟲的開關。因此我想到了用Scrapyd服務實現。前端
pip install scrapyd
scrapyd # 就這一條shell命令便可啓動服務
若是你相對爬蟲服務作一些配置,(好比 log目錄,綁定地址,綁定端口。。等,可修改以下配置文件):vue
vi /usr/lib/python3.6/site-packages/scrapyd/default_scrapyd.conf
首先確保你的爬蟲程序單測能夠無誤運行!
狀況1:(爬蟲程序在linux, 上面講的scrapyd服務也在linux)
首先安裝個模塊:python
pip install scrapyd-client
修改scrapy的scrapy.cfg文件:linux
[deploy:Cython_lin] # 這個 Cython_lin 是服務名,可自定義,但後面還會用到 url = http://23.23.xx.xx:6800/ # 這是你上面啓動的Scrapyd服務的 URL+PORT project = Baidu # 這個文件是你運行 scrapy startproject 時 自動建立的文件。 在項目根目錄下, 就叫 "scrapy.cfg":
正式推送本機爬蟲程序到Scrapyd:ios
以下有3個說明: 1. 你須要在項目根目錄下,執行這個命令 2. Cython_lin 就是咱們上面 scrapy.cfg文件 配置的服務名 3. Baidu 就是 scrapy.cfg文件 裏面的那個 project屬性的值,也是 項目名 scrapyd-deploy Cython_lin -p Baidu
狀況2,番外篇(Windows開發,Linux部署)
一樣安裝個客戶端模塊(windows):docker
pip install scrapyd-client
修改scrapy的scrapy.cfg文件(windows):shell
[deploy:Cython_lin] # 這個 Cython_lin 是服務名,可自定義,但後面還會用到 url = http://23.23.xx.xx:6800/ # 這是你上面啓動的Scrapyd服務的 URL+PORT project = Baidu
創建一個文件名爲 scrapyd-deploy.bat, 內容做下(windows):
注意:這個文件是建立在python的安裝路徑下(若是你是虛擬環境,那麼就去虛擬環境的python路徑中)django
@echo off "D:\Virtualenv_All\scrapy\Scripts\python.exe" "D:\Virtualenv_All\scrapy\Scripts\scrapyd-deploy" %1 %2 %3 %4 %5 %6 %7 %8 %9
隨後將剛纔的路徑,配置到環境變量中(若是不想設置環境變量,那麼每次須要用絕對路徑用scrapyd-deploy)json
scrapyd-deploy Cython_lin -p Baidu 這條命令和上面(linux版本)講的是如出一轍的, 一樣要在scrapy根路徑下執行
前面咱們已經徹底將爬蟲Scrapyd服務部署完成。接下來就是開啓調用的環節:
scrapyd採用 "請求接口" 的方式取開啓或終止爬蟲:
查看爬蟲情況:axios
curl http://23.23.xx.xx:6800/daemonstatus.json
正式開啓爬蟲程序:
curl http://39.107.86.223:6800/schedule.json -d project=Baidu -d spider=zhidao # 注意: "Baidu"是項目名, 而 "zhidao" 是每一個 spider的名字 (就是主程序的爬蟲名name=...) # 注意: 開啓的時候會給你一個ID, 你要記住它 ,方便咱們中止
中止爬蟲程序:
curl http://23.23.xx.xx:6800/cancel.json -d project=Baidu -d job=運行ID
上面咱們說了用 curl 發送請求去操控爬蟲的開啓與暫停。可是這並非習慣的作法。
更好的是,經過Qt 或者 經過Web, 來操控爬蟲。
pip install python-scrapyd-api # 預先安裝此模塊 from scrapyd_api import ScrapydAPI scrapyd = ScrapydAPI('39.107.xx.xx:6800') # 先獲取 scrapyd遠程服務的客戶端鏈接 class SpiderView(View): # 我使用的是 Django的 CBV def get(self, request): state_dict = scrapyd.list_jobs('Baidu') # 列出項目全部爬蟲任務,返回字典 if request.GET.get('tag') == 'start': # 檢測爬蟲是否爲運行狀態 scrapyd.schedule('Baidu', 'zhidao') # 'project_name', 'spider_name' return HttpResponse('0') # 若是正在運行,給前端一個值,按鈕 if request.GET.get('tag') == 'stop': # 前端點下按鈕若是get傳值爲stop try: state = state_dict['running'][0]['id'] # 若取不到,就拋異常 except: return HttpResponse('-1') # 隨便返回一個值,不用處理 scrapyd.cancel('Baidu', state) # 根據 id取消 爬蟲入伍 return HttpResponse('0') # 並返回0(這個0是我自定義的,前端也用的0) return HttpResponse('')
其實後端接口作好了,前端就隨意了。我用的 Nuxt+Vue,主要貼一下核心method吧:
methods: { start() { axios.get('http://39.xx.xx:8000/spider', { # 注意這時請求的Django params: { 'tag': 'start' } }).then( (response) => { this.tag = Number.parseInt(response['data']) if (this.tag === 0) { # 若是django返回值爲0 this.start_msg = '開啓成功,切記不要重複開啓' # 用於vue模板提示 this.start_unable = true # 把按鈕禁用,防止重複請求 this.stop_unable = false # 同時把中止按鈕由禁用設置爲激活 this.start_layer() # 這個函數內部實現了消息彈框 // this.stop_unable = false } } ), stop() { axios.get('http://39.107.xx.xx:8000/spider', { # 注意這是請求的Django params: { 'tag': 'stop' } # 發一個 stop參數的get請求 }).then( (response) => { this.tag = Number.parseInt(response['data']) if (this.tag === 0) { # 若是返回0, 這個0是我在Django本身指定的。 this.stop_msg = '關閉成功,切記不要重複關閉' this.start_unable= false # 負負得正,開始按鈕激活 this.stop_unable = true # 中止按鈕禁用 this.stop_layer() # 無關禁用的彈窗信息 } } ) }, },
若是你也想過使用docker+docker-compose (開啓服務,推送代碼一體化)
請看下篇: https://segmentfault.com/a/11...
我是設置2個按鈕(開啓、關閉互斥,點哪一個哪一個就被禁用,與此同時另外一個按鈕就會被激活)。
固然,你也能夠用 單機,雙擊。等用一個按鈕來控制開啓和關閉。
固然這些只是標誌性的功能。 核心功能仍是 Django視圖中的 ScrapydAPI 這個API的使用
python-scrapyd-api官檔:https://pypi.org/project/pyth...