通用爬虫CrawlSpider:
CrawlSpider是Scrapy提供的一个通用Spider。在spider里,我们可以指定一些爬取规则来实现页面的提取,这些爬取的规则由一个专门的数据结构Rule表示。Rule里包含提取和根进页面的配置,Spider会根据Rule来确定当前页面的哪些链接需要爬取、哪些页面的爬取结果需要用那些方法解析等
CrawlSpider继承自Spider类,除了Spider类的所有方法和属性,它还提供了一个非常重要的属性和方法。
rules,它是爬取规则属性,是包含一个或多个Rule对象的列表
parse_start_url(),它是一个可重写的方法。
这里最重要的内容莫过于Rule的定义了,它的定义和参数如下:
class scrapy.contrib.spiders.Rule(link_extractor,callback=None,cb_kwargs=None,folow=None,process_links=None,process_request=None)
link_extractor:是Link Extractor对象。通过它,Spider可以知道从爬取的页面中提取的哪些链接,提取出的链接会自动生成Request;
allow是一个正则表达式或者正则表达式列表,它定义了从当前页面提取出来的链接哪些是符合要求的;
allow_domains定义了符合要求的域名,只有此域名的链接才会被跟进生产新的Request,它相当于白名单。
deny_domains相当于黑名单
restrict_xpaths:定义了从当前页面中XPath匹配的区域提取链接,其值是XPath表达式或者XPath表达式列表;
callback:即回调函数,注意,避免使用parse()作为回调函数,由于CrawlSpider使用parse()方法来实现其逻辑,如果parse()方法覆盖了,CrawlSpider将会运行失败
cb_kwargs:字典,它包含传递给回调函数的参数
follow:布尔值,他指定根据该规则从response提取的链接是否需要跟进,如果callback参数为None,follow默认值设置为True,否则默认为False。
process_links:指定处理函数,从link_extractor中获取到链接列表时,该函数会调用,它主要用于过滤;
process_request:同样是指定处理函数,根据Rule提取到的每一个Request时,该函数都会调用,对request进行处理。该函数返回值必须是request或None。
item Loader提供一种便捷的价值来帮助我们方便的提取Item,他提供一系列API可以分析原始数据对Item进行赋值。Item提供的是保存抓取数据的容器,而Item Loader提供的是填充容器的机制
创建爬虫命令:
scrapy startproject scrapyuniversal
scrapy genspider -t crawl china tech.china.com
import scrapy.spider import CrawlSpider,Rule
from scrapy.linkextractors import LinkExtractor
class DushuSpider(CrawlSpider):
name = 'dushu',
allowed_domains = ['www.dushu.com']
start_urls = ['http://www.dushu.com/']
rules = (
Rule(LinkExtractor(allow=r'/guoxue/\d+'),follow=True),
Rule(LinkExtractor(allow=r'/guoxue/\d+'),callback="parse_item"),
)
def parse_item(self,response):
print(response.xpath('//title/text()'))
................................................................
#与scrapy爬虫相比,crawlspider使用rules规则,相当于scrapy爬虫中的:
def parse_link(self,response):
links = response.xpath('//a/@href')
for link in links:
yield scrapy.Request(link,callback=self.parse_item)
def parse_item(self,response):
print(response.xpath('//title/text()'))
总结:
在Scrapy通用爬虫中,我们将所有配置抽离出来,每增加一个爬虫,就只需要增加一个JSON文件配置。我们之后只需要维护这些配置文件即可。如果要更加方便的管理,可以将规则存入数据库,再对接可视化管理界面即可。