Spider和CrawlSpider
spider
它的基类为scrapy.Spider
,所有编写的爬虫必须继承这个类。
主要用到的函数及调用顺序为:
__init__()
: 初始化爬虫名字和start_urls列表
parse()
: 解析response,并返回Item或Requests(需指定回调函数)。Item传给Item pipline持久化 , 而Requests交由Scrapy下载,并由指定的回调函数处理(默认parse()),一直进行循环,直到处理完所有的数据为止。在spider里面这个方法是默认的callback函数。
start_urls
当没有指定特定网址时,爬虫将开始抓取的网址列表。
start_requests() 调用make_requests_from url()
:生成Requests对象交给Scrapy下载并返回response,此方法必须返回一个可迭代的第一个请求来抓取这个爬虫。
start_urls = [ 'http://www.example.com/1.html', 'http://www.example.com/2.html', 'http://www.example.com/3.html', ] def start_requests(self): return [scrapy.FormRequest("http://www.example.com/login", formdata={'user': 'john', 'pass': 'secret'}, callback=self.logged_in)]
scrapy框架里面schedular维护了一个spider队列。
crawlSpider
Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。
-
是一个类,继承自Spider,Spider是scrapy里面爬虫的一个基类,CrawlSpider是scrapy封装的另外一个爬虫类,由于CrawlSpider是Spider的子类,所以功能要比Spider要多
-
多了一个功能:提取链接的功能,根据一定的规则直接在该网页中提取符合这个规则的所有链接
-
Spider里面在爬取到内容之后自动调用parse函数为callBack函数进行解析。而在crawlSpider里面,callBack需要自己制定对应的回调函数。
scrapy.spider.Rule使用:
class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)
-
LinkExtr actor :链接提取器,定义从当前网页获取新的链接的规则。
allow = (), # 正则表达式 allow_domains = (), # 允许的域名(了解) deny_domains = (), # 不允许的域名(了解) restrict_xpaths = (), # 根据xpath提取链接 retrict_css = () # 根据选择器提取链接 tags() # 它是一个字符串或字符串序列,定义了网页链接的标签来源。默认为('a', 'area')。 attrs() # 它是一个字符串或字符串序列,定义了网页链接的属性来源(必须是满足tags参数规定的标签的属性)。默认为('href',)。
-
callback:它接收一个回调函数(定义当前类中)的名称(注意,是函数的名称而不是引用),之后用于处理按照
link_extractor
提取到的链接的Response。该回调函数接收response
作为其第一个参数,返回Item
、Request
或它们的子类。需要注意的是,parse方法不能作为回调函数。(这和Spider类中的情况不一样!) -
cb_kwargs:它是一个参数字典,传递给回调函数。
-
follow:它是一个bool类型,用于指定是否要继续从当前规则解析出的Response中提取链接。如果
callback
是None
,则follow
默认为True
,否则默认为False
。 -
process_links:它接收一个回调函数(定义当前类中)的名称(注意,是函数的名称而不是引用),用于进一步处理那些用规则提取出的链接。
-
process_request:它接收一个回调函数(定义当前类中)的名称(注意,是函数的名称而不是引用),用于处理使用当前规则的request。