Scrapy框架的使用之Scrapyrt的使用

Scrapyrt为Scrapy提供了一个调度的HTTP接口。有了它我们不需要再执行Scrapy命令,而是通过请求一个HTTP接口即可调度Scrapy任务,我们就不需要借助于命令行来启动项目了。如果项目是在远程服务器运行,利用它来启动项目是个不错的选择。

一、本节目标

我们以本章Scrapy入门项目为例来说明Scrapyrt的使用方法,项目源代码地址为:https://github.com/Python3WebSpider/ScrapyTutorial。

二、准备工作

请确保Scrapyrt已经正确安装并正常运行

三、启动服务

首先将项目下载下来,在项目目录下运行Scrapyrt,假设当前服务运行在9080端口上。下面将简单介绍Scrapyrt的使用方法。

四、GET请求

目前,GET请求方式支持如下的参数。

  • spider_name:Spider名称,字符串类型,必传参数。如果传递的Spider名称不存在,则返回404错误。
  • url:爬取链接,字符串类型,如果起始链接没有定义就必须要传递这个参数。如果传递了该参数,Scrapy会直接用该URL生成Request,而直接忽略start_requests()方法和start_urls属性的定义。
  • callback:回调函数名称,字符串类型,可选参数。如果传递了就会使用此回调函数处理,否则会默认使用Spider内定义的回调函数。
  • max_requests:最大请求数量,数值类型,可选参数。它定义了Scrapy执行请求的Request的最大限制,如定义为5,则表示最多只执行5次Request请求,其余的则会被忽略。
  • start_requests:代表是否要执行start_requests方法,布尔类型,可选参数。Scrapy项目中如果定义了start_requests()方法,那么项目启动时会默认调用该方法。但是在Scrapyrt中就不一样了,Scrapyrt默认不执行start_requests()方法,如果要执行,需要将start_requests参数设置为true。

我们执行如下命令:

curl http://localhost:9080/crawl.json?spider_name=quotes&url=http://quotes.toscrape.com/

结果如下图所示。

返回的是一个JSON格式的字符串,我们解析它的结构,如下所示:

{
  "status": "ok",
  "items": [
    {
      "text": "“The world as we have created it is a process of o...",
      "author": "Albert Einstein",
      "tags": [
        "change",
        "deep-thoughts",
        "thinking",
        "world"
      ]
    },
    ...
    {
      "text": "“... a mind needs books as a sword needs a whetsto...",
      "author": "George R.R. Martin",
      "tags": [
        "books",
        "mind"
      ]
    }
  ],
  "items_dropped": [],
  "stats": {
    "downloader/request_bytes": 2892,
    "downloader/request_count": 11,
    "downloader/request_method_count/GET": 11,
    "downloader/response_bytes": 24812,
    "downloader/response_count": 11,
    "downloader/response_status_count/200": 10,
    "downloader/response_status_count/404": 1,
    "dupefilter/filtered": 1,
    "finish_reason": "finished",
    "finish_time": "2017-07-12 15:09:02",
    "item_scraped_count": 100,
    "log_count/DEBUG": 112,
    "log_count/INFO": 8,
    "memusage/max": 52510720,
    "memusage/startup": 52510720,
    "request_depth_max": 10,
    "response_received_count": 11,
    "scheduler/dequeued": 10,
    "scheduler/dequeued/memory": 10,
    "scheduler/enqueued": 10,
    "scheduler/enqueued/memory": 10,
    "start_time": "2017-07-12 15:08:56"
  },
  "spider_name": "quotes"
}

这里省略了items绝大部分。status显示了爬取的状态,items部分是Scrapy项目的爬取结果,items_dropped是被忽略的Item列表,stats是爬取结果的统计情况。此结果和直接运行Scrapy项目得到的统计是相同的。

这样一来,我们就通过HTTP接口调度Scrapy项目并获取爬取结果,如果Scrapy项目部署在服务器上,我们可以通过开启一个Scrapyrt服务实现任务的调度并直接取到爬取结果,这很方便。

