如何使用scrapyd对爬虫进行管控

部署前准备工作

一:说明:

  1. scrapy框架相关爬虫代码不提供说明, 对于scrapyd的配置会有说明。
  2. 对于scrapyd是对分布式的爬虫进行管控的插件,有web页面展示,不过只能通过api对其执行启动暂停等操作,建议使用Qt或者web来操控爬虫。
  3. 虽然说是分布式的爬虫,建议对scrapy框架的爬虫都进行部署, 因为可能会涉及到后期的增量等抓取, 总是去服务器找爬虫文件也不是很方便。
  4. 我这边用到服务器说明, A和B对服务器进行编号:
    • A1:redis和mongo的服务器一台(redis用于分布式的master,mongo用于存储抓取的源数据,这台大内存大硬盘没办法, 有合适的服务器的话可以将mongo迁出去),
    • B1,B2:2台爬虫服务器(主要执行爬虫,两台上均需要安装scrapyd)

二:环境说明

  1. python3.7

  2. centos7

  3. python开发与部署建议使用虚拟环境

  4. B1B2服务器要正常安装scrapy框架所需的模块

部署相关操作说明


一:scrapyd服务相关

  1. 安装scarpyd, 在集群slave(B1和B2服务器) 执行,记得激活虚拟环境

    pip install scrapyd
    
  2. 启动scrapy

    scrapyd
    
  3. 配置scrapyd参数

    此时仅能本机访问改web页面, 如需局域网或者外网打开配置文件,在虚拟环境的安装目录下。具体路径自行修改

    vim /usr/local/pyvenv/scrapy_env/lib64/python3.7/site-packages/scrapyd/default_scrapyd.conf
    

    配置文件相关说明:当前仅需修改第12行说明处

    [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.0
    # 修改监听端口为0.0.0.0 初始为127.0.0.1
    # bind_address = 127.0.0.1
    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
    
  4. 重启启动scrapyd服务, 并让其在后台运行

    scrapyd &
    

二:将本地开发的爬虫程序推送到服务中

  • 这里使用的组建是scrapyd-client
  • 这个组件安装在你本地的开发机器上不需要安装到服务器中
  1. 安装scrapyd-client

    pip install scrapyd-client
    
  2. 修改scrapy爬虫项目中的scrapy.cfg配置文件中(在爬虫项目的根目录下)

    [deploy:recipe_spiders]
    project = YourProjectName
    url = http://***.***.***.***:6800/
    version = r1
    
    [deploy:recipe_spiders]
    project = YourProjectName
    url = http://***.***.***.***:6800/
    version = r1
    # url的参数值为安装scrapyd的服务器B1和B2的IP地址
    # project和version的参数值建议一致
    
  3. 将本地代码部署至scrapyd服务器

    • 该操作是在本地测试调试代码的时候执行的,我这边是win的开发环境
    # 使用cmd进入爬虫项目的文件根目录下
    
    # 执行查询可提供部署的项目信息
    scrapyd-deploy -l
    # 返回信息格式 ProjectName ScrapydServerUrl, 如下
    # ProjectName       http://***.***.***.***:6800/
    
    # 将爬虫项目数据部署到B1,B2服务器中 
    scrapyd-deploy ProjectName -p SpiderName
    # SpiderName是爬虫项目的spiders文件夹下自定义的py文件中 定义的蜘蛛名称,请自行替换
    # 返回信息示例:
    #Packing version 1586314118
    #Deploying to project "xiachufang_recipe_redis" in http://192.168.2.227:6800/addversion.json
    #Server response (200):
    #{"node_name": "localhost.localdomain", "status": "ok", "project": "SpiderName", "version": "1586314118", "spiders": 1}
    

三:启动爬虫

  • scrapyd的web界面比较简单,主要用于监控,所以需要控制爬虫的话,可以通过qt或者web开发
  • 所有的调度工作全部依靠接口实现.
  1. http接口启动

    此处参考文档: https://www.cnblogs.com/yijian001/p/9051124.html

    官方文档:https://scrapyd.readthedocs.io/en/latest/api.html

    常用接口

    • 启动爬虫

      $ curl http://YourScrapydServer:8600/schedule.json -d project=ProjectName -d spider=SpiderName
      # 带上参数
      $ curl http://YourScrapydServer:8600/schedule.json -d project=ProjectName -d spider=SpiderName -d setting=DOWNLOAD_DELAY=2 -d arg1=val1
      
    • 取消

      $ curl http://YourScrapydServer:8600/cancel.json -d project=ProjectName -d job=6487ec79947edab326d6db28a2d86511e8247444
      
    • 列出项目

      $ curl http://YourScrapydServer:8600/listprojects.json
      
    • 列出版本

      $ curl http://YourScrapydServer:8600/listversions.json?project=ProjectName
      
    • 列出爬虫

      $ curl http://YourScrapydServer:8600/listspiders.json?project=ProjectName
      
    • 列出job

      $ curl http://YourScrapydServer:8600/listjobs.json?project=ProjectName
      
    • 删除版本

      $ curl http://YourScrapydServer:8600/delversion.json -d project=ProjectName -d version=r99
      
    • 删除项目

      $ curl http://YourScrapydServer:8600/delproject.json -d project=ProjectName
      
  2. scrapydApi启动

    此处参考文档: https://zhuanlan.zhihu.com/p/44564597

    1. 安装

      pip install python-scrapyd-api
      
    2. 实例化

      from scrapyd_api import ScrapydAPI
      scrapyd = ScrapydAPI('http://localhost:6800')
      
      • 启动远程爬虫机器的scrapy

        scrapyd.schedule(project, spider, settings=None, **kwargs)
        """
        project: scrapy工程名称
        spider:爬虫名称
        settings:dict重新scrapy中settings
        _version: 指定版本号
        kwargs:自定义额外参数传递给scrapy的init函数
        return: 启动爬虫后的job_id
        """
        
      • 查看爬虫的运行状态

        scrapyd.job_status(project, job_id)
        """
        project: scrapy工程名称
        job_id: 启动爬虫后的job_id
        return:
            'running':正在运行
            'pending':准备运行
            'finished':完成运行
            '':若不能找到job_id,返回空
        """
        
      • 取消(停止)正在或准备运行的爬虫

        scrapyd.cancel(project, job, signal=None)
        """
        project:scrapy工程名称
        job:爬虫的job_id
        signal:终止的信号,一般为None
        return: 返回爬虫停止前的状态
        """
        """
        有时运行中的爬虫不管用API还是命令行都无法停止,这里提供一种解决方案:
        直接杀死进程
        """
        
      • 删除爬虫项目

        scrapyd.delete_project(project)
        """
        project:scrapy工程名
        return: 成功返回 True 否则返回 False
        """
        
      • 删除指定的版本的scrapy的项目

        scrapyd.delete_version(project, version)
        """
        project:scrapy项目名称
        version:版本名称
        return: 成功返回 True 否则返回 False
        """
        
      • 显示当前可用的scrapy项目

        scrapyd.list_projects()
        """
        return:list 所有scrapy工程名
        """
        
      • 显示指定scrapy项目的所有爬虫

        scrapyd.list_spiders(project)
        """
        project:scrapy项目名称
        return: list 所有爬虫名称
        """
        
      • 显示指定scrapy项目的所有版本号

        scrapyd.list_versions(project)
        """
        project: scrapy项目名称
        return: list 所有可用版本
        """
        
      • 显示指定scrapy项目的所有准备、正在、完成运行的job_id

        scrapyd.list_jobs(project)
        """
        project:scrapy项目名称
        return: dict 所有 pending running finished 的job_id
        """
        

最后

  • 剩下的就是通过web或者qt进行爬虫的管理操作了。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容