PY => Scrapyd部署爬蟲+封裝Django-View接口調用

前言

我以前作的項目:一直用的 Linux的Screen會話工具+ Scrapy的JOBDIR來控制爬蟲開關。
可是有後來想到用 Web 來控制爬蟲的開關。因此我想到了用Scrapyd服務實現。前端

部署爬蟲項目

安裝scrapyd服務

pip install scrapyd

啓動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

Django視圖內嵌控制爬蟲程序

上面咱們說了用 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

若是你也想過使用docker+docker-compose (開啓服務,推送代碼一體化)
請看下篇: https://segmentfault.com/a/11...

結束語

我是設置2個按鈕(開啓、關閉互斥,點哪一個哪一個就被禁用,與此同時另外一個按鈕就會被激活)。
固然,你也能夠用 單機,雙擊。等用一個按鈕來控制開啓和關閉。
固然這些只是標誌性的功能。 核心功能仍是 Django視圖中的 ScrapydAPI 這個API的使用
python-scrapyd-api官檔:https://pypi.org/project/pyth...

相關文章
相關標籤/搜索