从网页抓取数据(一个Scrapy架构Scrapy的整体架构的应用案例)

优采云 发布时间: 2022-02-07 11:00

  从网页抓取数据(一个Scrapy架构Scrapy的整体架构的应用案例)

  Scrapy 是一个应用程序框架,用于抓取 网站 数据并提取结构化数据。它可以用于一系列程序,包括数据挖掘、信息处理或存储历史数据。

  1. Scrapy 架构

  Scrapy 的整体架构由五个组件组成:ScrapyEngine、Scheduler、Downloader、Spiders 和 itemPipeline。图 1 显示了系统中各个组件的交互和数据流。

  

  图 1 Scrapy 架构

  Scrapy 的架构由以下 5 个组件和两个中间件组成。

  

  Scrapy中的数据流由Scrapy引擎控制,整体流程如下。**1)** Scrapy引擎打开一个网站,找到处理网站的爬虫,询问爬虫第一次爬到哪个URL。**2)** Scrapy引擎从爬虫获取第一次要爬取的URL,以Request的形式发送给调度器。**3)** Scrapy 引擎要求调度程序提供下一个要抓取的 URL。**4)** 调度器将下一个要爬取的URL返回给Scrapy引擎,Scrapy引擎通过下载器中间件将该URL转发给下载器。**5)** 下载器下载给定的网页,下载完成后,它生成页面的结果并通过下载器中间件将其发送到 Scrapy 引擎。**6)** Scrapy引擎接收下载器的下载结果,通过爬虫中间件发送给爬虫处理。**7)** 爬虫对结果进行处理,将爬取的数据项和需要跟进的新URL返回给Scrapy引擎。**8)** Scrapy 引擎将爬取的数据项发送到数据项管道,并将爬虫生成的新请求发送给调度程序。**9)** 从步骤 (2) 重复,直到调度程序中没有更多请求并且 Scrapy 引擎关闭该 网站。** Scrapy引擎从下载器接收下载结果,通过爬虫中间件发送给爬虫处理。**7)** 爬虫对结果进行处理,将爬取的数据项和需要跟进的新URL返回给Scrapy引擎。**8)** Scrapy 引擎将爬取的数据项发送到数据项管道,并将爬虫生成的新请求发送给调度程序。**9)** 从步骤 (2) 重复,直到调度程序中没有更多请求并且 Scrapy 引擎关闭该 网站。** Scrapy引擎从下载器接收下载结果,通过爬虫中间件发送给爬虫处理。**7)** 爬虫对结果进行处理,将爬取的数据项和需要跟进的新URL返回给Scrapy引擎。**8)** Scrapy 引擎将爬取的数据项发送到数据项管道,并将爬虫生成的新请求发送给调度程序。**9)** 从步骤 (2) 重复,直到调度程序中没有更多请求并且 Scrapy 引擎关闭该 网站。** Scrapy引擎将爬取的数据项发送到数据项管道,并将爬虫产生的新请求发送给调度器。**9)** 从步骤 (2) 重复,直到调度程序中没有更多请求并且 Scrapy 引擎关闭该 网站。** Scrapy引擎将爬取的数据项发送到数据项管道,并将爬虫产生的新请求发送给调度器。**9)** 从步骤 (2) 重复,直到调度程序中没有更多请求并且 Scrapy 引擎关闭该 网站。

  2. Scrapy 用例

  如果您需要从 网站 获取信息,但 网站 不提供 API 或以编程方式获取信息的机制,则可以使用 Scrapy 来执行此操作。

  本节通过一个具体的应用来说明使用 Scrapy 抓取数据的方法。该应用程序想要获取当当网站出售的所有关于《Python核心编程》和《Python基础教程》的书籍的URL、名称、描述和价格。1)创建一个项目

  在开始抓取之前,必须创建一个新的 Scrapy 项目。转到要存储代码的目录并运行以下命令。

  1scrapy startproject tutorial

2

  此命令将创建一个收录以下内容的教程目录。

  1tutorial/

2 scrapy.cfg

