一、版本情况

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作为配置,若是没有配置,则使用默认值,下面给个例子。

  1. [scrapyd]
  2. eggs_dir = eggs
  3. logs_dir = logs
  4. items_dir =
  5. jobs_to_keep = 5
  6. dbs_dir = dbs
  7. max_proc = 0
  8. max_proc_per_cpu = 4
  9. finished_to_keep = 100
  10. poll_interval = 5
  11. bind_address = 0.0.0.0
  12. http_port = 6800
  13. debug = off
  14. runner = scrapyd.runner
  15. application = scrapyd.app.application
  16. launcher = scrapyd.launcher.Launcher
  17. webroot = scrapyd.website.Root
  18.  
  19. [services]
  20. schedule.json = scrapyd.webservice.Schedule
  21. cancel.json = scrapyd.webservice.Cancel
  22. addversion.json = scrapyd.webservice.AddVersion
  23. listprojects.json = scrapyd.webservice.ListProjects
  24. listversions.json = scrapyd.webservice.ListVersions
  25. listspiders.json = scrapyd.webservice.ListSpiders
  26. delproject.json = scrapyd.webservice.DeleteProject
  27. delversion.json = scrapyd.webservice.DeleteVersion
  28. listjobs.json = scrapyd.webservice.ListJobs
  29. daemonstatus.json = scrapyd.webservice.DaemonStatus

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命令手动安装。

 
  1. C:\Python27\Lib\site-packages\scrapyd-master>dir setup.py
  2. 驱动器 C 中的卷是 Windows
  3.  
  4.  卷的序列号是 9C3D-C0EC
  5.  
  6.  C:\Python27\Lib\site-packages\scrapyd-master 的目录
  7.  
  8. 2016-05-20  23:35             1,538 setup.py
  9.  
  10.                1 个文件          1,538 字节
  11.  
  12.                0 个目录 26,489,679,872 可用字节
  13.  
  14. C:\Python27\Lib\site-packages\scrapyd-master>python setup.py install
  15.  ……
 