五、POST请求

除了GET请求,我们还可以通过POST请求来请求Scrapyrt。但是此处Request Body必须是一个合法的JSON配置,在JSON里面可以配置相应的参数,支持的配置参数更多。

目前,JSON配置支持如下参数。

  • spider_name:Spider名称,字符串类型,必传参数。如果传递的Spider名称不存在,则返回404错误。
  • max_requests:最大请求数量,数值类型,可选参数。它定义了Scrapy执行请求的Request的最大限制,如定义为5,则表示最多只执行5次Request请求,其余的则会被忽略。
  • request:Request配置,JSON对象,必传参数。通过该参数可以定义Request的各个参数,必须指定url字段来指定爬取链接,其他字段可选。

我们看一个JSON配置实例,如下所示:

{
    "request": {
        "url": "http://quotes.toscrape.com/",
        "callback": "parse",
        "dont_filter": "True",
        "cookies": {
            "foo": "bar"
        }
    },
    "max_requests": 2,
    "spider_name": "quotes"
}

我们执行如下命令,传递该JSON配置并发起POST请求:

curl http://localhost:9080/crawl.json -d '{"request": {"url": "http://quotes.toscrape.com/", "dont_filter": "True", "callback": "parse", "cookies": {"foo": "bar"}}, "max_requests": 2, "spider_name": "quotes"}'

运行结果和上文类似,同样是输出了爬取状态、结果、统计信息等内容。

六、结语

以上内容便是Scrapyrt的相关用法介绍。通过它,我们方便地调度Scrapy项目的运行并获取爬取结果。更多的使用方法可以参考官方文档:http://scrapyrt.readthedocs.io。

原文发布于微信公众号 - 进击的Coder(FightingCoder)

原文发表时间:2018-05-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师之路

计数系统架构实践一次搞定 | 架构师之路

提醒,本文较长,可提前收藏/转发。 一、需求缘起 很多业务都有“计数”需求,以微博为例: ? 微博首页的个人中心部分,有三个重要的计数: 关注了多少人的计数 粉...

3736
来自专栏从零开始的linux

django

框架基础 Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当...

3568
来自专栏挖坑填坑

ABP框架学习之——动态 web api

822
来自专栏xingoo, 一个梦想做发明家的程序员

【AngularJS】—— 3 我的第一个AngularJS小程序

通过前面两篇的学习,基本上对AngularJS的使用有了一定的了解。 本篇将会自己手动写一个小程序,巩固下理解。   首先要注意的是,引用Angular...

2436
来自专栏GreenLeaves

一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)

本文脉络图如下: ? 1、CLR(Common Language Runtime)公共语言运行时简介 ? (1)、公共语言运行时是一种可由多种编程语言一起使用的...

21910
来自专栏Java Web

初学Java Web(5)——cookie-session学习

HTTP 协议 Web 浏览器与 Web 服务器之间的一问一答的交互过程必须遵守一定的规则,这样的规则就是 HTTP 协议。 HTTP 是 hypertext ...

2855
来自专栏Linyb极客之路

RPC框架设计和调用详解

RPC是远程调用过程的简写,是一个协议,处于网络通信协议的第五层:会话层,其下就是TCP/IP协议,在建立在其基础上的通信会话协议。RPC定义了交互的模式,而...

942
来自专栏从零开始学自动化测试

python文档25-fixture的作用范围(scope)

fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function

723
来自专栏Jerry的SAP技术分享

sap.ui.require in SAP UI5 and require in nodejs

例如我需要在controller的onShowHello里通过MessageToast弹一个消息显示在UI上,

3345
来自专栏决胜机器学习

设计模式专题(四)——代理模式

设计模式专题(四)——代理模式 (原创内容,转载请注明来源,谢谢) 一、概述 代理模式(Proxy)是为其他对象提供一种代理,以控制这个对象的访问。即外系统...

3187

扫码关注云+社区