• 基于scrapyd爬虫发布总结


    一、版本情况

    python以丰富的三方类库取得了众多程序员的认可,但也因此带来了众多的类库版本问题,本文总结的内容是基于最新的类库版本。

    1、scrapy版本:1.1.0

    D:pythonSpider-masterccpmess>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:Python27python.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:scrapydscrapyd.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:Python27Libsite-packagesscrapyd-master>dir setup.py

    驱动器 C 中的卷是 Windows
     卷的序列号是 9C3D-C0EC

     C:Python27Libsite-packagesscrapyd-master 的目录

    2016-05-20  23:35             1,538 setup.py
                   1 个文件          1,538 字节
                   0 个目录 26,489,679,872 可用字节

    C:Python27Libsite-packagesscrapyd-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:Python27python.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 :  %s  '  %r.text  

    #http://127.0.0.1:6800/listprojects.json
    #获取scrapyd服务器上已经发布的工程列表
    r= requests.get(listproUrl)
    print '1.1.listprojects : [%s] '  %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] '  %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] '  %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] '  %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] '  %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] '  %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] '  %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:pythonscripts安装一个名为scrapyd-deploy的工具(其实打开该文件,可以发现它是一个类似setup.py的python脚本,所以可以通过python scrapyd-deploy的方式运行)。 

    1、安装方法

    C:>pip install Scrapyd-client

    ……


    C:Python27Scripts>dir sc*
     驱动器 C 中的卷是 Windows
     卷的序列号是 9C3D-C0EC

     C:Python27Scripts 的目录

    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:pythonSpider-masterccpmess>dir
     驱动器 D 中的卷没有标签。
     卷的序列号是 36D9-CDC7

     D:pythonSpider-masterccpmess 的目录

    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:pythonSpider-masterccpmess>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:pythonSpider-masterccpmess>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:pythonSpider-masterccpmess>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-->

  • 相关阅读:
    基础Linux命令总结
    [博客美化]新年啦,给自己博客加个雪花效果吧~
    自制操作系统Antz(5)——深入理解保护模式与进入方法
    自制操作系统Antz(4)——进入保护模式 (下) 实现内核并从硬盘载入
    自制操作系统Antz(3)——进入保护模式 (中) 直接操作显存
    自制操作系统Antz(2)——进入保护模式 (上) jmp到保护模式
    自制操作系统Antz(1)——Boot Sector
    Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云
    Kali Day01 --- arpspoof命令进行断网攻击(ARP欺骗)
    手写杀毒软件——放心的安全卫士
  • 原文地址:https://www.cnblogs.com/zhongtang/p/5634545.html
Copyright © 2020-2023  润新知