赞
踩
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的官方文档:Scrapyd — Scrapyd 1.2.0 documentation
安装完成后,进入到Scrapy项目的根目录下。执行
scrapyd
执行完成后,在浏览器输入
http://localhost:6800
可以看到这样的界面
接下来正式开始。
因为要和Django搭配使用,所以我们需要做一个小小的配置。记住,在scrapy项目的settings.py中修改!!!
- # scrapy项目的settings.py文件中加入下面内容
- import os
- import sys
-
- # DJANGO INTEGRATION
- # E:\code\django_scrapy\extra_apps\mySpider\mySpider/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
官方提供了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
参数:
POST http://localhost:6800/cancel.json
参数:
Scrapyd可管理多个Scrapy项目,可通过此方法获取上传的项目。
GET http://127.0.0.1:6800/listprojects.json
返回上传的项目的版本列表,最后一个为当前版本。
GET http://127.0.0.1:6800/listversions.json
参数:
返回指定版本,如不指定则为最新版本的可用爬虫列表。
GET http://127.0.0.1:6800/listspiders.json
参数:
获取指定项目的将要执行的、正在运行的、已经结束的任务
GET http://127.0.0.1:6800/listjobs.json
参数:
删除指定项目的指定版本,注意:当项目没有其他版本可以使用时,项目也会被删除。
POST http://127.0.0.1:6800/delversion.json
参数:
删除一个项目及所有上传的版本。
POST http://127.0.0.1:6800/delproject.json
参数:
附代码一份:
可在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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。