基於scrapyd爬蟲發布總結


一、版本情況

python以豐富的三方類庫取得了眾多程序員的認可,但也因此帶來了眾多的類庫版本問題,本文總結的內容是基於最新的類庫版本。

1、scrapy版本:1.1.0

D:\python\Spider-master\ccpmess>scrapy version -v
Scrapy    : 1.1.0
lxml      : 3.6.0.0
libxml2   : 2.9.0
Twisted   : 16.1.1
Python    : 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

 

2、scrapyd 版本:1.1.0

D:\>scrapyd
2016-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 6800
2016-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'

a、scrapyd在windows下默認使用c:\scrapyd\scrapyd.cfg作為配置,若是沒有配置,則使用默認值,下面給個例子。

[scrapyd]
eggs_dir    = eggs
logs_dir    = logs
items_dir   =
jobs_to_keep = 5
dbs_dir     = dbs
max_proc    = 0
max_proc_per_cpu = 4
finished_to_keep = 100
poll_interval = 5
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
View Code


b、默認路徑為c:盤根目錄,爬蟲發布后,會在c:盤根目錄生成三個文件夾:eggs、logs、dbs,分別存放egg包,爬蟲執行日志,爬蟲數據。


 

二、官網文檔

1、scrapy

http://scrapy.readthedocs.io/en/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個菜單。

 

 3、scrapyd支持的API 介紹

 scrapyd支持一系列api,下面用一個py文件來介紹

# -*- 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.json
2、獲取項目列表
http://127.0.0.1:6800/listprojects.json
3、獲取項目下已發布的爬蟲列表
http://127.0.0.1:6800/listspiders.json?project=myproject
4、獲取項目下已發布的爬蟲版本列表
http://127.0.0.1:6800/listversions.json?project=myproject
5、獲取爬蟲運行狀態
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名字可以隨意起,一般情況用在需要同時發布爬蟲到多個目標服務器時,可以通過指定名字的方式發布到指定服務器。

其次,default=ccpmess.settings 中 ccpmess也是可以改的,貌似沒啥用,默認還是用工程名字。

關鍵是scrapyd-deploy 所在目錄,具體其實可以讀下scrapyd-deploy 的代碼。

  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文件會導致發布失敗,但是當爬蟲發布成功后,會在當前目錄生成一個setup.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-->


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM