Scrapy入门
Scrapy简介
Scrapy(/ˈskreɪpaɪ/)是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,例如数据挖掘、信息处理或历史归档。
尽管Scrapy最初是为网络抓取而设计的,但它也可以用于使用 API(例如Amazon Associates Web Services)提取数据或作为通用网络爬虫。
Scrapy安装
Python版本
Scrapy 需要 Python 3.8+,CPython 实现(默认)或 PyPy 实现(请参阅替代实现)。
开始安装
如果您使用的是Anaconda或Miniconda ,您可以从conda-forge频道安装该软件包,该频道包含适用于 Linux、Windows 和 macOS 的最新软件包。
要使用安装Scrapy conda
,请运行:
conda install -c conda-forge scrapy |
或者,如果您已经熟悉 Python 包的安装,则可以使用以下命令从 PyPI 安装 Scrapy 及其依赖项:
pip install Scrapy |
我们强烈建议您将 Scrapy 安装在专用的 virtualenv中,以避免与系统包发生冲突。
请注意,有时这可能需要解决某些 Scrapy 依赖项的编译问题,具体取决于您的操作系统,因此请务必检查 特定于平台的安装说明。
值得了解的事情
Scrapy 是用纯 Python 编写的,依赖于几个关键的 Python 包(其中包括):
- lxml,一个高效的 XML 和 HTML 解析器
- parsel,一个基于 lxml 编写的 HTML/XML 数据提取库,
- w3lib,一个处理 URL 和网页编码的多用途助手
- twisted,一个异步网络框架
- 密码学和pyOpenSSL,应对各种网络级安全需求
Scrapy教程
创建项目
在开始抓取之前,您必须设置一个新的 Scrapy 项目。输入您要存储代码的目录并运行:
scrapy startproject tutorial |
这将创建一个tutorial包含以下内容的目录:
tutorial/ |
我们的第一只蜘蛛
蜘蛛是您定义的类,Scrapy 使用它从一个网站(或一组网站)中抓取信息。他们必须子类化Spider
并定义要发出的初始请求,可选地如何跟踪页面中的链接,以及如何解析下载的页面内容以提取数据。
这是我们第一个 Spider 的代码。将其保存在项目目录quotes_spider.py
下命名的文件中:tutorial/spiders
import scrapy |
正如你所看到的,我们的 Spider 子类化scrapy.Spider 并定义了一些属性和方法:
name:识别蜘蛛。在一个项目内必须是唯一的,即不能为不同的Spider设置相同的名称。
start_requests():必须返回一个可迭代的请求(您可以返回请求列表或编写生成器函数),蜘蛛将开始从中爬行。后续请求将从这些初始请求连续生成。
parse():将调用该方法来处理为每个发出的请求下载的响应。响应参数是TextResponse保存页面内容的实例,并具有进一步有用的方法来处理它。
该parse()方法通常会解析响应,将抓取的数据提取为字典,并查找要遵循的新 URL 并Request从中创建新请求 ( )。
运行我们的蜘蛛
要让我们的蜘蛛正常工作,请转到项目的顶级目录并运行:
scrapy crawl quotes |
Scrapy架构
概述
下图显示了 Scrapy 架构及其组件的概述以及系统内部发生的数据流的轮廓(由红色箭头所示)。下面包含了这些组件的简要描述以及有关它们的更详细信息的链接。下面还描述了数据流。
数据流
Scrapy中的数据流由执行引擎控制,流程如下:
- 引擎从Spider获取初始爬行请求。
- 引擎在调度程序中调度请求并请求下一个要抓取的请求。
- 调度程序将下一个请求返回给引擎。
- 引擎通过 下载器中间件将请求发送到下载器
process_request()
。 - 一旦页面完成下载,下载器就会生成一个响应(包含该页面)并将其发送到引擎,通过下载器中间件,
process_response()
。 - Engine接收来自Downloader的 Response并通过Spider Middleware将其发送到 Spider进行处理,
process_spider_input()
。 - Spider处理 Response 并 通过 Spider Middleware(请参阅 参考资料)将抓取的项和新的Requests (后续)返回给Engine。
process_spider_output()
。 - 引擎将处理后的项目发送到 项目管道,然后将处理后的请求发送到调度程序并请求可能的下一个爬网请求。
- 重复该过程(从步骤 3 开始),直到Scheduler不再发出请求 。
成分
Scrapy引擎
引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。有关更多详细信息,请参阅 上面的数据流部分。
调度程序
调度程序接收来自引擎的请求,并将它们排队以便稍后在引擎请求时将它们提供给它们(也提供给引擎)。
下载器
下载器负责获取网页并将其提供给引擎,而引擎又将它们提供给蜘蛛。
蜘蛛
蜘蛛是由 Scrapy 用户编写的自定义类,用于解析响应并从中提取项目或要遵循的其他请求。有关详细信息,请参阅蜘蛛。
项目管道
项目管道负责在蜘蛛提取(或抓取)项目后对其进行处理。典型的任务包括清理、验证和持久化(例如将项目存储在数据库中)。有关详细信息,请参阅项目管道。
下载器中间件
下载器中间件是位于引擎和下载器之间的特定挂钩,当请求从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应。
如果您需要执行以下操作之一,请使用下载程序中间件:
- 在请求发送到下载器之前处理请求(即在 Scrapy 将请求发送到网站之前);
- 在将收到的响应传递给蜘蛛之前更改它;
- 发送一个新的请求,而不是将收到的响应传递给蜘蛛;
- 将响应传递给蜘蛛而不获取网页;
- 默默地放弃一些请求。
蜘蛛中间件
蜘蛛中间件是位于引擎和蜘蛛之间的特定钩子,能够处理蜘蛛输入(响应)和输出(项目和请求)。
如果需要,请使用 Spider 中间件
- 蜘蛛回调的后处理输出 - 更改/添加/删除请求或项目;
- 后处理start_requests;
- 处理蜘蛛异常;
- 根据响应内容对某些请求调用 errback 而不是回调。
有关详细信息,请参阅Spider 中间件。
事件驱动的网络
Scrapy 是用Twisted编写的,Twisted 是一种流行的 Python 事件驱动网络框架。因此,它是使用非阻塞(又称异步)代码来实现并发性的。