3 tutorial/

4 —init_.py

5 items.py

6 pipelines.py

7 settings.py

8 spiders/

9 _init_.py

10 ...

11

  这些文件如下。

  

  2)定义项目

  在 Scrapy 中,Item 是一个用于存储爬取数据的容器。它的用法类似于 Python 字典,它提供了额外的保护机制来避免由拼写错误导致的未定义字段错误。

  一般来说,Items是用scrapy.item.Item类创建的,属性是用scrapy.item.Field对象定义的。

  如果要从网页中爬取的每本书的内容是标题(Title)、链接(Link)、介绍(Description)和价格(Price),那么根据要爬取的内容,Item的模型可以构建。

  修改教程目录下的 items.py 文件,在原类之后添加一个新类。因为我们要抓取当当网站的内容,所以可以命名为DangItem,定义对应的字段。编辑教程目录中的 items.py 文件。

  1import scrapy

2

3class DangItem(scrapy.Item):

4 title = scrapy.Field()

5 link. = scrapy.Field()

6 dese = scrapy.Field()

7 price = scrapy.Filed()

8

  3)写蜘蛛

  蜘蛛是用户编写的类,它们从单个(或组)网站 中抓取数据。它收录一个用于下载的初始 URL,一个负责跟踪页面中的链接的方法,一个负责分析页面中的内容的方法,以及一个负责提取生成的 Item 的方法。

  创建的Spider必须继承scrapy.Spider类,需要定义以下3个属性。

  下面是我们编写的爬虫代码,保存在tutorial/spiders目录下的dang_spider.py文件中。

  

  4)爬行

  进入项目根目录,执行如下命令启动Spider。

  1scrapy crawl dmoz

2

  此命令将启动蜘蛛进行爬行,系统将产生类似的输出。

  12017-01-23 18:13:07-0400 [scrapy] INFO: Scrapy started (bot: tutorial)

22017-01-23 18:13:07-0400 [scrapy] INFO: Optional features available: ...

32017-01-23 18:13:07-0400 [scrapy] INFO: Overridden settings: {}

42017-01-23 18:13:07-0400 [scrapy] INFO: Enabled extensions: ...

52017-01-23 18:13:07-0400 [scrapy] INFO: Enabled downloader middlewares: ...

62017-01-23 18:13:07-0400 [scrapy] INFO: Enabled spider middlewares: ...

72017-01-23 18:13:07-0400 [scrapy] INFO: Enabled item.pipelines: ...

82017-01-23 18:13:07-0400 [dangdang] INFO: Spider opened

92017-01-23 18:13:08-0400: [dangdang] DEBUG: Crawled (200) (referer: None)

112017-01-23 18:13:08-0400 [dangdang] DEBUG: Crawled (200) (referer: None)

132017-01-23 18:13:09-0400 [dangdang] INFO: Closing spider (finished)

14

  查看收录“当当”的输出,可以看到输出日志中收录了start_urls中定义的初始URL,并且与Spider一一对应。从日志中可以看出,它没有指向其他页面(referer:None)。

  另外,根据parse方法,创建了两个收录URL对应内容的文件,分别是Python核心编程和Python基础教程。

  在执行上述shell命令时,scrapy会创建一个scrapy.http.Request对象,将start_url传给它,抓取后回调parse函数。5)提取物品

  在爬取任务中,一般不只是对网页进行爬取,而是将爬取结果直接转化为结构化数据。基于前面定义的 Item 数据模型,我们可以修改 Parser 并使用 Scmpy 内置的 XPath 解析 HTML 文档。

  通过观察当当网页的源码,我们发现书籍的信息收录在第二个<ul>元素中,相关书籍以列表的形式展示。所以,我们可以使用下面的代码来选择本页图书列表中的所有图书

  

  添加 json 选项以将结果保存为 JSON 格式,并执行以下命令启动 Scrapy。

  1scrapy crawl dangdang -o items.json

2

  此命名会将抓取到的数据序列化为 JSON 格式,并生成 items.json 文件。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线