Python 爬虫- scrapy 入门


1 scrapy 入门

1.1 scrapy 框架创建步骤

  1. 创建一个 scrapy 项目
    • scrapy startproject
  2. 生成一个爬虫
    • scrapy genspider
  3. 提取数据
    • 完善 spider ,通过 xpath 等方法
  4. 保存数据
    • pipeline 中保存数据

1.1.1 创建一个 scrapy 项目

以下代码(创建-保存)仅做示范,不代表是一个完整的项目,不具有完全的连贯性

  • 命令:scrapy startproject +<项目名称>

    • 例如:

      scrapy startproject myspider
      
      • 出现image-20211202144544455就表示创建成功
  • 创建之后有一个在当前目录下新建一个工程目录

    image-20211202194628902

1.1.2 创建一个爬虫

  • 命令:scrapy genspider +<爬虫名字>+<允许爬取的域名>

    • 例如:

      scrapy genspider zhangshan xingfa.org
      
      • 出现
        image-20211203101435559
      • 表示爬虫文件创建成功
  • 注意:要在工程文件的 spiders 文件夹下面再创建爬虫

1.1.3 提取数据(完善 spider )

  • image-20211206092112532
  • 从选择器中提取字符串:

    1. extract():返回一个包含字符串数据的列表
    2. extract_first():返回列表第一个字符串
    • 这个有什么用?
      • 只输出字符串
      • 可以检查代码运行情况
        • 如果返回得到一个空,则可能是前面出问题
        • 如果返回得到一个列表内值为NULL或者报错,则是当前步骤出错
  • 注意:

    1. spider 中的 parse 方法名不能修改
    2. 需要爬取的 url 地址必须是属于 allow_domin 下的链接
    3. response.xpath 返回的是一个含有 selector 对象[1]的列表
  • 在 scrapy 中遇到空字符换行符时

    • 使用:normalize-space()

      • 例如:

        #前:
        play = g.xpath('.//span[@class="so-icon watch-num"]/text()').extract()
        #后
        play = g.xpath('normalize-space(.//span[@class="so-icon watch-num"]/text())').extract()
        
        #前
        'play': '\n        238.1万\n      '
        #后
        'play': '256.2万'
        
    • 注意:

      • 通过xpath得到的列表,必须先对列表进行遍历再用这个方法,否则结果只有一个内容

1.1.4 spider 数据传到 pipline

  • image-20211206095747997
    • 这里为什么使用 yield ,而不使用 return
      • 首先明确,这 yeild 和 return 都可以使用,但是 yield 具备 return 的功能的同时,还具备一些 return 不具有的功能
    • yield 是什么?
      • yield 本身是一个函数,而主要用的是包含 yield 的函数的函数(这个函数称为生成器[2]),生成器每次产生一个值,函数被冻结,被唤醒后再产生一个值
    • 生成器有什么用?
      • 不会导致内存的占用量瞬间变高,更节省存储空间,响应更迅速,使用更灵活

1.1.5 保存数据(使用pipeline)

  • image-20211206094259454
  • 完成 pipeline 后,需要在 setting 中设置开启 pipeline

    • image-20211206094721022
    • 注意:
      • pipeline 的权重越小优先级越高
      • pipeline 中的 process_item 方法名不能修改为其他名称

注释:


  1. Scrapy 提供了自己的数据提取方法Selector(选择器)。Selector 是基于 lxml 来构建的,支持 XPath 选择器、CSS 选择器以及正则表达式。Selector 是一个可以独立使用的模块。我们可以直接利用 Selector 这个类来构建一个选择器对象,然后调用它的相关方法如 xpath()、css() 等来提取数据。 ??

  2. 简单理解就是生成器是一个不断产生值的函数 ??