• 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()
    
  • 相关阅读:
    hbase与Hive的集成
    HBase API操作
    HBase原理
    HBase数据结构
    HBase Shell操作
    HBase简介
    Boxes in a Line
    B
    B. Painting Pebbles
    X
  • 原文地址:https://www.cnblogs.com/June-King/p/10596209.html
Copyright © 2020-2023  润新知