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。
我们执行如下命令:
代码语言:javascript复制curl http://localhost:9080/crawl.json?spider_name=quotes&url=http://quotes.toscrape.com/
结果如下图所示。
返回的是一个JSON格式的字符串,我们解析它的结构,如下所示:
代码语言:javascript复制{
"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配置实例,如下所示:
代码语言:javascript复制{
"request": {
"url": "http://quotes.toscrape.com/",
"callback": "parse",
"dont_filter": "True",
"cookies": {
"foo": "bar"
}
},
"max_requests": 2,
"spider_name": "quotes"
}
我们执行如下命令,传递该JSON配置并发起POST请求:
代码语言:javascript复制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。