下面我们来学习下Spider的具体使用:
我们已上节的百度阅读爬虫为例来进行分析:
1 # -*- coding: utf-8 -*- 2 import scrapy 3 from scrapy.linkextractors import LinkExtractor 4 from ..items import BookItem 5 6 class BookSpider(scrapy.Spider): 7 name = 'book' 8 allowed_domains = ['yuedu.baidu.com'] 9 #定义起始爬取点 10 start_urls = ['https://yuedu.baidu.com/rank/newbook?pn=0'] 11 12 #提取书籍列表页面 13 def parse(self, response): 14 #提取每本书点书籍页面链接 15 le = LinkExtractor(restrict_css = 'a.al.title-link') 16 le.extract_links(response) 17 for link in le.extract_links(response): 18 yield scrapy.Request(link.url,callback = self.parse_book) 19 20 #提取下个页面的列表页面 21 url = url = response.css('div.pager a.next::attr(href)').extract_first() 22 if url: 23 url = response.urljoin(url) 24 yield scrapy.Request(url,callback = self.parse) 25 26 #解析每本书的页面 27 def parse_book(self,response): 28 sel = response.css('div.content-block') 29 30 item = BookItem() 31 item['name'] = sel.css('h1.book-title::attr(title)').extract_first() 32 item['rating'] = sel.css('div.doc-info-score span.doc-info-score-value::text') .extract_first() 33 item['authors'] = sel.css('li.doc-info-field.doc-info-author a::text').extract _first() 34 item['publisher'] = sel.css('li.doc-info-field a::text').extract_first() 35 item['price'] = sel.css('div.doc-info-price span.numeric::text').extract_first () 36 37 yield item
1、继承scrap.Spider
摘自官方文档
意思如下:scrapy框架为我们提供了一个Spider基类,我们编写的spider要继承它,如上面我们编写了一个BookSpider类,而这个类是继承于scrapy.Spider的
name属性:顾名思义就是命名,如上面我们将其命名为BookSpider,这是识别Spider的唯一标志(相当于你叫什么),供后面我们执行scrapy crawl 时使用,告诉spider 使用哪个Spider 去爬取
allowed_domains属性:顾名思义就是定义爬取的域名(也就是在哪个网站开始我们的爬虫)
start_urls属性:顾名思义就是定义起始爬取点【通常被实现为一个列表】
start_requests属性:
摘自官网
我们来解读下:
上面我们声明了start_urls通常为一个列表对象,实际上对于起始爬取点的请求是由Scrapy引擎调用Spider中的start_requests提交的,通过分析源码我们知道start_requests通过调用start_urls中的每一个u'r'l来构造Request请求
这里就提供给各位小伙伴一个重新定义起始爬取点的方法,即修改start_requests方法【它需要返回一个可迭代对象(列表、生成器等)】
示例如下:
def start_requests(self):
yield scrapy.Request('https://yuedu.baidu.com/rank/newbook?pn=20',callback = self.parse_book,headers = {User-Agent:'........'},dont_filter =True)
我们来分析下:
我们重新定义的起始爬取点为百度阅读新书榜第二页,并指定了回调函数为parse_book(如不指定会自动回调parse函数),设置了请求头字段,并更改了dont_filter为True (这里该字段默认为False 即对同一个url多次提交下载请求时,后面的请求会被去重过滤器过滤,这里我们设定了避免被过滤,进行强制下载!)--针对Request和Response对象小伙伴们我会单独列一篇文章与大家一起学习!
parse属性:顾名思义就是指定页面解析函数它的作用如下:
1、使用选择器提取页面中的信息,将数据封装后传个Scrapy引擎
2、使用选择器或者LinkExtractor提取页面中的链接,构造新的Request对象给Scrapy引擎
摘自官网
总结:
本文我们学习了spider的使用,它有四大基本属性name ; allowed_domains ; start_urls ;start_requests (其他的小伙伴们参见官网http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/spiders.html),并学了构造起始爬取点的两种方法和整个spider的工作流程定义Spider类---命名爬虫---定义爬取的域名---定义起始爬取点--传递给页面解析函数进行解析
最后小伙伴DO YOU UNDERSTAND?明白了我们继续往下一起学习吧!