如何使用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进行爬虫的管理操作了。

你可能感兴趣的:(如何使用scrapyd对爬虫进行管控)