CrawlSpider
CrawlSpider概念:CrawlSpider就是Spider的一个类,功能更加强大。包含链接提取器,规则解析器。
代码:
- 创建一个工程
scrapy startproject crawlSpiderPro
- 创建一个基于CrawlSpider的爬虫文件
scrapy genspider -t crawl chouti dig.chouti.com
- 创建了一个spider模板
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class ChoutiSpider(CrawlSpider): name = 'chouti' # allowed_domains = ['dig.chouti.com'] start_urls = ['https://dig.chouti.com/'] #实例化链接提取器 link=LinkExtractor(allow=r'Items/') rules = ( #实例化一个规则解析器对象 Rule(link, callback='parse_item', follow=True), ) def parse_item(self, response): item = {} #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item
问题:如果我们想要对某一个网站进行全站爬取?
解决方案:
- 通过手动发送请求
- CrawlSpider(推荐)
链接提取器:根据正则表达式在页面中提取指定规则的链接,提取到的链接全部交给规则解析器,
规则解析器:规则解析器接收链接提取器发送的链接后,就会对这些链接发送请求,获取链接对应的页面内容,根据回掉函数对指定内容进行解析
follow参数:是否将链接提取器继续作用于链接提取器请求回的内容中,即递归爬取。scrapy会自动做去重操作
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class ChoutiSpider(CrawlSpider): name = 'chouti' # allowed_domains = ['dig.chouti.com'] start_urls = ['https://dig.chouti.com/'] #实例化链接提取器 #链接提取器:根据正则表达式在页面中提取指定规则的链接 link=LinkExtractor(allow=r'/all/hot/recent/\d+') rules = ( #实例化一个规则解析器对象 #规则解析器接收链接提取器发送的链接后,就会对这些链接发送请求,获取链接对应的页面内容,由callback回掉函数解析数据 #follow参数:是否将链接提取器继续作用于链接提取器请求回的内容中,即递归 Rule(link, callback='parse_item', follow=False), ) def parse_item(self, response): item = {} #数据解析,和普通的spider一样 print(response) #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item
follow参数为False时:
当follow参数为True时:能提取所有页面