zoukankan      html  css  js  c++  java
  • Django+Scrapy搭配使用

    Django应用写好了,Scrapy的内容也写好了。

    想要在Django中执行Scrapy爬虫么?直接在Django中运行command?不,这样会把Django阻塞的。下面介绍一种不阻塞Django依旧能调用Scrapy的方法。

    本文主要讲述通过Scrapyd来进行Scrapy的调用。

    起步

    首先安装Scrapyd。

    pip install Scrapyd
    

    Scrapyd通常作为守护进程运行,它侦听运行爬虫的请求,并为每个请求生成一个进程,该进程基本上执行:scrapy crawl [myspider]
    Scrapyd还并行运行多个进程,将它们分配到max_proc和max_proc_per_cpu选项提供的固定数量的插槽中,启动尽可能多的进程来处理负载。

    除了调度和管理进程之外,Scrapyd还提供了一个JSON web服务来上载新的项目版本(作为egg)和调度爬虫。
    scrapyd的官方文档:https://scrapyd.readthedocs.io/en/latest/index.html
    安装完成后,进入到Scrapy项目的根目录下。执行scrapyd
    执行完成后,在浏览器输入

    http://localhost:6800
    

    可以看到这样的界面
    img点击并拖拽以移动

    接下来正式开始。

    配置Scrapy

    因为要和Django搭配使用,所以我们需要做一个小小的配置。记住,在scrapy项目的settings.py中修改!!!

    # scrapy项目的settings.py文件中加入下面内容
    import os
    import sys
    
    # DJANGO INTEGRATION
    # E:codedjango_scrapyextra_appsmySpidermySpider/set
    # 注意这个路径修改成自己的Django项目所在的路径
    sys.path.append('../../../django_scrapy')
    # Do not forget the change Crawler part based on your mySpider name
    # 下面这行的django_scrapy修改为自己的Django项目名字
    os.environ['DJANGO_SETTINGS_MODULE'] = 'django_scrapy.settings'
    
    # This is required only if Django Version > 1.8
    import django
    
    django.setup()
    
    # DJANGO INTEGRATION
    

    Scrapyd操作

    官方提供了API,我们可以直接通过请求进行操作。

    发布项目

    url = "http://127.0.0.1:6800/addversion.json"
    data = {
       "project": "mySpider", # Scrapy的项目名字
       "version": 1, # 版本号
       "egg": '1.egg' # 打包成egg文件的名字
    }
    res = requests.post(url, data=data)
    

    调度爬虫

    POST http://127.0.0.1:6800/schedule.json
    参数:

    • project (string, required),项目名称。
    • spider (string, required),爬虫名称,即 Spider下的name属性指定的。即scrapy crawl [爬虫名称]运行时的名称。
    • setting (string, optional),运行时的设置文件,默认为项目下settings.py。
    • jobid (string, optional),任务id,不指定则为默认生成的UUID。
    • _version (string, optional),运行的项目的版本。
    • 任何其他的参数都被传递给爬虫的属性,即scrapy crawl [爬虫名称] -a accounts=testAdmin后面-a所带的参数,在Spider中可通过self.testAdmin来获取值。

    取消正在进行的任务

    POST http://localhost:6800/cancel.json
    参数:

    • project (string, required),项目名称。
    • job (string, required),任务id。

    获取上传的项目

    Scrapyd可管理多个Scrapy项目,可通过此方法获取上传的项目。
    GET http://127.0.0.1:6800/listprojects.json

    获取项目的版本

    返回上传的项目的版本列表,最后一个为当前版本。
    GET http://127.0.0.1:6800/listversions.json
    参数:

    • project (string, required),项目名称。

    获取项目的爬虫列表

    返回指定版本,如不指定则为最新版本的可用爬虫列表。
    GET http://127.0.0.1:6800/listspiders.json
    参数:

    • project (string, required),项目名称。
    • _version (string, optional),运行的项目的版本。

    获取任务列表(Scrapyd 0.15版本以上)

    获取指定项目的将要执行的、正在运行的、已经结束的任务
    GET http://127.0.0.1:6800/listjobs.json
    参数:

    • project (string, required),项目名称。

    删除项目版本

    删除指定项目的指定版本,注意:当项目没有其他版本可以使用时,项目也会被删除。

    POST http://127.0.0.1:6800/delversion.json
    

    参数:

    • project (string, required) 项目名称。
    • version (string, required) 要删除项目的版本

    删除项目

    删除一个项目及所有上传的版本。

    POST http://127.0.0.1:6800/delproject.json
    

    参数:

    • project (string, required) 项目名称。

    附代码一份:
    可在django中调用,将此代码放到Scrapy目录下即可。

    import requests
    
    
    
    def get_status():
        # 获取状态
        url = "http://127.0.0.1:6800/daemonstatus.json"
        res = requests.get(url)
        return res.json()
    
    
    def get_project_list():
        # 获取项目列表
        url = "http://127.0.0.1:6800/listprojects.json"
        res = requests.get(url)
        return res.json()
    
    
    def get_spider_list(project):
        # 获取项目下已发布的爬虫列表
        url = "http://127.0.0.1:6800/listspiders.json?project={}".format(project)
        res = requests.get(url)
        return res.json()
    
    
    def spider_list_ver(project):
        # 获取项目下已发布的爬虫版本列表
        url = "http://127.0.0.1:6800/listversions.json?project={}".format(project)
        res = requests.get(url)
        return res.json()
    
    
    def get_spider_status(spider):
        # 获取爬虫运行状态
        url = "http://localhost:6800/listjobs.json?project={}".format(spider)
        res = requests.get(url)
        return res.json()
    
    
    def start_spider(project, spider, kwargs=None):
        # 运行一个爬虫
        url = "http://localhost:6800/schedule.json"
        data = {
            "project": project,
            "spider": spider,
        }
        if kwargs:
            data["data"] = kwargs
        res = requests.post(url, data=data)
        return res.json()
    
    
    def del_spider(project, version):
        # 删除某一版本爬虫
        url = "http://127.0.0.1:6800/delversion.json"
        data = {
            "project": project,
            "version": version,
        }
        res = requests.post(url, data=data)
        return res.json()
    
    
    def del_pro(project):
        # 删除项目。注意:删除之前需要停止爬虫,才可以再次删除
        url = "http://127.0.0.1:6800/delproject.json"
        data = {
            "project": project,
        }
        res = requests.post(url, data=data)
        return res.json()
    
    
    def get_jobs(project):
        # 获取jobs
        url = "http://127.0.0.1:6800/listjobs.json?project={}".format(project)
        res = requests.get(url)
        return res.json()
    
    
    def cancel(project, job_id):
        # 取消job
        url = "http://localhost:6800/cancel.json"
        data = {
            "project": project,
            "job": job_id
        }
        res = requests.post(url, data=data)
        return res.json()
    
    
    def publish():
        # 发布项目
        url = "http://127.0.0.1:6800/addversion.json"
        data = {
            "project": "mySpider",
            "version": 1,
            "egg": '1.egg'
        }
        res = requests.post(url, data=data)
        return res.json()
    
  • 相关阅读:
    【基础算法】- 全排列
    【基础算法】- 2分查找
    区块链培训
    Static Binding (Early Binding) vs Dynamic Binding (Late Binding)
    test
    No data is deployed on the contract address!
    "throw" is deprecated in favour of "revert()", "require()" and "assert()".
    Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
    京都行
    Failed to write genesis block: database already contains an incompatible
  • 原文地址:https://www.cnblogs.com/June-King/p/10596209.html
Copyright © 2011-2022 走看看