i、scrapy框架

scrapy框架

1、是什么?

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

官方网站
https://doc.scrapy.org/en/latest/
中文:http://www.scrapyd.cn/doc/
中文:http://scrapy-chs.readthedocs.io/zh_CN/latest/

2、提供两种爬虫方式

  • scrapy.Spider:普通的爬虫类

  • scrapy.CrawlSpider:规则的爬虫类

3、如何安装

pip install scrapy==1.5.1 -i  http://mirrors.aliyun.com/pypi/simple

安装错误解决:

pip install pywin32
pip install Twsited-*.whl

4、框架组成

5个组成部分中,最重要的就是spider,代码大都是写在spiders中

  • 引擎(engine):自动运行,无需关注,会自动组织所有的请求对象,分发给下载器

  • 下载器(downloader):从引擎处获取到请求对象后,请求数据

  • 爬虫spiders:Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

    • scrapy.Spider 普通的爬虫

    • scrapy.CrawlSpider

      • 可设置规则的爬虫类
      • Rule 规则类
    • 开始的函数

      • start_requests()
  • 调度器(scheduler):有自己的调度规则,无需关注

  • 管道(Item pipeline):

    最终处理数据的管道,会预留接口供我们处理数据
    当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
    每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
    以下是item pipeline的一些典型应用:

    1. 清理HTML数据
    2. 验证爬取的数据(检查item包含某些字段)
    3. 查重(并丢弃)
    4. 将爬取结果保存到数据库中
      1. 清理HTML数据
      1. 验证爬取的数据(检查item包含某些字段)
      1. 查重(并丢弃)
      1. 将爬取结果保存到数据库中
      1. 对图片数据进行下载

5、工作原理

  • 示例图

    image-20201209015249128

    • Scrapy数据流是由执行的核心引擎(engine)控制
  • 流程

    1. 爬虫引擎获得初始请求开始抓取。
    2. 爬虫引擎开始请求调度程序,并准备对下一次的请求进行抓取。
    3. 爬虫调度器返回下一个请求给爬虫引擎。
    4. 引擎请求发送到下载器,通过下载中间件下载网络数据。
    5. 一旦下载器完成页面下载,将下载结果返回给爬虫引擎。
    6. 引擎将下载器的响应通过中间件返回给爬虫进行处理。
    7. 爬虫处理响应,并通过中间件返回处理后的items,以及新的请求给引擎。
    8. 引擎发送处理后的items到项目管道,然后把处理结果返回给调度器,调度器计划处理下一个请求抓取。
    9. 重复该过程(继续步骤1),直到爬取完所有的url请求

6、如何使用

6.1、创建项目

scrapy startproject  项目名称

6.2、目录结构

  • spiders

    • init.py

    • 自定义的爬虫文件.py

      由我们自己创建,是实现爬虫核心功能的文件

      注意,创建文件的路径不要搞错,应当在spiders文件夹内创建自定义的爬虫文件

  • init.py

  • items.py

    定义数据结构的地方,是一个继承自scrapy.Item类, 属性字段的类型是 scrapy.Field()

    注意: scrapy.Item类,实际是一个dict字典, 所以在spider的parse()函数返回的迭代元素应该是dict字典对象,且字典的key与item的Field()相对应

  • middlewares.py

    中间件, 用于调整业务逻辑

  • pipelines.py

    管道文件

    里面只有一个类,用于处理下载数据的后续处理

  • settings.py

    配置文件

    比如:

    是否遵守robots协议

    User-Agent定义等

6.3、创建自定义爬虫文件

  • scrapy genspider 爬虫名字 网页的域名

    scrapy genspider qiubai "www.qiushibaike.com"
    

    注意:终端先跳转到spiders文件夹的路径,再进行创建

    即cd qiubai/qiubai

  • 继承scrapy.Spider类

    新创建的爬虫文件继承自scrapy.Spider类

    • name = 'qiubai' #运行爬虫文件时使用的名字

      • allowed_domains #爬虫允许的域名,在爬取的时候,如果不是此域名之下的url,会被过滤掉

      • start_urls #声明了爬虫的起始地址,可以写多个url,一般是一个

    • parse(self, response)

      解析数据的回调函数

      response保存了下载的数据,可以在此函数内对其进行解析,通常使用xpath

      parse()函数,如果有返回值,必须返回可迭代的对象

      • response 是 scrapy.http.HtmlResponse类对象

      • response的属性

        • response.encoding:字符集,不能直接修改

        • response.text:文本信息

        • response.body:字节数据

        • response.headers:头

        • response.meta:元信息,用于从请求向响应的解析函数中传递参数

        • response.request:响应的哪一个请求对象

        • response.url

      • response.xpath()/css()

        • scrapy.selector.Selector

        • 返回Selector对象

        • 内部写法:self.selector.xpath()

        • css()用法

          • 同css的样式选择器,如id,class或标签等

          • 访问标签内的属性

            • '#page a::attr("href")':获取id为page的a标签的href属性

            • '.list-img a::text':获取class为list-img下的a标签的text文本内容

        • xpath()用法:同lxml的xpath用法,主要是针对的路径

        • 提取数据

          • extract()

            • Selector对象的方法,用于获取Selector对象的内容

            • response.xpath('//title/text()').extract() :返回list

            • response.css('').xpath():先使用css选择标签元素,再通过xpath提取内容

          • extract_first()

            • 提取第一条内容
          • get()

            • 同 extract_first()方法
  • 解析数据回传给engine

    yield item
    
  • 向engine发起新的请求

    yield scrapy.Request(url, callback=,meta=, dont_filter=True)
    
  • 运行程序

    #运行爬虫程序
    scrapy crawl 爬虫名称
    

    注意:应在spiders文件夹内执行

    • 导出文件

      • -o name.json
      • -o name.xml
      • -o name.csv

    eg:

    scrapy crawl dy -o vides.json
    

扩展

爬虫停止条件

  • Scrapy的CloseSpider扩展会在满足条件时自动终止爬虫程序。

  • 可用选项

    • CLOSESPIDER_TIMEOUT(秒)指定时间过后
    • CLOSESPIDER_ITEMCOUNT 抓取了指定数目的Item之后
    • CLOSESPIDER_PAGECOUNT 收到了指定数目的响应之后
    • CLOSESPIDER_ERRORCOUNT 发生了指定数目的错误之后

如:

$ scrapy crawl fast -s CLOSESPIDER_ITEMCOUNT=10
$ scrapy crawl fast -s CLOSESPIDER_PAGECOUNT=10
$ scrapy crawl fast -s CLOSESPIDER_TIMEOUT=10
posted @ 2021-03-31 07:30  昵称已经被使用  阅读(55)  评论(0)    收藏  举报