zoukankan      html  css  js  c++  java
  • 爬虫部署与Django

    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 工程名


    如果提示不是内部命令,修改Python37Scripts

    新建一个scrapyd-deploy.bat文件加入以下代码@echo off"路径Python37python.exe" "路径Python37Scriptsscrapyd-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后台

  • 相关阅读:
    洛谷 P2766 最长不下降子序列问【dp+最大流】
    洛谷 P3254 圆桌问题【最大流】
    洛谷 P2764 最小路径覆盖问题【匈牙利算法】
    洛谷 P2763 试题库问题【最大流】
    洛谷 P2762 太空飞行计划问题 【最大权闭合子图+最小割】
    洛谷 P2761 软件补丁问题 【spfa】
    洛谷 P2754 星际转移问题【最大流】
    洛谷 P1251 餐巾计划问题【最小费用最大流】
    spoj 371 Boxes【最小费用最大流】
    poj 3680 Intervals【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/zuichuyouren/p/11670745.html
Copyright © 2011-2022 走看看