疾风_lu 阅读(33) 评论(0)

下面我们来学习下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?明白了我们继续往下一起学习吧!