scrapyd:是一个网页版管理scrapy的工具,它是一个运行scrapy爬虫的服务程序,能够在网页端查看正在执行的任务,scrapy爬虫写好后,可以用命令行运行, 它支持以http命令方式发布、删除、启动、停止爬虫程序。它允许你部署你的scrapy项目以及通过HTTP JSON的方式控制你的爬虫而且scrapyd可以同时管理多个爬虫, 每个爬虫还可以有多个版本。

特点:可以避免爬虫源码被看到.有版本控制.可以远程启动, 停止, 删除 .

强调一下,为了更方便的使用scrapyd,还需要安装一个scrapyd-client,scrapyd相当于一个服务器,为了方便使用这个服务器我们需要在一个客户机上对他进行操作,它们的关系如此。

Scrapyd-client:是一个专门用来发布scrapy爬虫的工具,虽然也具有部分管理功能,但是不如scrapyd齐全,因此建议只用来发布。

scrapyd-client的作用:用于打包你的工程提供给scrapyd服务器scrapyd-client也就是scrapyd的客户机

 

为何要使用scrapyd:1.方便往服务器上部署爬虫(原设计原因)

2.更优爬虫进行调度 使用场景:比如当需要对一个网站的1000个入口往下进行爬取,通过参数控制启动1000个爬虫,scrapyd不会让这1000个同时启动而是会依次跑下来。【能同时运行多少爬虫是根据机器性能自适应决定的】

什么叫部署?:部署一般是在多台机子上安装同一个软件,说白了就是涉及大规模安装的软件才叫部署。scrapyd是为scrapy分布式爬取、或是scrapy大规模爬取做准备的。 【在一台机子上装scrapy然后跑个爬虫再装个scrapyd来部署一番 完全没有必要使用scrapyd】

总结一下:也就是说scrapyd和scrapyd-client是分别装在不同的机子上、多机爬取使用scrapyd才合理!

scrapyd的使用流程:首先在每台Linux机子上安装好scrapyd,并开启scrapyd服务;然后我们在windows客户端,也就是开发爬虫的这台电脑,安装上scrapyd的客户端scrapyd-client,通过scrapyd-client把不同网站的爬虫发送到不同的服务器,然后我们只需在windows上进行修改、启动、停止爬虫操作,更自动化的是scrapyd给我们提供了很多python接口,我们可以通过python编程控制蜘蛛的运行,比如:我想晚上1:00启动淘宝爬虫、明天中午暂停京东爬虫、唯品会数据库满了停止爬虫……这些都可以通scrapyd提供的API用python编程的方式实现!

 

 

---------scrapyd部署爬虫---------------1.编写爬虫scrapy基本命令:scrapy startproject 项目名 :创建scrapy工程项目 scrapy(爬虫引擎) startproject(创建项目)

cd 目录名 :在项目路径下执行scrapy genspider 爬虫名 Abckg.com 网址 :创建爬虫 genspider(蜘蛛模板)scrapy crawl 爬虫名 :运行爬虫(在项目路径下执行) crawl(抓取)scrapy crawl 爬虫名 -o 文件名.后缀名 :利用管道pipelines来处理(保存)数据(写入文件)

2.部署环境pip install scrapyd pip install scrapyd-client

在cmd中启动scrapyd的服务scrapyd

3.发布工程到scrapyd网页版管理scrapy的工具中修改scrapy.cfg文件中 [deploy:自定义部署名称] 去掉url前的# project = 项目名

在爬虫根目录执行:scrapyd-deploy 自定义部署名 -p 工程名


如果提示不是内部命令,修改Python37\Scripts

新建一个scrapyd-deploy.bat文件加入以下代码@echo off"路径\Python37\python.exe" "路径\Python37\Scripts\scrapyd-deploy" %*

4.启动爬虫第一种方法:Django中view.pyclass StartSpider(View): def get(self,request): url = 'http://127.0.0.1:6800/daemonstatus.json' data = {'project': '工程名', 'spider': '爬虫名'} response = requests.get(url=url, data=data) print(requests.get(url=url, data=data)) return JsonResponse(json.loads(response.text))

第二种方法:命令式启动爬虫:curl http://localhost:6800/schedule.json -d project=工程名 -d spider=爬虫名

5.启动djangocmd:python manage.py runserver

Available projects :服务中已经发布的项目jobs :任务 Pending :暂停的 Running :运行中的 Finished :结束的 Log :日志 project :工程名 Spider :爬虫名 job :任务对应的值logs :日志(存储的爬虫信息)Documentation :文档

 

----------------scrapyd 管理爬虫接口----------------------替换url变量中的值就可以运行。get方式:1,2,3,4,5

class StartSpider(View): def get(self,request): url = 'http://127.0.0.1:6800/daemonstatus.json' data = {'project': '工程名', 'spider': '爬虫名'} response = requests.get(url=url, data=data) print(requests.get(url=url, data=data)) return JsonResponse(json.loads(response.text))

1、获取状态http://127.0.0.1:6800/daemonstatus.json

2、获取项目列表http://127.0.0.1:6800/listprojects.json

3、获取项目下已发布的爬虫列表http://127.0.0.1:6800/listspiders.json?project=工程名

4、获取项目下已发布的爬虫版本列表http://127.0.0.1:6800/listversions.json?project=工程名

5、获取爬虫运行状态http://127.0.0.1:6800/listjobs.json?project=工程名

post方式:6,7,8,9class StartSpider(View): def get(self,request): url = 'http://localhost:6800/schedule.json' data = {"project":'工程名',"spider":'爬虫名'} response = requests.post(url=url, data=data) print(requests.post(url=url, data=data)) return JsonResponse(json.loads(response.text))

 

6、启动服务器上某一爬虫(必须是已发布到服务器的爬虫)http://localhost:6800/schedule.json

7.结束运行中的爬虫http://127.0.0.1:6800/cancel.json(post方式,data={"project":'工程名',"job":'job值'})

8、删除某一版本爬虫http://127.0.0.1:6800/delversion.json(post方式,data={"project":myproject,"version":myversion})

9、删除某一工程,包括该工程下的各版本爬虫(运行中爬虫无法删除,删除后需要重新发布工程)http://127.0.0.1:6800/delproject.json(post方式,data={"project":'工程名'})

 

--------------django+scrapy-----------------------------1.创建django项目,并编写models.py,启动django项目

2.Django项目根目录下创建Scrapy项目(这是scrapy-djangoitem所需要的配置)配置Django嵌入,在Scrapy的settings.py中加入以下代码:import osimport syssys.path.append(os.path.dirname(os.path.abspath('.')))os.environ['DJANGO_SETTINGS_MODULE'] = 'django项目名.settings'

手动初始化Django:

import djangodjango.setup()

3.编写爬虫

4.items.py中引入Django模型类pip install scrapy-djangoitem

from scrapy_djangoitem import DjangoItemfrom app import modelsclass 工程名Item(DjangoItem): # 此处必须起名为django_model,主爬虫中使用item['title']=xxx django_model = models.django的类名

5.pipelines.py中调用save()class 工程名Pipeline(object): def process_item(self, item, spider): # 插入到数据库 item.save() return item #将item传给下一个管道继续处理

6.启动爬虫:scrapy crawl 爬虫名7.刷新django-admin后台

posted on 2019-10-14 11:50  -最初友人-  阅读(1725)  评论(0编辑  收藏  举报