• Scrapy爬虫框架第三讲(linux环境)【Spider的使用】


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

  • 相关阅读:
    Java中如何实现序列化,有什么意义?
    java中this和super关键字的作用
    java中String类的面试题大全含答案
    java中static关键字的作用
    final和abstract关键字的作用
    Java.util.Map的实现类有那些?
    java.sql.Date和java.util.Date的联系和区别
    Java 的信号灯
    java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用?
    HashMap是不是有序的?
  • 原文地址:https://www.cnblogs.com/518894-lu/p/9032038.html
Copyright © 2020-2023  润新知