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.cfg # deploy configuration file

tutorial/ # project's Python module, you'll import your code from here
__init__.py

items.py # project items definition file

middlewares.py # project middlewares file

pipelines.py # project pipelines file

settings.py # project settings file

spiders/ # a directory where you'll later put your spiders
__init__.py

我们的第一只蜘蛛

蜘蛛是您定义的类,Scrapy 使用它从一个网站(或一组网站)中抓取信息。他们必须子类化Spider并定义要发出的初始请求,可选地如何跟踪页面中的链接,以及如何解析下载的页面内容以提取数据。

这是我们第一个 Spider 的代码。将其保存在项目目录quotes_spider.py下命名的文件中:tutorial/spiders

import scrapy
from pathlib import Path


class QuotesSpider(scrapy.Spider):
name = "quotes"

def start_requests(self):
urls = [
"https://quotes.toscrape.com/page/1/",
"https://quotes.toscrape.com/page/2/",
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
page = response.url.split("/")[-2]
filename = f"quotes-{page}.html"
Path(filename).write_bytes(response.body)
self.log(f"Saved file {filename}")

正如你所看到的,我们的 Spider 子类化scrapy.Spider 并定义了一些属性和方法:

  • name:识别蜘蛛。在一个项目内必须是唯一的,即不能为不同的Spider设置相同的名称。

  • start_requests():必须返回一个可迭代的请求(您可以返回请求列表或编写生成器函数),蜘蛛将开始从中爬行。后续请求将从这些初始请求连续生成。

  • parse():将调用该方法来处理为每个发出的请求下载的响应。响应参数是TextResponse保存页面内容的实例,并具有进一步有用的方法来处理它。
    该parse()方法通常会解析响应,将抓取的数据提取为字典,并查找要遵循的新 URL 并Request从中创建新请求 ( )。

运行我们的蜘蛛

要让我们的蜘蛛正常工作,请转到项目的顶级目录并运行:

scrapy crawl quotes

Scrapy架构

概述

下图显示了 Scrapy 架构及其组件的概述以及系统内部发生的数据流的轮廓(由红色箭头所示)。下面包含了这些组件的简要描述以及有关它们的更详细信息的链接。下面还描述了数据流。
image

数据流

Scrapy中的数据流由执行引擎控制,流程如下:

  1. 引擎从Spider获取初始爬行请求。
  2. 引擎在调度程序中调度请求并请求下一个要抓取的请求。
  3. 调度程序将下一个请求返回给引擎。
  4. 引擎通过 下载器中间件将请求发送到下载器process_request()
  5. 一旦页面完成下载,下载器就会生成一个响应(包含该页面)并将其发送到引擎,通过下载器中间件,process_response()
  6. Engine接收来自Downloader的 Response并通过Spider Middleware将其发送到 Spider进行处理,process_spider_input()
  7. Spider处理 Response 并 通过 Spider Middleware(请参阅 参考资料)将抓取的项和新的Requests (后续)返回给Engine。process_spider_output()
  8. 引擎将处理后的项目发送到 项目管道,然后将处理后的请求发送到调度程序并请求可能的下一个爬网请求。
  9. 重复该过程(从步骤 3 开始),直到Scheduler不再发出请求 。

成分

Scrapy引擎

引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。有关更多详细信息,请参阅 上面的数据流部分。

调度程序

调度程序接收来自引擎的请求,并将它们排队以便稍后在引擎请求时将它们提供给它们(也提供给引擎)。

下载器

下载器负责获取网页并将其提供给引擎,而引擎又将它们提供给蜘蛛。

蜘蛛

蜘蛛是由 Scrapy 用户编写的自定义类,用于解析响应并从中提取项目或要遵循的其他请求。有关详细信息,请参阅蜘蛛。

项目管道

项目管道负责在蜘蛛提取(或抓取)项目后对其进行处理。典型的任务包括清理、验证和持久化(例如将项目存储在数据库中)。有关详细信息,请参阅项目管道。

下载器中间件

下载器中间件是位于引擎和下载器之间的特定挂钩,当请求从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应。

如果您需要执行以下操作之一,请使用下载程序中间件:

  • 在请求发送到下载器之前处理请求(即在 Scrapy 将请求发送到网站之前);
  • 在将收到的响应传递给蜘蛛之前更改它;
  • 发送一个新的请求,而不是将收到的响应传递给蜘蛛;
  • 将响应传递给蜘蛛而不获取网页;
  • 默默地放弃一些请求。

蜘蛛中间件

蜘蛛中间件是位于引擎和蜘蛛之间的特定钩子,能够处理蜘蛛输入(响应)和输出(项目和请求)。

如果需要,请使用 Spider 中间件

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

有关详细信息,请参阅Spider 中间件。

事件驱动的网络

Scrapy 是用Twisted编写的,Twisted 是一种流行的 Python 事件驱动网络框架。因此,它是使用非阻塞(又称异步)代码来实现并发性的。