---
description: Python | Beautiful Soup | Requests
---

# 使用Beautiful Soup和Requests爬网

通过一个项目使用Beautiful Soup和Requests库。

Web抓取是一种从不同网站抓取数据的技术。 该数据可以采用文本，链接，表格和图像的形式。 尽管从网站上抓取任何私人数据是非法的，但我们仍然可以抓取所有公开可用的数据，并且可以在我们的项目中使用它们。 公开数据是一种公开的数据，供所有人使用，例如，参见电子商店中可用的图书清单。 私有数据是公司用户私有的数据，例如登录凭据，购物车详细信息。

在某些情况下，当我们需要比较不同网站上不同产品的价格，或者我们需要了解来自不同网站或特定网站的产品评论时，Web抓取可能会非常有用。

我们将在总共5节中全面介绍Web爬网。

1. 安装与理解
2. Find vs Find\_all vs Select
3. 从网上抓取链接，表格和图像
4. 分页和文件交互
5. 项目

### 安装与理解

在Python中，我们有许多库和程序包可用于执行Web抓取，但是最简单，最简单的库是Beautiful Soup。

Beautiful Soup是用于解析HTML和XML文档的Python软件包。 它为不同的解析页面创建了一个解析树，可用于从Source（HTML）提取数据，这对于Web抓取非常有用。 它适用于python 2和3。Beautiful Soup使用请求模块将连接请求发送到目标服务器。

Requests是一个Python HTTP库，根据Apache License 2.0发布。 它也是python中安装最多的软件包。 该库的目标是使HTTP请求更简单，更人性化。 使用单行代码，我们可以在python脚本和目标服务器之间建立连接。

首先，安装所有需要进行网络抓取的库。 首先，您需要从python.org安装最新版本的python。 现在打开终端并创建一个文件夹并命名为任何名称，但是如果要遵循相同的名称，只需将其命名为Bs4。 现在，在文件夹Bs4中，我们将创建一个虚拟环境，以便可以在其中安装所有软件包。 输入，

在终端。 这里的env是环境名称。 现在您需要激活环境，只需在终端中键入env \ scripts \ activate即可激活您的环境。 现在，您需要安装软件包，只需使用pip并安装所有软件包即可。

只是为了检查，键入python，然后导入请求（如果一切顺利），那么您将不会看到任何错误。

### 网页结构

HTML代表超文本标记语言。HTML用于设计网页的结构。 它包含几个标签，页面的整个内容都驻留在其中。 在HTML中，有不同的标签可以完成不同的工作。 对于图片，有一个IMG标签，对于标题，有标题标签（h1-h6）等。 我们还可以通过将一个标签放在另一个标签中来在HTML中执行标签的嵌套。 HTML中的每个标记都有一个唯一的ID或一个称为CSS选择器的类。 使用这些CSS选择器，我们执行抓取。 让我们看一个简单的HTML网页的示例。

在上面的HTML代码中，我们可以看到整个代码分为两个主要标签head和body。 在head标签中，我们具有meta标签，标题以及指向不同文件和API的链接。 在我们的正文标签中，我们具有标题标签，段落标签，图像标签，链接和div标签。 div标签就像一个容器，我们可以在其中存储任何内容。 在第二个div标签中，我们还有一个唯一的ID和一个类名。 使用这些类名和ID，我们将从网页上抓取数据。

#### 工作原理

同样如上图所示，首先，我们向服务器发送Http连接请求，然后服务器以响应方式回复给我们。 如果响应为<200>，则说明我们已经成功实现了机器与Web服务器之间的连接。 下一步是使用Beautiful Soup库从服务器获取源代码。 为此，我们再次向服务器发送请求，然后服务器用源代码回复给我们。 然后，使用Beautiful Soup Library中的一些函数，取出所需的所有内容。

下面的代码说明了如何将请求发送到服务器，以及如何返回响应。

现在，让我们尝试使用BeautifulSoup库获取网页的源代码。

### Find vs Find\_all vs Select

使用CSS选择器，使用Find，Find\_all以及Select这三个选项从源代码中获取内容。 让我们一个接一个地看。

#### Find