2、scrapyd运行

  1. D:\>scrapyd
  2.  
  3. 2016-07-01 23:12:16+0800 [-] Log opened.
  4.  
  5. 2016-07-01 23:12:16+0800 [-] twistd 16.1.1 (C:\Python27\python.exe 2.7.11) starting up.
  6.  
  7. 2016-07-01 23:12:16+0800 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
  8.  
  9. 2016-07-01 23:12:16+0800 [-] Site starting on 6800
  10.  
  11. 2016-07-01 23:12:16+0800 [-] Starting factory <twisted.web.server.Site instance at 0x0000000004688808>
  12. 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文件来介绍

  1. # -*- coding: utf-8 -*-
  2. import requests
  3.  
  4. import json 
  5.  
  6. baseUrl ='http://127.0.0.1:6800/'
  7.  
  8. daemUrl ='http://127.0.0.1:6800/daemonstatus.json'
  9.  
  10. listproUrl ='http://127.0.0.1:6800/listprojects.json'
  11.  
  12. listspdUrl ='http://127.0.0.1:6800/listspiders.json?project=%s'
  13.  
  14. listspdvUrl= 'http://127.0.0.1:6800/listversions.json?project=%s'
  15.  
  16. listjobUrl ='http://127.0.0.1:6800/listjobs.json?project=%s'
  17.  
  18. delspdvUrl= 'http://127.0.0.1:6800/delversion.json'
  19.  
  20. #http://127.0.0.1:6800/daemonstatus.json
  21.  
  22. #查看scrapyd服务器运行状态
  23.  
  24. r= requests.get(daemUrl)
  25.  
  26. print '1.stats :\n %s \n\n'  %r.text  
  27.  
  28. #http://127.0.0.1:6800/listprojects.json
  29.  
  30. #获取scrapyd服务器上已经发布的工程列表
  31.  
  32. r= requests.get(listproUrl)
  33.  
  34. print '1.1.listprojects : [%s]\n\n'  %r.text
  35.  
  36. if len(json.loads(r.text)["projects"])>0 :
  37.  
  38.     project = json.loads(r.text)["projects"][0]
  39.  
  40. #http://127.0.0.1:6800/listspiders.json?project=myproject
  41.  
  42. #获取scrapyd服务器上名为myproject的工程下的爬虫清单
  43.  
  44. listspd=listspd % project
  45.  
  46. r= requests.get(listspdUrl)
  47.  
  48. print '2.listspiders : [%s]\n\n'  %r.text 
  49.  
  50. if json.loads(r.text).has_key("spiders")>0 :
  51.  
  52.     spider =json.loads(r.text)["spiders"][0]
  53.  
  54. #http://127.0.0.1:6800/listversions.json?project=myproject
  55.  
  56. ##获取scrapyd服务器上名为myproject的工程下的各爬虫的版本
  57.  
  58. listspdvUrl=listspdvUrl % project
  59.  
  60. = requests.get(listspdvUrl)
  61.  
  62. print '3.listversions : [%s]\n\n'  %rtext 
  63.  
  64. if len(json.loads(r.text)["versions"])>0 :
  65.  
  66.     version = json.loads(r.text)["versions"][0]
  67.  
  68. #http://127.0.0.1:6800/listjobs.json?project=myproject
  69.  
  70. #获取scrapyd服务器上的所有任务清单,包括已结束,正在运行的,准备启动的。
  71.  
  72. listjobUrl=listjobUrl % proName
  73.  
  74. r=requests.get(listjobUrl)
  75.  
  76. print '4.listjobs : [%s]\n\n'  %r.text 
  77.  
  78. #schedule.json
  79.  
  80. #http://127.0.0.1:6800/schedule.json -d project=myproject -d spider=myspider
  81.  
  82. #启动scrapyd服务器上myproject工程下的myspider爬虫,使myspider立刻开始运行,注意必须以post方式
  83.  
  84. schUrl = baseurl + 'schedule.json'
  85.  
  86. dictdata ={ "project":project,"spider":spider}
  87.  
  88. r= reqeusts.post(schUrl, json= dictdata)
  89.  
  90. print '5.1.delversion : [%s]\n\n'  %r.text 
  91.  
  92. #http://127.0.0.1:6800/delversion.json -d project=myproject -d version=r99'
  93.  
  94. #删除scrapyd服务器上myproject的工程下的版本名为version的爬虫,注意必须以post方式
  95.  
  96. delverUrl = baseurl + 'delversion.json'
  97.  
  98. dictdata={"project":project ,"version": version }
  99.  
  100. r= reqeusts.post(delverUrl, json= dictdata)
  101.  
  102. print '6.1.delversion : [%s]\n\n'  %r.text 
  103.  
  104. #http://127.0.0.1:6800/delproject.json -d project=myproject
  105.  
  106. #删除scrapyd服务器上myproject工程,注意该命令会自动删除该工程下所有的spider,注意必须以post方式
  107.  
  108. delProUrl = baseurl + 'delproject.json'
  109.  
  110. dictdata={"project":project  }
  111.  
  112. r= reqeusts.post(delverUrl, json= dictdata)
  113.  
  114. 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、安装方法

  1. C:\>pip install Scrapyd-client
  2.  
  3. ……
  4.  
  5. C:\Python27\Scripts>dir sc*
  6.  
  7.  驱动器 C 中的卷是 Windows
  8.  
  9.  卷的序列号是 9C3D-C0EC
  10.  
  11.  C:\Python27\Scripts 的目录
  12.  
  13. 2016-06-29  11:19               313 scrapy-script.py
  14.  
  15. 2016-06-29  11:19            74,752 scrapy.exe
  16.  
  17. 2016-06-29  09:10             9,282 scrapyd-deploy
  18.  
  19. 2016-06-29  11:19               318 scrapyd-script.py
  20.  
  21. 2016-06-29  11:19            74,752 scrapyd.exe
  22.  
  23.                5 个文件        159,417 字节

2、运行方法

