从网页抓取数据(一个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 文件。