它查找元素或选择器的第一个匹配项。 它主要用于从网页中获取标题，标题和产品名称。 让我们通过一个例子来更多地了解它。 在下面，我们提供了网页的源代码。

在上面的使用find的源代码中，如果我们做soup.find（'div'），则结果输出包含第一个div，其ID为main-div。 如果我们做soup.find（'h1'）也是一样，它将返回id为secondary-div的div内的第一个h1。 要从结果输出中获取文本，我们使用.text。 要获取Python文本，我们需要运行soup.find（'h1'）.text

我们还可以使用CSS选择器（例如class和id）从网页中获取内容。 如果需要使用find获取文本网页抓取，则需要使用选择器soup.find（'h1'，{'id'：'second-h1'}）.text。 让我们看一下它在一个真实示例中的工作。

#### Find\_all

它查找所有出现的元素或选择器。 它主要用于从网页上的表格，产品评论，详细信息和列出的产品中抓取数据。 让我们通过上面看到的相同示例进一步了解它。

在上面的使用Find\_all的源代码中，如果我们做soup.find\_all（'div'），那么它将返回我们源代码中存在的所有div。 如果我们做soup.find\_all（'h1'）同样，那么它将返回我们所有的h1标签。 需要记住的一件事是，它总是以列表格式返回输出，因此，如果我们要获取文本，则需要使用索引，然后使用for循环将其应用于列表中的每个元素。 让我们在一个真实的示例中进行查看。

#### Select

它直接以列表形式选择元素或选择器。 它同时使用CSS选择器和标签选择器。 它比Find和Find\_all功能更强大。 它还以列表形式返回输出。 要从列表中选择任何内容，我们只需要在选择中传递类名或ID或标记即可将其选中。 让我们通过与上述相同的HTML代码来进一步了解它。

如果要选择所有div，则使用select，而不是只需要将div作为参数传递，并且所有div都将被选中汤。select（'div'）。 现在，如果您想选择文本Python，那么我们只需要使用CSS选择器ID并使用get\_text（）函数soup.select（'＃first-h1'）。get\_text（）即可。 对于id，我们需要使用＃；对于class，我们需要使用。 和我们在CSS中所做的一样。 让我们尝试在实际示例中使用它。

### 从网上抓取链接，表格和图像

让我们首先实例化我们的环境，然后导入所有库并从服务器获取源代码。

#### 链接

每当我们试图从网站上获取产品的详细信息时，抓取链接都是非常有用且方便的。 在HTML中，所有链接都位于锚标记href属性内。 要抓取链接，我们首先需要抓取锚标记，然后使用attribute属性我们可以抓取链接。

要从网页中删除所有链接，我们可以使用find\_all或select两者，然后查找所有的anchor（a）标记。

输出将是网页上所有可用的链接。

要从特定选择器中删除链接，我们只需要选择该选择器，然后我们就可以轻松获取属性href的值

#### 表

抓表是最常用的网页抓取方式。 每当我们为数据科学或机器学习项目创建数据集时，我们都需要从第三方资源中获取数据。 通常，要从表中抓取数据，我们首先需要抓取表标签，然后再抓取表的主体和表头。 我们可以在网上找到很多类型的表，并且执行网络抓取和抓取数据对于每个表都是不同的。 在下面，我们将看到三种类型的表，并了解如何从它们中抓取数据。

1. 具有适当主题和表体的表：首先，获取表，然后获取表头，然后将其与表体连接起来。 我们还将表数据保存到CSV文件中。
2. 不带主题的表：这种情况比以前简单得多，因为在这种情况下，我们只需要抓一下表体即可。 要抓取表格主体，首先要从主体中抓取所有tr，然后在每个tr中抓取所有td并将它们附加在列表中。
3. 多个标题和行，其中有一个空行

#### 图像

当我们为深度学习模型准备数据集时，抓取图像会非常方便。 这也非常艰巨，对于每个网站，其过程都会有所不同。 在此文中，我向您展示如何从快门库存中抓取图像。 要抓取图像，我们首先需要获取img标签，然后需要从该标签获取src属性，最后，我们使用request模块将图像保存为png或jpg格式。

### 分页和与文件的交互

### 项目

### 本文及附加项目完整代码

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
