实现一个 Spider 子的过程就像是完成一系列的填空题,Scrapy 框架提出如下问题让用户在Spider 子类中做答:框架
一、爬虫从哪一个或者那些页面开始爬取?scrapy
二、对于一个已下载的页面,提取其中的那些数据?ide
三、爬取完当前页面后,接下来爬取哪一个或那些页面?函数
上面问题的答案包含了一个爬虫最重要的逻辑,回答了这些问题,一个爬虫也就开发出来了。url
步骤 01: 继承 scrapy.Spiderspa
import scrapy class BooksSpider(scrapy.Spider): ...
步骤 02:为 Spider 取名;code
import scrapy class BooksSpider(scrapy.Spider): name = "book" ...
步骤 03:设定起始爬取点;对象
class BooksSpider(scrapy.Spider): ... start_url = ['http://books.toscrape.com/'] ...
start_url 同常被实现成一个列表,其中放入全部的其实爬去点的 url (例子中只有一个其实点)。看到这里,你们可能会想,请求页面下载不是必定要提交 Request 对象么? 而咱们仅定义了 url 列表,是谁暗中构造并提交了 Request 对象呢? 经过阅读 Spider 基类源码能够找到答案,相关代码以下:blog
步骤 04:实现页面解析函数;继承
页面解析函数也就是构造 Request 对象是经过 callback 参数指定的回调函数(或默认的 parse 方法)。页面解析函数是实现 Spider 中最核心的部分,它须要完成如下两项工做:
一、使用选择器提取页面中的数据,将数据封装后 (Item 或字典)提交给 Scrapy 引擎。
二、使用选择器或 LinkExtractor 提取页面中的链接,用其构造新的Request 对象并提交给 Scrapy 引擎(下载链接页面)。
一个页面中可能包含多项数据以及多个链接,所以页面解析函数被要求返回一个可迭代对象(一般被实现成一个生成器函数),每次迭代返回一项数据(Item或字典)或一个 Request 对象。