如果我们使用仅使用Spider,那么整个过程都是代码实现,如生成request,寻找下一页等,这样的话就和普通的爬虫没什么区别。爬取不同站点就要就要分别创建一个Spider,其实这里面代码思路差不多,可能有很多重复代码,这个时候,我们可以将公共部分抽离出来,有利于我们的维护,这就是规则化爬虫。
选择CrwalSpider模板创建spider
scrapy genspider -t crawl name url
这是一个(或多个)Rule对象的列表。每个都Rule 定义了爬取网站的特定行为。
参数:
link_extractor:LinkExtracter的对象。从响应中提取需要继续爬取的链接,并将链接生成Request。
callback:和Request中的callback一样,接收响应被调用。注意不能使用parse(),因为CrawlSpider使用怕是parse()进行解析,我们不能进行重写。
cb_kwargs:dict类型,定义传递给回调函数的参数
follow:bool类型,指定是否将此规则中提取到的链接进一步生成Request,如果callback是 None, follow默认为True,否则默认为False。
process_links:对link_extractor提取到的链接进一步处理,例如修改,过滤。
process_request:对提取并生成的Request进一步处理,必须返回Request或者None
errback:Request发生异常时调用
上文中提到link_extractor是Rule的重要属性,下面了解它的用法
导入:
from scrapy.linkextractors import LinkExtractor
参数:
allow:正则表达式或正则列表。定义提取连接的规则,符合条件的进行爬取
deny:与allow相反,定义规则的链接不允许爬取,优先于allow
allow_domains: 定义符合规则的域名,域名符合进行提取
deny_domains:不进行提取的域名
deny_extensions:定义带有该类扩展名的不被爬取,默认scrapy.linkextractors.IGNORED_EXTENSIONS.
restrict_xpaths:从定义Xpath匹配的区域进行提取
restrict_css:从定义CSS匹配的区域进行提取
tags:指定从哪类标签内提取链接,默认为('a', 'area')
attrs:指定从什么属性提取链接,默认为('href')
canonicalize :bool类型,规范化每个提取的 url。默认为False
unique:bool类型,是否对连接进行去重,默认True
process_value:一个方法,用于将提取内容转换为最终链接。例如href中不是纯链接时可以使用进行处理
strip:bool类型,去空格处理。默认True