特点:可以避免爬虫源码被看到.有版本控制.可以远程启动, 停止, 删除 .
强调一下,为了更方便的使用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后台