以前我用scrapy寫爬蟲的時候都是通過crawl來執行的,但這樣的運行方式只能執行一個爬蟲,如果想同時運行多個爬蟲可以考慮使用scrapyd的方式,也就是scrapy server。查看http://scrapyd.readthedocs.io/en/stable/index.html 瞭解更多關於scrapyd的知識。
在 ubuntu 上安裝scrapyd
我是把scrapyd放到了虛擬機上,下面是我在ubuntu 16.04上安裝scrpayd的過程。
scrapyd 一下三個包,但是使用pip安裝scrapy時可以自動安裝。
Python 2.6及以上版本
Twisted 8.0及以上版本
Scrapy 0.17及以上版本
scrapyd對Ubuntu帶有特有的安裝包,這個安裝包可以很大程度上簡化管理工作,但是根據官方文檔的說法,ubuntu16.04可能不支持。(其他的操作系統可沒有這個)。所以我們直接使用pip進行安裝。
pip install scrapyd
安裝之後控制檯會顯示類似的輸出
Successfully installed scrapyd
Cleaning up...
啓動scrapyd
命令行輸入
scrapyd
會得到類似下面的輸出,表示scrapyd服務器啓動成功,至此我們便可以開始下一步–部署scrapy項目。
2018-08-20T15:43:08+0800 [-] Loading /usr/local/lib/python2.7/dist-packages/scrapyd/txapp.py...
2018-08-20T15:43:08+0800 [-] Scrapyd web console available at http://0.0.0.0:6800/
2018-08-20T15:43:08+0800 [-] Loaded.2017-02-20T15:43:08+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 16.6.0 (/usr/bin/python 2.7.12) starting up.
2018-08-20T15:43:08+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
2018-08-20T15:43:08+0800 [-] Site starting on 6800
2018-08-20T15:43:08+0800 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site instance at 0x7ff7bf8d9128>
2018-08-20T15:43:08+0800 [Launcher] Scrapyd 1.1.1 started: max_proc=4, runner='scrapyd.runner'
在虛擬機命令行輸入
ifconfig
查看虛擬機的ip地址(inet addr)。
此時在本機的瀏覽器中輸入虛擬機的ip和scrapyd的端口號(默認6800)就可以訪問scrapyd服務器
http://192.168.83.130:6800/
由於尚未部署項目,瀏覽器上顯示如下:
# Scrapyd
Available projects:
* Jobs* Logs* Documentation
## How to schedule a spider?
To schedule a spider you need to use the API (this web UI is only for monitoring)
Example using [curl](http://curl.haxx.se/):
`curl http://localhost:6800/schedule.json -d project=default -d spider=somespider`
For more information about the API, see the [Scrapyd documentation](http://scrapyd.readthedocs.org/en/latest/)
關閉scrapy
在命令行輸入”Ctrl+C”,然後enter之後,就能停止scrapyd
^C2018-08-21T17:40:08+0800 [-] Received SIGINT, shutting down.
2018-08-21T17:40:08+0800 [-] (TCP Port 6800 Closed)
2018-08-21T17:40:08+0800 [twisted.web.server.Site#info] Stopping factory <twisted.web.server.Site instance at 0x7f62fa4255a8>
2018-08-21T17:40:08+0800 [-] Main loop terminated.
2018-08-21T17:40:08+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] Server Shut Down.
部署scrapy項目到scrapyd
安裝scrapyd-client
根據scrapyd的官方文檔,我們可以手動地將項目添加到addversion.json中,當然,scrapyd爲我們提供了更爲簡單的方法–scrapyd-client,利用這個工具可以很方便的將項目發佈到scrapyd服務器上。
在本機上直接使用pip安裝即可。
pip install scrapyd-client
安裝好scrapy-client後,根據文檔,我cd到scrapy項目目錄下(f:\scrapydata\cdqqcom),輸入
scrapyd-deploy -l
這是應該出現該目錄下可以部署的項目名稱,但是卻提示:
scrapyd-deploy不是內部或外部命令,也不是可運行的程序或批處理文件
百度之後發現windows下缺少文件,解決方案是在你的python\Script下創建一個scrapyd-deploy.bat文件,比如我的python放在f:\python下,因此我創建文件的地址爲:
f:\python\Script
填充的內容爲
@echo off"f:\python\python.exe" "f:\python\Scripts\scrapyd-deploy" %1 %2 %3 %4 %5 %6 %7 %8 %9
此時,我再cd到scrapy項目根目錄下,執行
scrapy-deploy -l
得到以下結果,即爲操作成功。
scrapy_cdqqcom = http://192.168.83.130:6800/
當然,前提是我們需要在當前項目的 scrapy.cfg 文件中將爬蟲配置好。我的配置是:
[deploy:scrapy_cdqqcom]url = http://192.168.83.130:6800/project = cdqqcom
通過scrpy-client將項目部署到服務器
cd到項目的根目錄下,運行以下命令:
scrapyd-deploy scrapy-cdqqcom -p cdqqcom
成功反饋,部署成功:
Packing version 1487599081
Deploying to project "cdqqcom" in http://192.168.83.130:6800/addversion.json
Server response (200):
{"status": "ok", "project": "cdqqcom", "version": "1487599081", "spiders": 1, "node_name": "potential-virtual-machine"}
要查看該爬蟲是否部署成功可以先cd到爬蟲根目錄下,然後通過以下命令:
scrapyd-deploy -L scrapy_cdqqcom
這裏,scrapy_cdqqcom 是配置文件中的deploy-name,得到的結果如下:
cdqqcom
thepaper
這裏我也不清楚怎麼出來了thepaper這個爬蟲,這個爬蟲deploy叫scrapy_thepaper
調度爬蟲
調度爬蟲需要用到調度工具curl,關於curl可以查看 官網。
Linux系統一般自帶curl,windows可在官網 下載,下載之後解壓到
F:\curl\curl-7.52.1-win64-mingw
還需要在系統環境變量中進行配置,在 path 中新增環境變量:
F:\curl\curl-7.52.1-win64-mingw\bin
重啓控制檯後,輸入
curl
顯示
curl: try 'curl --help' or 'curl --manual' for more information
curl安裝成功。使用一下命令可以看到scrapyd上已經部署的工程。
curl http://192.168.83.130:6800/listprojects.json
結果返回如下:
{"status": "ok", "projects": ["cdqqcom", "thepaper"], "node_name": "potential-virtual-machine"}
啓動爬蟲
curl http://192.168.83.130:6800/schedule.json -d project=cdqqcom -d spider=cdqqcom
其中,project是配置文件中的project名稱,spider是我們編寫的spider裏面的name。返回一下信息則啓動成功:
{"status": "ok", "jobid": "ad9e4c82f7e111e6a7a6000c2922d487", "node_name": "potential-virtual-machine"}
此時,我們訪問
http://192.168.83.130:6800/jobs
可以看到
點擊log可以看到爬蟲的日誌,運行完的爬蟲會顯示在Finished一欄。
停止爬蟲
curl http://192.168.83.130:6800/cancel.json -d project=cdqqcom -d job=ad9e4c82f7e111e6a7a6000c2922d487
爬蟲停止,瀏覽器顯示如下:
exceptions.TypeError: __init__() got an unexpected keyword argument '_job'.
從scrapyd移除工程
curl http://192.168.83.130:6800/delproject.json -d project=thepaper
移除成功的反饋:
{"status": "ok", "node_name": "potential-virtual-machine"}
文件及日誌
部署後會在ubuntu的home下生成dbs、logs、eggs三個文件夾,logs顧名思義是放日誌的,另外兩個我也不知道幹嘛的。