美文网首页
Scrapy 分布式部署(包括scrapyd部署)

Scrapy 分布式部署(包括scrapyd部署)

作者: 八盖 | 来源:发表于2019-07-11 19:38 被阅读0次

    1.在爬虫文件中的settings中添加如下字段

    # scrapy-redis配置信息
    # 调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 不要清理redis队列,允许暂停/恢复抓取
    SCHEDULER_PERSIST = True
    # 每次爬取的时候会将指纹和request清空
    # SCHEDULER_FLUSH_ON_START=True
    # 配置redis服务
    REDIS_URL = "redis://qxx2094.cn:6379"
    # 如果redis有用户名和密码,如下设置
    # REDIS_URL = "redis://用户名:密码@qxx2094.cn:6379"
    # REDIS_HOST = "你的ip"
    # REDIS_PORT = "6379"
    

    2.将爬虫代码拷贝到其他机器上面,连接到同一服务器redis上面

    在redis中会生成指纹文件,例如:"db_zf:dupefilter" 和 "db_zf:requests",然后其他从机就会拿到调度器分配的request请求,同时有指纹文件,请求到的文件不会有重复。

    3.服务器上面将redis服务开放出来,外网可以访问

    • 首先修改配置文件redis.conf
    sudo vim /etc/redis/redis.conf
    
    • 将bind 127.0.0.1注释掉,如果只想自己本机访问就在后面加上bind + 本机ip
    # bind 127.0.0.1
    
    • 重启redis服务!
    sudo /etc/init.d/redis-server restart
    
    • 登录redis
     执行命令 redis-cli -h IP地址 -p 端口号 -a 密码
    

    利用scrapyd部署分布式

    1.安装scrapyd和scrapyd-client
    pip install scrapyd
    pip install scrapyd-client
    
    2.修改scrapyd默认配置(配置文件位置视自己服务器为准)
    sudo vim /virtualenvs/py3.5/lib/python3.5/site-packages/scrapyd/default_scrapyd.conf
    
    • 将bind address 127.0.0.1注释掉,改为0.0.0.0

    • 修改该启动配置文件的目的是可以远程访问,scrapyd框架分为server端和client端,两个的ip地址必须对的上才能通信;
      1.client端需要将代码上传到server端
      2.可以浏览器访问server端的管理界面,世界各地没毛病,前提是具有公网ip

    3.具体操作
    • 进入带有scrapy.cfg文件的目录,执行scrapyd-deploy,测试scrapyd-deploy是否可以运行。
    • 打开scrapy.cfg文件,将url改成自己ip
    [settings]
    default = dbzf.settings
    
    # 部署名称,可不写
    [deploy:db]
    #url = http://localhost:6800/
    url = http://193.112.128.44:6800/addversion.json
    # 工程名
    project = dbzf
    
    • 输入scrapyd-deploy -| 可以看到设置
    db              http://193.112.128.44:6800/
    
    • 开始打包前,执行一个命令:scrapy list ,这个命令执行成功说明可以打包了,如果没执行成功说明还有工作没完成。
    (py3.5) ubuntu@VM-0-9-ubuntu:~/workspace/reptile_codes/dbzf$ scrapy list
    db_zf
    
    • 执行打包命令完成远程部署: scrapyd-deploy 部署名称 -p 项目名称
    (py3.5) ubuntu@VM-0-9-ubuntu:~/workspace/reptile_codes/dbzf$ scrapyd-deploy db -p dbzf
    Packing version 1562896041
    Deploying to project "dbzf" in http://193.112.128.44:6800/addversion.json
    Server response (200):
    {"status": "ok", "version": "1562896041", "spiders": 1, "node_name": "VM-0-9-ubuntu", "project": "dbzf"}
    

    "ststus": "ok"说明远程部署成功

    • 启动远程部署的scrapy
    curl http://193.112.128.44:6800/schedule.json  -d project=dbzf -d spider=db_zf
    
    • 停止爬虫
    curl http://193.112.128.44:6800/cancel.json  -d project=项目名称 -d job=运行ID
    
    • 删除scrapy项目(注意:一般删除scrapy项目,需要先执行命令停止项目下已在运行的爬虫)
    curl http://localhost:6800/delproject.json -d project=scrapy项目名称
    
    • 查看指定的scrapy项目中有多少个爬虫
    curl http://193.112.128.44:6800/listspiders.json?project=项目名称
    
    4. 利用Scrapyd-API 实现 Scrapy 项目的监控和运行
    pip install scrapyd-api
    

    GitHub:https://github.com/djm/python-scrapyd-api

    from scrapyd_api import ScrapydAPI
    scrapyd = ScrapydAPI('http://localhost:6800')
    scrapyd.list_jobs('project_name')
    

    部分命令

    Add a project egg as a new version:
    
    >>> egg = open('some_egg.egg', 'rb')
    >>> scrapyd.add_version('project_name', 'version_name', egg)
    # 返回项目中爬虫的数量
    3
    >>> egg.close()
    
    Cancel a scheduled job:(取消预定的工作)
    >>> scrapyd.cancel('project_name', '14a6599ef67111e38a0e080027880ca6')
    # 返回工程被取消前的“先前状态”:“正在运行”或“挂起”。
    
    Delete a project and all sibling versions:(删除一个项目和所有兄弟版本)
    >>> scrapyd.delete_project('project_name')
    # 如果请求得到OK响应,则返回True
    True
    
    Delete a version of a project:(删除项目的版本)
    >>> scrapyd.delete_version('project_name', 'version_name')
    # 如果请求得到OK响应,则返回True.
    True
    
    Request status of a job:(请求作业的状态)
    >>> scrapyd.job_status('project_name', '14a6599ef67111e38a0e080027880ca6')
    # 对于未知状态,返回“正在运行”、“挂起”、“完成”或“未知状态码”.
    'running'
    
    List all jobs registered:(列出所有注册的工作)
    >>> scrapyd.list_jobs('project_name')
    # Returns a dict of running, finished and pending job lists.
    {
        'pending': [
            {
                u'id': u'24c35...f12ae',
                u'spider': u'spider_name'
            },
        ],
        'running': [
            {
                u'id': u'14a65...b27ce',
                u'spider': u'spider_name',
                u'start_time': u'2014-06-17 22:45:31.975358'
            },
        ],
        'finished': [
            {
                u'id': u'34c23...b21ba',
                u'spider': u'spider_name',
                u'start_time': u'2014-06-17 22:45:31.975358',
                u'end_time': u'2014-06-23 14:01:18.209680'
            }
        ]
    }
    
    List all projects registered:(列出所有注册项目)
    >>> scrapyd.list_projects()
    [u'ecom_project', u'estate_agent_project', u'car_project']
    
    Displays the load status of a service registered:(显示已注册服务的加载状态)
    >>> scrapyd.daemon_status()
    {u'finished': 0, u'running': 0, u'pending': 0, u'node_name': u'ScrapyMachine'}
    
    List all spiders available to a given project:(列出给定项目可用的所有爬虫)
    >>> scrapyd.list_spiders('project_name')
    [u'raw_spider', u'js_enhanced_spider', u'selenium_spider']
    
    List all versions registered to a given project:(列出注册到给定项目的所有版本)
    >>> scrapyd.list_versions('project_name'):
    [u'345', u'346', u'347', u'348']
    
    Schedule a job to run with a specific spider:(安排作业在特定的爬虫项目上运行)
    # Schedule a job to run with a specific spider.
    >>> scrapyd.schedule('project_name', 'spider_name')
    # Returns the Scrapyd job id.
    u'14a6599ef67111e38a0e080027880ca6'
    
    Schedule a job to run while passing override settings:(安排作业在传递覆盖设置时运行)
    >>> settings = {'DOWNLOAD_DELAY': 2}
    >>> scrapyd.schedule('project_name', 'spider_name', settings=settings)
    u'25b6588ef67333e38a0e080027880de7'
    
    Schedule a job to run while passing extra attributes to spider initialisation:
    (安排作业运行,同时将额外的属性传递给爬虫初始化)
    >>> scrapyd.schedule('project_name', 'spider_name', extra_attribute='value')
    # NB: 'project', 'spider' and 'settings' are reserved kwargs for this
    注意:“project”、“spider”和“settings”是为此保留的kwargs
    # method and therefore these names should be avoided when trying to pass
    方法,因此在尝试通过时应避免使用这些名称
    # extra attributes to the spider init.
    spider init的额外属性
    u'25b6588ef67333e38a0e080027880de7'
    

    相关文章

      网友评论

          本文标题:Scrapy 分布式部署(包括scrapyd部署)

          本文链接:https://www.haomeiwen.com/subject/rugdkctx.html