1、 认识Spider类
爬虫Spider类是爬虫程序的核心模块,使用Scarpy框架创建爬虫项目后,框架并没有创建Spider类,需要使用命令来创建,启动Windows命令行窗口,将项目目录设置为当前目录,输入下面的命令:
scrapy genspider spider_baidunews news.baidu.com
scrapy genspider是Scrapy框架的创建爬虫命令,spider_baidunews是爬虫模块名称,news.baidu.com是爬虫要爬取的网站域名。
命令执行后,Scarpy框架会在项目子包目录spiders下创建spider_baidunews.py模块文件,该模块文件就是爬虫Spider类的实现文件。文件代码如下:
import scrapy class SpiderBaidunewsSpider(scrapy.Spider): name = 'spider_baidunews' allowed_domains = ['news.baidu.com'] start_urls = ['http://news.baidu.com/'] def parse(self, response): pass
SpiderBaidunewsSpider类是爬虫Spider类的子类。
属性name设置爬虫名称,在一个爬虫项目内允许有多个爬虫类,爬虫名称必须是唯一的。
属性allowed_domains设置允许爬虫爬取的域名列表,该属性是列表类型,可以设置多个网站域名。
属性start_urls设置开始爬取的URL地址,爬虫将从该列表获取起始的爬取URL地址,后续的URL将会从爬取到的数据中提取。该属性是列表类型,可以设置多个起始URL地址,爬虫将依次爬取列表内的URL。
parse()方法是回调方法,当爬虫下载数据完成后,会自动调用parse()方法,并传入生成的response实例对象,response对象封装了解析下载数据的方法。该方法或者返回从下载数据提取的Item实例对象,或者返回request实例对象。

上图是Spider类的工作流程图,Spider类将待爬取的URL封装为Request实例对象,并通过Scrapy引擎发送Request请求,Scrapy引擎调用下载管理器下载Request请求返回的数据,并生成Response实例对象,Scrapy引擎回调Request请求绑定的回调方法,并传入Response实例对象。Spider类默认的回调方法是parse()方法。
2 Spider类的属性和方法
下表给出了Spider类的主要属性:

下表给出了Spider类的主要方法:

注释(1)
该方法创建Spider类实例对象,相当于代替了类的构造方法_init_()。该方法还会设置crawler和settings属性。
参数crawler是Crawler类实例对象,它是整个爬虫程序的实例对象,通过from_crawler类方法传递给Scrapy组件,此对象提供对所有Scrapy组件的访问。Spider类实例对象将绑定到crawler实例对象。
参数args是传递给_init_()方法的参数。
参数kwargs是传递给_init_()方法的关键字参数。
注释(2)
该方法在爬取开始时调用,且仅调用一次。继承的Spider子类可以重写该方法。若要更改开始爬取的URL,可以在该方法中实现。
例如:若要爬取需要登录的网站,可以在该方法中进入登录页,并登录网站。
class MySpider(scrapy.Spider):
name = 'myspider'
# 重写start_requests方法
def start_requests(self):
# 返回列表对象
return [scrapy.FormRequest("http://www.example.com/login",
formdata={'user':'john','pass': 'secret'},
callback=self.logged_in)]
# 回调方法
def logged_in(self, response):
# 解析返回的登录数据
passFormRequest是Request类的子类,用于向网站发送表单请求。FormRequest的构造方法如下:
class scrapy.http.FormRequest(url[, formdata, ...][, callback])
参数url是发送表单请求的URL。
formdata是可选参数,它是一个字典类型的数据,其中包含HTML表单数据。
callback是可选参数,它用于设置回调方法。
注释(3)
该方法发送日志记录到Scrpay的logger日志实例对象。参数message是日志消息,参数level是日志等级。
3、 CrawlSpider类
CrawlSpider类是Spider类的子类,它继承了Spider类的所有属性和方法,同时它定义一组规则为提取网页中的链接提供了一种方便的机制。
在爬取网站时,网站有很多URL指向一些不需要爬取的网址,通过在CrawlSpider类添加爬取规则,可以避免爬虫爬取这些无用的URL。
CrawlSpider类的属性如下表所示:

CrawlSpider类的方法如下表所示:

如何定义规则?
Spider类的Rule()方法用于设置爬取规则:
classs crapy.spiders.Rule( link_extractor=None, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None, errback=None )
该方法用于设置一个爬取规则,可以使用该方法设置多个爬取规则。
参数link_extractor是一个LinkExtractor对象,用于定义需要提取的链接。
参数callback是回调方法,用于处理LinkExtractor内的URL请求返回的响应。
注意:设置的爬虫规则,要避免使用parse作为回调函数。因为CrawlSpider使用parse方法来实现其逻辑,如果覆盖了parse方法,CrawlSpider将会运行失败。
参数cb_kwargs是传递给回调方法的关键字参数。
参数follow是一个布尔值,用于设置根据该规则从response提取的链接是否继续爬取。若callback为None,follow默认设置为True,否则默认为Flase。
参数process_links是一个回调方法。若提供了该参数,当提取到一个URL链接时,该方法将被调用,主要用于过滤URL链接。
参数process_request是一个回调方法。若提供了该参数,在发送Request请求之前,该方法将被调用,主要用于过滤Request请求。
参数errback是一个回调方法。若提供了该参数,当发生异常时,该方法将被调用。
LinkExtractor对象
LinkExtractor对象是从响应中提取链接的对象。LinkExtractor类的构造方法为:
LinkExtractor( allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags='a', 'area', attrs='href', canonicalize=False, unique=True, process_value=None, strip=True )
构造方法参数很多,都是关键字参数。实际上在创建一个LinkExtractor实例对象时,不需要传入这么多关键字参数,每个关键字参数都有默认值。其主要参数说明如下:
参数allow:括号内为提取URL链接的正则表达式,与正则表达式匹配的URL链接会被提取。若没有提供参数或参数为空,则全部匹配。
参数deny:括号内为不提取URL链接的正则表达式,与正则表达式匹配的URL链接将不会被提取。若没有提供参数或参数为空,该参数被忽略。
参数allow_domains:URL链接在allow_domains域内会被提取。
参数deny_domains:URL链接在allow_domains域内不会被提取。
参数restrick_xpaths:括号内为XPath表达式,与参数allow共同作用过滤URL链接。顺序为XPath表达式返回节点列表,再由allow正则表达式处理节点列表。