1)、拷贝scrapyd-deploy工具到爬虫目录下

  1. D:\python\Spider-master\ccpmess>dir
  2.  
  3.  驱动器 D 中的卷没有标签。
  4.  
  5.  卷的序列号是 36D9-CDC7
  6.  
  7.  D:\python\Spider-master\ccpmess 的目录
  8.  
  9. 2016-07-01  23:52    <DIR>          .
  10.  
  11. 2016-07-01  23:52    <DIR>          ..
  12.  
  13. 2016-06-30  13:52    <DIR>          ccpmess
  14.  
  15. 2016-06-30  13:37               662 ccpmess-main.py
  16.  
  17. 2016-06-30  13:53             1,022 ccpmess.wpr
  18.  
  19. 2016-07-01  14:52            78,258 ccpmess.wpu
  20.  
  21. 2016-06-30  14:07               324 scrapy.cfg
  22.  
  23. 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 的代码。

  1.  D:\python\Spider-master\ccpmess>type scrapy.cfg
  2.  
  3. # Automatically created by: scrapy startproject
  4.  
  5. #
  6.  
  7. # For more information about the [deploy] section see:
  8.  
  9. # https://scrapyd.readthedocs.org/en/latest/deploy.html
  10.  
  11. [settings]
  12.  
  13. default = ccpmess.settings
  14.  
  15. [deploy:127]
  16.  
  17. url = http://127.0.0.1:6800/
  18.  
  19. project = ccpmess
  20.  
  21. [deploy:141]
  22.  
  23. url = http://138.0.0.141:6800/
  24.  
  25. project = ccpmess

3)查看配置

检查scrapy配置是否正确。

  1. D:\python\Spider-master\ccpmess>python scrapyd-deploy -l
  2. 141                  http://138.20.1.141:6800/
  3. 127                  http://127.0.0.1:6800/ 

4)发布爬虫

  1. scrapyd-deploy <target> -p <project> --version <version>

target就是前面配置文件里deploy后面的的target名字。
project 可以随意定义,跟爬虫的工程名字无关。
version自定义版本号,不写的话默认为当前时间戳。

注意,爬虫目录下不要放无关的py文件,放无关的py文件会导致发布失败,但是当爬虫发布成功后,会在当前目录生成一个setup.py文件,可以删除掉。

  1. D:\python\Spider-master\ccpmess>python scrapyd-deploy 127 -p projectccp --version ver20160702
  2. Packing version ver20160702
  3. Deploying to project "projectccp" in http://127.0.0.1:6800/addversion.json
  4. Server response (200):
  5. {"status": "ok", "project": "projectccp", "version": "ver20160702", "spiders": 1, "node_name": "compter……"} 

到此,基于scrapyd的爬虫发布教程就写完了。

可能有人会说,我直接用scrapy cwal 命令也可以执行爬虫,个人理解用scrapyd服务器管理爬虫,至少有以下几个优势:

1、可以避免爬虫源码被看到。

2、有版本控制。

3、可以远程启动、停止、删除,正是因为这一点,所以scrapyd也是分布式爬虫的解决方案之一。

<--END-->

