在Scrapy中,要抓取网站的连接配置、抓取逻辑、解析逻辑里其实都是在Spider中配置的。在前一节实例中,咱们发现抓取逻辑也是在Spider中完成的。本节咱们就来专门了解一下Spider的基本用法。
web
在实现Scrapy爬虫项目时,最核心的类即是Spider
类了,它定义了如何爬取某个网站的流程和解析方式。简单来说,Spider
要作的事就是以下两件:
app
定义爬取网站的动做;dom
分析爬取下来的网页。scrapy
对于Spider
类来讲,整个爬取循环过程以下所述:ide
以初始的URL初始化Request,并设置回调函数。当该Request成功请求并返回时,Response生成并做为参数传给该回调函数。函数
在回调函数内分析返回的网页内容。返回结果有两种形式。一种是解析到的有效结果返回字典或Item对象,它们能够通过处理后(或直接)保存。另外一种是解析获得下一个(以下一页)连接,能够利用此连接构造Request并设置新的回调函数,返回Request等待后续调度。网站
若是返回的是字典或Item对象,咱们可经过Feed Exports等组件将返回结果存入到文件。若是设置了Pipeline的话,咱们可使用Pipeline处理(如过滤、修正等)并保存。url
若是返回的是Reqeust,那么Request执行成功获得Response以后,Response会被传递给Request中定义的回调函数,在回调函数中咱们能够再次使用选择器来分析新获得的网页内容,并根据分析的数据生成Item。spa
经过以上几步循环往复进行,咱们完成了站点的爬取。code
在上一节的例子中,咱们定义的Spider
是继承自scrapy.spiders.Spider
。scrapy.spiders.Spider
这个类是最简单最基本的Spider类,其余Spider必须继承这个类。还有后面一些特殊Spider
类也都是继承自它。
scrapy.spiders.Spider
这个类提供了start_requests()
方法的默认实现,读取并请求start_urls
属性,并根据返回的结果调用parse()
方法解析结果。它还有以下一些基础属性:
name
。爬虫名称,是定义Spider名字的字符串。Spider的名字定义了Scrapy如何定位并初始化Spider,它必须是惟一的。不过咱们能够生成多个相同的Spider实例,数量没有限制。name
是Spider最重要的属性。若是Spider爬取单个网站,一个常见的作法是以该网站的域名名称来命名Spider。例如,Spider爬取mywebsite.com,该Spider一般会被命名为mywebsite。
allowed_domains
。容许爬取的域名,是可选配置,不在此范围的连接不会被跟进爬取。
start_urls
。它是起始URL列表,当咱们没有实现start_requests()
方法时,默认会从这个列表开始抓取。
custom_settings
。它是一个字典,是专属于本Spider的配置,此设置会覆盖项目全局的设置。此设置必须在初始化前被更新,必须定义成类变量。
crawler
。它是由from_crawler()
方法设置的,表明的是本Spider类对应的Crawler对象。Crawler对象包含了不少项目组件,利用它咱们能够获取项目的一些配置信息,如最多见的获取项目的设置信息,即Settings。
settings
。它是一个Settings对象,利用它咱们能够直接获取项目的全局设置变量。
除了基础属性,Spider还有一些经常使用的方法:
start_requests()
。此方法用于生成初始请求,它必须返回一个可迭代对象。此方法会默认使用start_urls
里面的URL来构造Request,并且Request是GET请求方式。若是咱们想在启动时以POST方式访问某个站点,能够直接重写这个方法,发送POST请求时使用FormRequest
便可。
parse()
。当Response没有指定回调函数时,该方法会默认被调用。它负责处理Response,处理返回结果,并从中提取出想要的数据和下一步的请求,而后返回。该方法须要返回一个包含Request或Item的可迭代对象。
closed()
。当Spider关闭时,该方法会被调用,在这里通常会定义释放资源的一些操做或其余收尾操做。
以上内容可能不太好理解。不过不用担忧,后面会有不少使用这些属性和方法的实例。经过这些实例,咱们慢慢熟练掌握它们。