Scrapy快速入门系列(1) | 一文带你快速了解Scrapy框架(版本2.3.0)

  你们好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是但愿本身性情温和。做为一名互联网行业的小白,博主写博客一方面是为了记录本身的学习过程,另外一方面是总结本身所犯的错误但愿可以帮助到不少和本身同样处于起步阶段的萌新。但因为水平有限,博客中不免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/
1
官网地址:https://scrapy.org/css

  本文主要讲的是一文带你快速了解Scrapy框架(版本2.3.0)html


2


一. Scrapy的简单介绍

若是想要详细的查看Scrapy的相关内容能够自行查看官方文档。
文档地址以下:https://docs.scrapy.org/en/latest/intro/overview.html#walk-through-of-an-example-spiderpython

1.1 什么是Scrapy?

  Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途普遍,能够用于数据挖掘、监测和自动化测试。web

  Scrapy吸引人的地方在于它是一个框架,任何人均可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。json

1.2 基本功能

  Scrapy是一个用于爬网网站并提取结构化数据的应用程序框架,可用于各类有用的应用程序,例如数据挖掘,信息处理或历史档案。网络

  尽管Scrapy本来是设计用来屏幕抓取(更精确的说,是网络抓取),但它也能够用来访问API来提取数据。架构

二. 示例展现


此部分来源于官方框架


为了可以展现出Scrapy带来的好处,博主将使用最简单的运行Spider的方式向您介绍Scrapy Spider的示例。scrapy

2.1 官方案例

import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
    	# 所要爬取的真实网址
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
    	# 使用CSS选择器遍历quote元素,生成包含提取的报价文本和做者的Python dict,查找指向下一页的连接
        for quote in response.css('div.quote'):
            yield { 
 
  
            	# 经过xpath的方式解析并获取出做者的名字
                'author': quote.xpath('span/small/text()').get(),
                'text': quote.css('span.text::text').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        # 判断 若是下一页不为空,继续进行爬取操做
        if next_page is not None:
            yield response.follow(next_page, self.parse)
  • 2. 将其放在文本文件中,命名为相似名称,quotes_spider.py 而后使用如下runspider命令运行Spider
scrapy runspider quotes_spider.py -o quotes.json
  • 3. 完成此操做后,您将在quotes.json文件中包含JSON格式的引号列表,其中包含文本和做者,以下所示(此处从新格式化以提升可读性)
[{ 
 
  
    "author": "Jane Austen",
    "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{ 
 
  
    "author": "Groucho Marx",
    "text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d"
},
{ 
 
  
    "author": "Steve Martin",
    "text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]

2.2 简单解析

  • 1. 查看标签为humor的界面结构
    3
  • 2. F12(开发者选项)后查看重要标签点

① 整体ide

4
② 文本

5
③ 做者
6
④ 翻页7

  • 3. 解析上述所看到的标签(都在源码中进行注释了)

须要提早知道的一些小知识:在使用构造器的时候,使用XPath和CSS查询响应很是广泛,他们两个的快捷键分别为:response.xpath()response.css()

  • 1.使用CSS选择器遍历quote元素,生成包含文本和做者的Python dict,查找指向下一页的连接
  • 2.再分别经过span/small/text()span.text::text获得做者与其本人所发表的文本内容
  • 3.最后经过li.next a::attr("href")获取翻页后的内容而且作出判断若是不存在,则自动中止爬取。

三. Scrapy架构概述

3.1 Scrapy架构的总体流程

下图显示了Scrapy体系结构及其组件的概述,以及系统内部发生的数据流的概况(由红色箭头显示)。下面包括对这些组件的简要说明,以及有关它们的更多详细信息的连接。数据流也在下面描述。
8
Scrapy中的数据流由执行引擎控制,以下所示:

  • 官方原始
    9

  • 博主本人翻译以下

  • 1.Scrapy Engine(引擎)从Spider中获取最初的爬取请求。

  • 2.在Scrapy Engine(引擎)获取到来自于Spider的请求以后,会请求Scheduler(调度器)并告诉他下一个执行请求。

  • 3.Scheduler(调度器)获得信息并把下一个请求返回给Engine。

  • 4.经过Downloader Middlewares(下载器中间件),Scrapy Engine(引擎)把请求发送到Downloader(下载器)。

  • 5.页面下载完成后, Downloader(下载器)会经过Downloader Middlewares(下载器中间件),生成一个带有该页面的Response(响应),并将其发送到Engine。

  • 6.经过Spider Middleware(Spider中间件),Scrapy Engine(引擎)接收到来自于 Downloader(下载器)的响应并将其发送到Spider进行处理。

  • 7.经过Spider Middleware(Spider中间件),Spider处理和响应来自于Scrapy Engine(引擎)的项目和新的需求。

  • 8.Scrapy Engine(引擎)经过Item Pipelines(管道)发送处理的项目,而后把处理的请求返回到Scheduler(调度器),并要求从此可能请求爬行。

  • 9.重复上述过程,直到再也不有Scheduler(调度器)的请求为止。

3.2 Scrapy框架的简单介绍

Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通信,信号、数据传递等。

Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照必定的方式进行整理排列,入队,当引擎须要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的全部Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。

Spider(爬虫):它负责处理全部Responses,从中分析提取数据,获取Item字段须要的数据,并将须要跟进的URL提交给引擎,再次进入Scheduler(调度器)。

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。

Downloader Middlewares(下载中间件):下载器中间件是位于引擎和下载器之间的特定挂钩,它们在从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应。

若是须要执行如下操做之一,请使用Downloader中间件:

  • 在将请求发送到下载器以前处理请求(即,在Scrapy将请求发送到网站以前);
  • 在将接收到的响应传递给爬虫以前,先对其进行更改;
  • 发送新的请求,而不是将收到的响应传递给爬虫;
  • 将响应传递给蜘蛛,而无需获取网页;
  • 默默地丢弃一些请求。

Spider Middlewares(Spider中间件):一个能够自定扩展和操做引擎和Spider中间通讯的功能组件。其是位于引擎和爬虫之间的特定挂钩,而且可以处理爬虫的输入(响应)和输出(项目和请求)。

若是须要,请使用Spider中间件

  • 爬虫回调的后处理输出-更改/添加/删除请求或项目;
  • 而后处理start_requests;
  • 处理爬虫异常;
  • 根据响应内容,对某些请求调用errback而不是回调。

  本次的分享就到这里了,


12

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持经过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证实我在努力。
  若是个人博客对你有帮助、若是你喜欢个人博客内容,请“点赞” “评论”“收藏”一键三连哦!据说点赞的人运气不会太差,每一天都会元气满满呦!若是实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,你们的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

13
14