基于scrapyd爬虫发布总结的更多相关文章

  1. gerapy 爬虫web调度可视化工具(基于scrapyd)

    web 基于scrapyd 提供主机管理功能 基于scrapyd管理已安装服务的主机. 进入具体主机管理页面,会自动加载所有已知爬虫任务: 可直接可以调度.运行.查看日志. 提供项目管理功能 将已知项 ...

  2. 基于scrapy爬虫的天气数据采集(python)

    基于scrapy爬虫的天气数据采集(python) 一.实验介绍 1.1. 知识点 本节实验中将学习和实践以下知识点: Python基本语法 Scrapy框架 爬虫的概念 二.实验效果 三.项目实战 ...

  3. WebService学习之旅(五)基于Apache Axis2发布第一个WebService

    上篇博文介绍了如何將axis2 webservice引擎安装到Web容器中,本节开始介绍如何基于apache axis2发布第一个简单的WebService. 一.WebService服务端发布步骤 ...

  4. 基于python爬虫的github-exploitdb漏洞库监控与下载

    基于python爬虫的github-exploitdb漏洞库监控与下载 offensive.py(爬取项目历史更新内容) #!/usr/bin/env python # -*- coding:utf- ...

  5. 基于Spring的发布订阅模式 EventListener

    基于Spring的发布订阅模式 在我们使用spring开发应用时,经常会碰到要去解耦合一些依赖调用,比如我们在做代码的发布流程中,需要去通知相关的测试,开发人员关注发布中的错误信息.而且通知这个操作又 ...

  6. ASP.NET Core 中使用 Hangfire 定时启动 Scrapyd 爬虫

    用 Scrapy 做好的爬虫使用 Scrapyd 来管理发布启动等工作,每次手动执行也很繁琐;考虑可以使用 Hangfire 集成在 web 工程里. Scrapyd 中启动爬虫的请求如下: curl ...

  7. 云服务器部署scrapyd爬虫

    Scrapyd部署爬虫项目 GitHub:https://github.com/scrapy/scrapyd API 文档:http://scrapyd.readthedocs.io/en/stabl ...

  8. [原创]一种基于Python爬虫和Lucene检索的垂直搜索引擎的实现方法介绍

    声明:本文首发在博客园晨星落羽,Shulin_Cao和lvmememe首页,转载请注明出处. 前言 2016.5到2017.5,我们三人(lvmememe,Shulin_Cao,晨星落羽)共同完成了一 ...

  9. WebService学习之旅(二)JAX-WS基于Web容器发布WebService

    在上节中我们定义Web服务接口和实现类后,调用Endpoint类的静态方法publish发布来webservice,这种方法使用起来虽然简单,但是对于一个企业级应用来说通常对外提供的服务可能不止一个, ...

随机推荐

  1. java的break,另一种用法(多层循环嵌套)

    break的另一种用法: 1.跳出外循环 outer:for(int j=0;i<4;j++){//outer随便定义的一个标签 for(int i=0;i<10;i++){ if(i== ...

  2. chrome和IE下的滚动条样式修改

    火狐下的滚动条样式无法去修改,但chorme下的则可以任意修改,惊喜的是IE竟然是最早实现这一功能的浏览器,IE5都能有效果. chorme下的滚动条样式修改: <!DOCTYPE html&g ...

  3. rabbitmq-channel方法介绍

    先介绍rabbmitmq的几个方法: // 声明一个队列 -// queue 队列名称 // durable 为true时server重启队列不会消失 (是否持久化) // exclusive 队列是 ...

  4. JavaScript学习笔记系列1:JavaScript的是什么?

    一.JS是什么? JavaScript作为Netscape Navigator浏览器的一部分首次出现在1996年.它最初的设计目标是改善网页的用户体验. 作者:Brendan Eich 期初JavaS ...

  5. python 中迭代和遍历的区别

    什么是迭代? 迭代就是重复运行一段代码语句块的能力.分为两种方式 使用递归函数 使用循环(for 或 while 循环) 假设有个需求,要按照降序打印10以下(包括10),0 以上的整数,用递归和循环 ...

  6. Oracle-检查原因并重新编译无效的存储过程

    1.查看存储过程编译无效的原因 show errors procedure hr.getperson; 2.指定一个存储过程进行编译 alter procedure  hr.getperson com ...

  7. Cocoa pod导入第三方框架遇到的那点事儿

    废话不多说,直接上干货. 以下所有操作均是在Cocoapod导入第三方库,并且是.xcworkspace的工程里面操作的, 1.导入头文件找不到,也就是所谓的,not find ''AFNetwork ...

  8. Code Signal_练习题_Make Array Consecutive2

    Description Ratiorg got statues of different sizes as a present from CodeMaster for his birthday, ea ...

  9. YII 用gii生成modules模块下的mvc

    1.生成model ModelPath设置为: application.modules.[moduleName].models 2.生成CURD ModelClass设置为: application. ...

  10. 让iframe可编辑

    function EnableEdit() { var editor; editor = document.getElementById("HtmlEdit").contentWi ...