基於scrapyd爬蟲發布總結,scrapyd爬蟲總結
一、版本情況
python以豐富的三方類庫取得了眾多程式員的認可,但也因此帶來了眾多的類庫版本問題,本文總結的內容是基於最新的類庫版本。
1、scrapy版本:1.1.0D:\python\Spider-master\ccpmess>scrapy version -vScrapy : 1.1.0lxml : 3.6.0.0libxml2 : 2.9.0Twisted : 16.1.1Python : 2.7.11rc1 (v2.7.11rc1:82dd9545bd93, Nov 21 2015, 23:25:27) [MSC v.1500 64 bit (AMD64)]pyOpenSSL : 16.0.0 (OpenSSL 1.0.2g 1 Mar 2016)Platform : Windows-10-10.0.10586
4、scrapyd 版本:1.1.0D:\>scrapyd2016-06-30 15:21:14+0800 [-] Log opened.2016-06-30 15:21:14+0800 [-] twistd 16.1.1 (C:\Python27\python.exe 2.7.11) starting up.2016-06-30 15:21:14+0800 [-] reactor class: twisted.internet.selectreactor.SelectReactor.2016-06-30 15:21:14+0800 [-] Site starting on 68002016-06-30 15:21:14+0800 [-] Starting factory <twisted.web.server.Site instance at 0x00000000046D6808>2016-06-30 15:21:14+0800 [Launcher] Scrapyd 1.1.0 started: max_proc=16, runner='scrapyd.runner'
二、官網文檔1、scrapy
http://scrapy.readthedocs.io/en/latest/ 英文版
http://scrapy-chs.readthedocs.io/zh_CN/latest/ 中文版
2、scrapyd
http://scrapyd.readthedocs.io/en/latest
特別說明,百度上搜尋出來的很多scrapy和scrapyd的資料已經過時,因為這兩個三方庫一直在更新,導致很多過去的總結,現在已經不適用。
雖然這兩個文檔都是E文的(scrapy有一個中文版,但是不全),對於大家的E文是一個挑戰,但是用來簡單查查資料,還是可以的。
三、用途說明1、scrapy
有名的爬蟲架構,模組化、結構化相對做得好,基於scrapy開發爬蟲,其效率、穩定性都比白手起家要好很多。
2、scrapyd
Scrapyd is a service for running Scrapy spiders.
It allows you to deploy your Scrapy projects and control their spiders using a HTTP JSON API.
Scrapyd can manage multiple projects and each project can have multiple versions uploaded, but only the latest one will be used for launching new spiders.
scrapyd是運行scrapy爬蟲的服務程式,它支援以http命令方式發布、刪除、啟動、停止爬蟲程式。而且scrapyd可以同時管理多個爬蟲,每個爬蟲還可以有多個版本。
四、使用說明1、scrapyd安裝D:\>pip install scrapyd
使用pip命令,系統會自動安裝輔助scrapyd及相依元件。
這裡需要補充一點,目前pip預設源上的scrapyd不是最新的release版本,會出現很多命令不支援的情況。
所以建議進入到https://github.com/scrapy/scrapyd網站下載最新源碼版本,然後解壓到任意目錄,再用python setup.py install命令手動安裝。
C:\Python27\Lib\site-packages\scrapyd-master>dir setup.py
磁碟機 C 中的卷是 Windows
卷的序號是 9C3D-C0EC
C:\Python27\Lib\site-packages\scrapyd-master 的目錄
2016-05-20 23:35 1,538 setup.py
1 個檔案 1,538 位元組
0 個目錄 26,489,679,872 可用位元組
C:\Python27\Lib\site-packages\scrapyd-master>python setup.py install
……
2、scrapyd運行D:\>scrapyd
2016-07-01 23:12:16+0800 [-] Log opened.
2016-07-01 23:12:16+0800 [-] twistd 16.1.1 (C:\Python27\python.exe 2.7.11) starting up.
2016-07-01 23:12:16+0800 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2016-07-01 23:12:16+0800 [-] Site starting on 6800
2016-07-01 23:12:16+0800 [-] Starting factory <twisted.web.server.Site instance at 0x0000000004688808>
2016-07-01 23:12:16+0800 [Launcher] Scrapyd 1.1.0 started: max_proc=16, runner='scrapyd.runner'
預設情況下scrapyd運行後會偵聽6800連接埠,注意最新的版本只有jobs、logs、documentation,3個功能表項目,pip裡安裝的版本,運行後有4個菜單。
# -*- coding: utf-8 -*-
import requests
import json
baseUrl ='http://127.0.0.1:6800/'
daemUrl ='http://127.0.0.1:6800/daemonstatus.json'
listproUrl ='http://127.0.0.1:6800/listprojects.json'
listspdUrl ='http://127.0.0.1:6800/listspiders.json?project=%s'
listspdvUrl= 'http://127.0.0.1:6800/listversions.json?project=%s'
listjobUrl ='http://127.0.0.1:6800/listjobs.json?project=%s'
delspdvUrl= 'http://127.0.0.1:6800/delversion.json'
#http://127.0.0.1:6800/daemonstatus.json
#查看scrapyd伺服器運行狀態
r= requests.get(daemUrl)
print '1.stats :\n %s \n\n' %r.text
#http://127.0.0.1:6800/listprojects.json
#擷取scrapyd伺服器上已經發布的工程列表
r= requests.get(listproUrl)
print '1.1.listprojects : [%s]\n\n' %r.text
if len(json.loads(r.text)["projects"])>0 :
project = json.loads(r.text)["projects"][0]
#http://127.0.0.1:6800/listspiders.json?project=myproject
#擷取scrapyd伺服器上名為myproject的工程下的爬蟲清單
listspd=listspd % project
r= requests.get(listspdUrl)
print '2.listspiders : [%s]\n\n' %r.text
if json.loads(r.text).has_key("spiders")>0 :
spider =json.loads(r.text)["spiders"][0]
#http://127.0.0.1:6800/listversions.json?project=myproject
##擷取scrapyd伺服器上名為myproject的工程下的各爬蟲的版本
listspdvUrl=listspdvUrl % project
r = requests.get(listspdvUrl)
print '3.listversions : [%s]\n\n' %rtext
if len(json.loads(r.text)["versions"])>0 :
version = json.loads(r.text)["versions"][0]
#http://127.0.0.1:6800/listjobs.json?project=myproject
#擷取scrapyd伺服器上的所有任務清單,包括已結束,正在啟動並執行,準備啟動的。
listjobUrl=listjobUrl % proName
r=requests.get(listjobUrl)
print '4.listjobs : [%s]\n\n' %r.text
#schedule.json
#http://127.0.0.1:6800/schedule.json -d project=myproject -d spider=myspider
#啟動scrapyd伺服器上myproject工程下的myspider爬蟲,使myspider立刻開始運行,注意必須以post方式
schUrl = baseurl + 'schedule.json'
dictdata ={ "project":project,"spider":spider}
r= reqeusts.post(schUrl, json= dictdata)
print '5.1.delversion : [%s]\n\n' %r.text
#http://127.0.0.1:6800/delversion.json -d project=myproject -d version=r99'
#刪除scrapyd伺服器上myproject的工程下的版本名為version的爬蟲,注意必須以post方式
delverUrl = baseurl + 'delversion.json'
dictdata={"project":project ,"version": version }
r= reqeusts.post(delverUrl, json= dictdata)
print '6.1.delversion : [%s]\n\n' %r.text
#http://127.0.0.1:6800/delproject.json -d project=myproject
#刪除scrapyd伺服器上myproject工程,注意該命令會自動刪除該工程下所有的spider,注意必須以post方式
delProUrl = baseurl + 'delproject.json'
dictdata={"project":project }
r= reqeusts.post(delverUrl, json= dictdata)
print '6.2.delproject : [%s]\n\n' %r.text
總結一下:1、擷取狀態
http://127.0.0.1:6800/daemonstatus.json2、擷取項目列表
http://127.0.0.1:6800/listprojects.json3、擷取項目下發行的爬蟲列表
http://127.0.0.1:6800/listspiders.json?project=myproject4、擷取項目下發行的爬蟲版本列表
http://127.0.0.1:6800/listversions.json?project=myproject5、擷取爬蟲運行狀態
http://127.0.0.1:6800/listjobs.json?project=myproject
6、啟動伺服器上某一爬蟲(必須是發行到伺服器的爬蟲)
http://localhost:6800/schedule.json (post方式,data={"project":myproject,"spider":myspider})7、刪除某一版本爬蟲
http://127.0.0.1:6800/delversion.json (post方式,data={"project":myproject,"version":myversion})8、刪除某一工程,包括該工程下的各版本爬蟲 http://127.0.0.1:6800/delproject.json(post方式,data={"project":myproject})
這裡可以看到,有刪除爬蟲的APi,有啟動爬蟲的API,獨獨沒有發布爬蟲的API,為什麼呢?
因為發布爬蟲需要使用另一個專用工具Scrapyd-client。
五、發布爬蟲的工具Scrapyd-client
Scrapyd-client是一個專門用來發布scrapy爬蟲的工具,安裝該程式之後會自動在c:\python\scripts安裝一個名為scrapyd-deploy的工具(其實開啟該檔案,可以發現它是一個類似setup.py的python指令碼,所以可以通過python scrapyd-deploy的方式運行)。 1、安裝方法C:\>pip install Scrapyd-client
……
C:\Python27\Scripts>dir sc*
磁碟機 C 中的卷是 Windows
卷的序號是 9C3D-C0EC
C:\Python27\Scripts 的目錄
2016-06-29 11:19 313 scrapy-script.py
2016-06-29 11:19 74,752 scrapy.exe
2016-06-29 09:10 9,282 scrapyd-deploy
2016-06-29 11:19 318 scrapyd-script.py
2016-06-29 11:19 74,752 scrapyd.exe
5 個檔案 159,417 位元組
2、運行方法1)、拷貝scrapyd-deploy工具到爬蟲目錄下 D:\python\Spider-master\ccpmess>dir
磁碟機 D 中的卷沒有標籤。
卷的序號是 36D9-CDC7
D:\python\Spider-master\ccpmess 的目錄
2016-07-01 23:52 <DIR> .
2016-07-01 23:52 <DIR> ..
2016-06-30 13:52 <DIR> ccpmess
2016-06-30 13:37 662 ccpmess-main.py
2016-06-30 13:53 1,022 ccpmess.wpr
2016-07-01 14:52 78,258 ccpmess.wpu
2016-06-30 14:07 324 scrapy.cfg
2016-06-29 09:10 9,282 scrapyd-deploy
2)修改爬蟲的scapy.cfg檔案
首先去掉url前的注釋符號,這裡url就是你的scrapyd伺服器的網址。
其次,deploy:127表示把爬蟲發布到名為127的爬蟲伺服器上。
這個名叫target名字,一般情況用在需要同時發布爬蟲到多個目標伺服器時,可以通過指定名字的方式發布到指定伺服器。
D:\python\Spider-master\ccpmess>type scrapy.cfg
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.org/en/latest/deploy.html
[settings]
default = ccpmess.settings
[deploy:127]
url = http://127.0.0.1:6800/
project = ccpmess
[deploy:141]
url = http://138.0.0.141:6800/
project = ccpmess
3)查看配置
檢查scrapy配置是否正確。
D:\python\Spider-master\ccpmess>python scrapyd-deploy -l
141 http://138.20.1.141:6800/
127 http://127.0.0.1:6800/
4)發布爬蟲
scrapyd-deploy <target> -p <project> --version <version>
target就是前面設定檔裡deploy後面的的target名字。
project 可以隨意定義,跟爬蟲的工程名字無關。
version自訂版本號碼,不寫的話預設為目前時間戳。
注意,爬蟲目錄下不要放無關的py檔案,放無關的py檔案會導致發布失敗。
D:\python\Spider-master\ccpmess>python scrapyd-deploy 127 -p projectccp --version ver20160702
Packing version ver20160702
Deploying to project "projectccp" in http://127.0.0.1:6800/addversion.json
Server response (200):
{"status": "ok", "project": "projectccp", "version": "ver20160702", "spiders": 1, "node_name": "compter……"}
到此,基於scrapyd的爬蟲發布教程就寫完了。
可能有人會說,我直接用scrapy cwal 命令也可以執行爬蟲,個人理解用scrapyd伺服器管理爬蟲,至少有以下幾個優勢:
1、可以避免爬蟲源碼被看到。
2、有版本控制。
3、可以遠程啟動、停止、刪除,正是因為這一點,所以scrapyd也是分布式爬蟲的解決方案之一。
<--END-->