CrawlSpider类通过一些规则(rules),使对于链接(网页)的爬取更具有通用性,换句话说CrawlSpider爬虫是通用性爬虫,那么Spider爬虫就更像是为了一些特殊网站制定的爬虫
创建一个工程:
scrapy startproject crawlspider
scrapy genspider -t crawl CrawlSpider domain.com
这里面的-t crawl表示的是爬虫的类,这样我们就可以直接在spiders文件中找到这个爬虫
class CrawlspiderSpider(CrawlSpider): name = 'CrawlSpider' allowed_domains = ['www.domin.com'] start_urls = ['http://www.domin.com/'] rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): i = {} #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract() #i['name'] = response.xpath('//div[@id="name"]').extract() #i['description'] = response.xpath('//div[@id="description"]').extract() return i
上面这段话是自动生成的一段代码,这段代码可以说是基本上对CrawlSpider爬虫的结构有一个简单的构造
在这里面我们可以看到有一个rules属性,还有这个爬虫继承的类是CrawlSpider,这个就和之前继承的Spider是有区别的,其中这里面的这个rules属性就是该整个爬虫核心
CrawlSpider使用rules属性来决定爬虫爬取的规则,并将匹配后的url请求提交给引擎,完成后续的爬取的工作
rule属性主要是由几个Rule对象构成的,而这个Rule对象定义了提取链接等操作的规则
Rule对象有六个属性
- LinkExtractor:用于提取response中的链接
- callback:回调函数,对提取的链接使用,用于提取数据来填充item
- cd_kwargs:传递给回调函数的参数字典
- follow=True/False:对提取的链接是否需要跟进
- process_links:一个过滤链接的函数
- process_request:一个过滤链接Request的函数
上面这些参数中除了LinkExtractor之外,其他的参数都是可选的,并且如果当callback的参数为None的时候,我们就称这个rules是一个跳板,也就是只下载了页面, 并没有进行其他额外的操作,通常是用来作为翻页功能
LinkExtractior参数:是用来提取链接的,它有是个参数用来定义提取链接的规则
- allow:正则表达式字符串,提取response中符合这个正则表达式的链接
- deny:排除这个正则表达式链接之外的链接
- restrict_css:提取满足这个css表达式的链接
- restrict_xpath:提取满足这个xpath表达式的链接
- alllow_domins:允许的域名
- deny_domains:排除的域名
- tags:提取制定标签的下的链接,默认会从a和area标签下面提取链接
- attrs:提取满足属性的链接
- unique=True/False:链接是否要进行去重操作
- process_value:值处理函数,优先级要大于allow
这上面的参数可以一起使用,以提取同时满足条件的链接
follow参数:为布尔值,用于是否跟进链接的处理,在当callback为None的时候,默认是要跟进链接的,值为True;当callback不为空的时候,默认是False的,不跟进链接。我们要根据需要来进行赋值
跟进和不跟进:就是你前面定义的规则对于已经提取的链接的页面是不是在进行一次提取链接的操作
rules工作流程:
这样的,对于Rule提取的链接会自动调用parse函数,并返回这个链接的response,然后将这个链接的response给callback回调函数,通过回调函数的方式对这个item进行填充
在CrawlSpider中还有一个parse_start_url()方法,是用来解析start_urls中的链接页面,这个方法一般用在有跳板的爬虫中,用来对首页的解析
ps:在编写爬虫规则的时候,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果要是覆盖了parse方法,CrawlSpider将会运行失败,follow=True将会匹配所有的链接,深度匹配;follow=False只会匹配当前页
process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表的时候将会调用到这个函数。这个方法主要是用来过滤链接的,把错误的链接修改过来
process_request:指定该spider中哪个函数被调用,这个规则提取到每个request的时候都会调用这个函数。(用来过滤request)