在在线房产列表的世界中,对于那些希望利用这个提供广泛住宿地点的流行平台的人来说,使用 Rust 抓取 Airbnb 房产列表是一项基本技能。 无论您是计划旅行还是有兴趣了解房地产市场,抓取 Airbnb 房源信息都可以提供宝贵的见解。 本指南将探讨如何使用 Rust(一种强大的编程语言)抓取 Airbnb 列表。 为了使我们的抓取之旅更加顺利,我们将使用 Crawlbase 爬取 API,我们过去成功使用过的工具。

在接下来的部分中,我们将引导您在计算机上设置 Rust,向您介绍 Crawlbase API,并指导您逐步抓取 Airbnb 房产列表。 从浏览 Airbnb 的搜索页面到保存抓取的数据,我们都一一涵盖。 加入我们的冒险之旅,我们将 Rust 的优势与 Crawlbase 的数据提取相结合,揭示隐藏在 Airbnb 大量房产列表中的信息。 让我们开始吧!

目录

  1. 使用 Rust 中的 Crawlbase 抓取 API 抓取 Airbnb 列表
  • 为什么要抓取 Airbnb 的房产列表?
  • 将 Crawlbase 爬行 API 与 Rust 结合使用的好处
  1. 设置您的环境
  • 安装 Rust 编程语言
  • 创建一个新的 Rust 项目
  • 选择正确的集成开发环境 (IDE)
  • 获取 Crawlbase 爬网 API 的 API 凭据
  1. 了解 Airbnb 的网站结构
  • 探索 Airbnb 搜索页面的组成部分
  • 识别抓取的关键要素
  1. Crawlbase爬取API简介
  • Crawlbase 抓取 API 概述
  • 利用 Crawling API 的优势和功能
  • Crawlbase 使用 Rust 抓取 API
  1. 抓取 Airbnb 房产列表
  • 抓取 Airbnb 搜索页面 HTML
  • 检查 HTML 以获取 CSS 选择器
  • 从 HTML 中检索属性列表数据
  1. 存储抓取的数据
  • 将抓取的数据存储在 CSV 文件中
  • 将抓取的数据存储在 SQLite 数据库中
  1. 总结
  2. 常见问题解答(FAQ)

使用 Rust 中的 Crawlbase 抓取 API 抓取 Airbnb 列表

涉足抓取领域 Airbnb的 使用 Rust 和 Crawlbase API 的列表为数据爱好者和研究人员提供了大量机会。 这一努力让我们能够详细探索 Airbnb 数据的内部运作方式,为发现有价值的见解提供途径。 现在,让我们研究一下抓取 Airbnb 列表,并发现使用 Crawlbase Crawling API 和 Rust 的好处。

为什么要抓取 Airbnb 的房产列表?

搜刮 Airbnb 的必要性源于多个因素,每个因素都有助于更全面地了解该平台的房地产动态:

  • 数据丰富:Airbnb 拥有大量的房产列表,因此抓取对于全面提取各种数据至关重要。
  • 细粒度洞察:对于寻求具体细节或进行深入市场分析的用户来说,抓取提供了一种系统的方法来提取目标信息,增强对房地产属性和市场动态的洞察。
  • 市场调查:抓取 Airbnb 列表有助于对房地产市场进行细致入微的探索,有助于识别趋势、价格波动和不同地点的热门设施。
  • 定制查询:通过抓取,用户可以定制查询以提取精确的信息,无论是关于房产类型、便利设施还是定价策略。 这种定制确保根据特定研究需求提取相关且有针对性的数据。

将 Crawlbase 爬网 API 与 Rust 结合使用的好处

将 Crawlbase 爬网 API 与 Rust 结合使用的好处
  • 卓越表现:Rust 在性能、安全性和低级控制方面的声誉与网络抓取的需求完美契合。
  • 效率提升:Rust 处理低级系统细节的能力补充了网络抓取的复杂性,从而形成高效可靠的流程。
  • 无缝集成:Rust 与 Crawling API 的结合简化了复杂的抓取场景,轻松提取动态 Web 内容。
  • 流畅导航:Crawlbase 处理动态网页内容的能力可确保无缝抓取体验,这对于浏览 Airbnb 的多样化动态页面尤其重要。
  • 避免检测: 爬行基地 轮换IP地址 反爬虫措施增强了抓取过程的可靠性,降低了被阻止或面临验证码挑战的风险。

随着我们的进展,我们将指导您完成 Rust 环境的设置,并说明如何利用 Crawlbase API 的功能来获得最佳抓取结果。

设置您的环境

在深入研究使用 Rust 和 Crawlbase Crawling API 抓取 Airbnb 房产列表的复杂性之前,准备环境是至关重要的一步。 这种全面的设置包括安装必要的工具、选择适当的集成开发环境 (IDE) 以及获取必要的 API 凭据。 让我们分解每个组件以确保顺利高效的开发过程。

安装 Rust 编程语言

安装 Rust 和配置依赖项是设置环境以使用 Rust 和 Crawlbase Crawling API 抓取 Airbnb 房产列表的关键步骤。 对于 Windows 和 Ubuntu 操作系统,请遵循以下详细说明。

在 Windows 上安装 Rust:

  • 访问 Rust 官方网站: https://www.rust-lang.org/tools/install.
  • 单击“下载 Rust”按钮。
  • 运行下载的可执行文件。
  • 按照屏幕上的说明进行安装,确保在安装过程中选择将 Rust 添加到系统路径的选项。

在 Ubuntu 上安装 Rust:

  • 打开终端窗口。
  • 运行以下命令下载并运行 Rust 安装程序:
1
卷曲——原型 '=https' --tlsv1.3 https://sh.rustup.rs -sSf | --tlsvXNUMX https://sh.rustup.rs -sSf | 嘘
  • 按照屏幕上的说明完成 Rust 安装。 确保选择将 Rust 添加到系统路径的选项。

创建一个新的 Rust 项目

在我们深入研究 Rust 的网页抓取之前,让我们建立一个新的 Rust 项目来维护有组织的代码。 按照以下步骤创建一个项目目录和一个简单的“Hello, world!” 使用 Rust 的包管理器 Cargo 的 Rust 程序。

创建项目目录

首先创建一个目录来存储 Rust 代码。 为了更好地组织,我们建议在您的主目录中创建一个项目目录。

对于 Linux、macOS 和 Windows 上的 Power-Shell:

1
2
3
4
$ MKDIR 〜/项目
$ cd 〜/项目
$ 货物新 my_airbnb_scraper
$ cd my_airbnb_scraper

对于 Windows CMD:

1
2
3
4
> MKDIR “%USERPROFILE%\项目”
> cd /d “%USERPROFILE%\项目”
> 货物新 my_airbnb_scraper
> cd my_airbnb_scraper

项目结构

当您使用 cargo new,Cargo 为您初始化一个新的 Rust 项目。 它创建了一个 Cargo.toml 文件,这是您的项目的配置文件,以及 src 目录包含 main.rs Rust 代码所在的文件。

1
2
3
4
my_airbnb_scraper
|-- Cargo.toml
`-- 源代码
`--main.rs

编写并运行 Rust 程序

打开 main.rs 文件中 src 目录并将其内容替换为以下代码:

1
2
3
4
5
// 文件名:main.rs

fn (){
打印!(“你好,世界!”);
}

保存文件并返回到终端窗口 ~/projects/my_airbnb_scraper 目录。 使用以下命令编译并运行该文件:

对于 Linux、macOS 或 Windows CMD:

1
货物运行

无论您使用哪种操作系统,您都应该看到输出“Hello, world!” 打印到终端。 恭喜! 您刚刚编写并执行了您的第一个 Rust 程序,标志着您进入了 Rust 编程的世界。 欢迎!

安装所需的依赖项:

  • 在项目目录中打开命令提示符或终端窗口。
  • 使用以下命令添加网页抓取所需的 Rust 库(板条箱):
1
2
3
4
5
6
货物添加要求
货物加刮板
货物添加urlencoding
货物添加 csv
货物添加塞尔德
货物添加rusqlite
  1. 请求西:一个流行的 Rust HTTP 客户端库,可简化 HTTP 请求。 它通常用于网络抓取和与网络 API 交互。
  2. 刮刀:一个 Rust 板条箱 HTML 和 XML 解析 它提供了一种使用选择器导航和操作结构化文档的便捷方法,类似于 JavaScript 中的 jQuery。
  3. urlencoding:用于 URL 编码和解码的 Rust 箱。 它有助于 URL 组件的操作,确保在 HTTP 请求或需要对 URL 进行编码的其他上下文中使用正确的格式。
  4. CSV:此 Rust 箱用于读取和写入 CSV(逗号分隔值)文件。 它提供将 CSV 数据解析为结构化记录并将结构化记录转换回 CSV 格式的功能。 这 csv 当您想要存储或检索表格数据时,crate 是必不可少的,这使得它对于保存抓取的信息特别有用。
  5. 塞尔德:Rust 的多功能序列化和反序列化框架。 这 serde crate 允许您将 Rust 数据结构无缝转换为各种格式,例如 JSON 或二进制,反之亦然。 当您需要以序列化格式持久存储或传输数据(网络抓取场景中的常见要求)时,包含它非常重要。
  6. 鲁斯克莱特:本 rusqlite crate 是一个用于与 SQLite 数据库交互的 Rust 库。 它提供了一个方便、安全的接口来执行 SQL 操作,允许 Rust 程序有效地连接到 SQLite 数据库、执行查询和管理事务。

Cargo.toml 文件预览:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[包裹]
姓名 = “my_airbnb_scraper”
版本 = “0.1.0”
= “2021”

# 查看更多键及其定义:https://doc.rust-lang.org/cargo/reference/manifest.html

[依赖项]
CSV = “1.3.0”
请求西 = { 版本 = “0.11.22”,特征 = [“封锁”]}
鲁斯克莱特 = “0.30.0”
刮刀 = “0.18.1”
塞尔德 = { 版本 = “1.0.193”,特征 = [“派生”]}
urlencoding = “2.1.3”

这些步骤可确保您在系统上安装 Rust 以及有效网络抓取所需的包。

选择正确的集成开发环境 (IDE)

选择正确的集成开发环境 (IDE) 是一个至关重要的决定,它可以显着影响您使用 Rust 进行网页抓取时的开发体验。 以下是您可以考虑的一些流行 IDE:

Visual Studio 代码(VS 代码):

  • 您的网站: https://code.visualstudio.com/
  • 描述:VS Code 是 Microsoft 开发的免费开源代码编辑器。 它提供了广泛的扩展,使其适用于各种编程任务,包括 Rust 中的网页抓取。
  • 特征:
    • 用于代码完成的 IntelliSense。
    • 内置 Git 支持。
    • Rust 编程的扩展。

带有 Rust 插件的 IntelliJ IDEA:

  • 您的网站: https://www.jetbrains.com/idea/
  • 描述:IntelliJ IDEA 是一款功能强大的 IDE,带有 Rust 插件,可为 Rust 开发提供出色的支持。 虽然 IntelliJ IDEA 不是免费的,但它提供了具有基本功能的免费社区版。
  • 特征:
    • 智能代码完成。
    • 高级导航和重构。
    • 内置终端。

带有 RustDT 插件的 Eclipse:

  • 您的网站: https://www.eclipse.org/
  • 描述:Eclipse 是一个广泛使用的 IDE,RustDT 插件增强了其 Rust 开发的能力。 它是一个开源选项,适合熟悉 Eclipse 的开发人员。
  • 特征:
    • Rust 项目管理。
    • 语法突出显示和代码完成。
    • 集成调试器。

Rust 分析仪(独立):

  • 您的网站: https://rust-analyzer.github.io/
  • 描述:Rust Analyzer 不是传统的 IDE,而是与各种代码编辑器配合使用的语言服务器。 它提供了代码完成、查找引用等功能。
  • 特征:
    • 轻巧快速。
    • 可与 VS Code、Sublime Text 等编辑器配合使用。

尝试几个选项,看看哪一个最符合您的偏好和开发需求。 这里提到的每个 IDE 都有其优点,因此请选择适合您的 Rust 网络抓取项目的一个。

获取 Crawlbase 爬网 API 的 API 凭据

为了使我们的网络抓取项目取得成功,我们将利用 Crawlbase 抓取 API 的强大功能。 该 API 旨在高效处理复杂的网络抓取场景,例如 Airbnb 价格。 它简化了对 Web 内容的访问,同时绕过了 JavaScript 渲染、验证码和反抓取措施等常见挑战。

以下是如何开始使用 Crawlbase 抓取 API:

  1. 访问 Crawlbase 网站:打开您的网络浏览器并导航至 Crawlbase 注册页面 开始注册过程。
  2. 提供您的详细信息:系统会要求您提供电子邮件地址并为您的 Crawlbase 帐户创建密码。 填写所需信息。
  3. 企业验证:提交详细信息后,您可能需要验证您的电子邮件地址。 检查您的收件箱中是否有来自 Crawlbase 的验证电子邮件,然后按照提供的说明进行操作。
  4. 登录 :验证您的帐户后,返回 Crawlbase 网站并使用您新创建的凭据登录。
  5. 访问您的 API 令牌:您需要 API 令牌才能使用 Crawlbase 爬网 API。 您可以在 Crawlbase 仪表板上找到您的 API 令牌。

备注:Crawlbase 提供两种类型的令牌,一种用于静态网站,另一种用于动态或 JavaScript 驱动的网站。 由于我们正在抓取 Airbnb,它依赖 JavaScript 进行动态内容加载,因此我们将选择 JavaScript 令牌。 Crawlbase 慷慨地为 Crawling API 提供 1,000 个免费请求的初始限额,使其成为我们网络抓取项目的绝佳选择。

现在我们已经建立了我们的环境,我们准备好深入了解 Airbnb 的网站结构,并有效地使用 Crawlbase 抓取 API 来进行网络抓取工作。

了解 Airbnb 的网站结构

揭开 Airbnb 网站架构的秘密就像在踏上旅程之前使用地图一样。 在本节中,我们将揭开 Airbnb 搜索页面的复杂组成部分,阐明构成有效抓取策略基石的关键元素。

探索 Airbnb 搜索页面的组成部分

爱彼迎搜索页面
  1. 搜索栏:

搜索栏是用户浏览 Airbnb 众多产品的数字指南针。 它不仅仅是一个视觉元素; 这是一个交互式网关。 通过检查此栏后面的 HTML,我们可以深入了解 Airbnb 如何以编程方式构建搜索查询。

  1. 搜索结果:

当用户点击“搜索”时,页面就会显示一系列的房产结果。 每个列表都位于特定的 HTML 结构中。 掌握这些容器元素的细微差别对于系统地隔离和提取单个属性详细信息至关重要。

  1. 筛选:

Airbnb 为用户提供过滤器,允许对结果进行微调。 必须识别与这些过滤器相对应的 HTML 元素。 识别这些标记可以根据价格范围、房产类型和便利设施等标准进行精确的抓取。

  1. 分页:

当结果宝库跨越多个页面时,分页就出现了。 了解 Airbnb 如何在 HTML 结构中实现分页类似于解读地图的转折点。 它为通过各种结果页面进行系统探索铺平了道路。

确定抓取的关键要素

在寻找 Airbnb 房产数据的过程中,精确定位正确的 HTML 元素是成功的指南针:

  1. 房产清单容器:

在广阔的 HTML 领域中,找到容纳各个属性列表的容器是起点。 这个容器成为迭代的焦点,一个等待打开细节的宝箱。

  1. 房源详细信息:

每个列表容器都隐藏着宝贵的信息——房产名称、价格、位置和便利设施。 要揭示这些细节,精确度至关重要。 制作 CSS选择器 无论呈现的变化如何,手术精度都可以确保提取相关细节。

  1. 分页控件:

对于跨多个页面的冒险,了解管理分页的 HTML 控件至关重要。 识别到下一页和上一页的链接使抓取工具能够无缝遍历 Airbnb 的广泛房产列表。

现在我们已经有了 Airbnb 网站的详细地图,下一步是使用 Rust 和 Crawlbase 爬行 API 来探索和收集这个数字空间的信息。

Crawlbase爬取API简介

踏上抓取 Airbnb 价格数据的旅程,我们找到了一个重要的盟友——Crawlbase Crawling API。 在本节中,我们将概述这一不可或缺的工具,概述其在 Airbnb 抓取领域的优势和功能。 此外,我们将指导您利用 Crawlbase Python 库的强大功能来获得无缝的抓取体验。

Crawlbase爬取API概述

Crawlbase 抓取 API 是一种多功能解决方案,专为应对复杂的网页抓取而量身定制,特别是在 Airbnb 等动态内容需要熟练处理的场景中。 该 API 改变了游戏规则,简化了对 Web 内容的访问、渲染 JavaScript 以及呈现可供解析的 HTML 内容。

利用 Crawling API 的优势和功能

利用 Crawlbase 抓取 API 抓取 Airbnb 具有以下几个优点:

  1. JavaScript渲染:许多网站(包括 Airbnb)严重依赖 JavaScript 进行动态内容加载。 Crawlbase API 熟练地处理这些元素,确保全面访问 Airbnb 的动态渲染页面。
  2. 简化的请求:API 抽象化了管理的复杂性 HTTP请求、cookie 和会话。 这使您可以专注于完善抓取逻辑,而 API 可以无缝处理技术细微差别。
  3. 结构良好的数据:通过 API 获取的数据通常结构良好、精简 数据解析 和提取过程。 这可确保您能够高效地从 Airbnb 检索所需的定价信息。
  4. 可扩展性:Crawlbase Crawling API 通过高效支持可扩展的抓取 管理多个请求 同时。 在处理 Airbnb 上多样化且广泛的定价信息时,这种可扩展性尤其有利。

备注:Crawlbase 抓取 API 提供了大量可供您使用的参数,使您能够微调您的抓取请求。 这些参数可以根据您的独特需求进行定制,使您的网络抓取工作更加高效和精确。 您可以在以下位置探索可用参数的完整列表 API文档.

Crawlbase 使用 Rust 抓取 API

当使用 Rust 时 网络抓取 使用 Crawlbase 爬网 API,您将通过发出 HTTP 请求直接与 API 交互。 尽管 Crawlbase 目前不提供专用的 Rust 库,但将其集成到您的 Rust 应用程序中是一个简单的过程。

以下是有关如何将 Crawlbase Crawling API 与 Rust 结合使用的分步指南:

发出 HTTP 请求:

利用 Rust 的 HTTP 客户端库(例如 reqwest 或 surf)向 Crawlbase 爬行 API 端点发出 HTTP 请求。 通过将“user_token”替换为您的实际 Crawlbase API 令牌,并将“url_to_scrape”替换为您要抓取的 Airbnb 属性页的 URL,构建 API 请求 URL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 使用 reqwest 的示例
使用 要求;

fn () -> 结果<(), 请求::错误> {
用户令牌 = “您的_CRAWLBASE_TOKEN”;
抓取网址 = “https://www.airbnb.com/property-page-url”;
api_url = 格式!(“https://api.crawlbase.com/?token={}&url={}”、user_token、url_to_scrape);

响应 = 请求西::阻塞::得到(&api_url)?;

// 在这里处理 API 响应
打印!(“回复: {:?}”, 回复);

Ok(())
}

处理 API 响应:

API 响应将采用 JSON 或 HTML 格式,具体取决于您选择的选项。 如果您选择 HTML,则响应将包含所请求 URL 的 HTML 内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 示例继续
使用 std::io::读取;

fn () -> 结果<(), 请求::错误> {
// ...(之前的代码)

MUT 内容 = ::();
响应。进入阅读器()。读取字符串(&MUT 内容)?;

// 现在 'content' 包含抓取页面的 HTML 内容
打印!(“HTML 内容:{}”, 内容);

Ok(())
}

错误处理:

实施适当的错误处理以解决潜在问题,例如网络错误或不成功的 API 请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 示例继续
fn () -> 结果<(), 请求::错误> {
// ...(之前的代码)

if 响应。状态()。是否成功(){
// 成功的API响应
打印!(“请求成功!”);
} 其他 {
// 处理API请求失败
打印!(“请求失败,状态代码:{}”, 回复。状态());
}

Ok(())
}

通过将这些步骤合并到您的 Rust 应用程序中,您可以有效地使用 Crawlbase Crawling API 来抓取 Airbnb 属性页面并为您的项目提取有价值的信息。

抓取 Airbnb 房产列表

现在我们已经了解了发起请求的复杂性并了解了 Airbnb 的 HTML 结构,接下来让我们深入了解使用 Rust 和 Crawlbase Crawling API 抓取 Airbnb 房产列表的实际过程。

抓取 Airbnb 搜索页面 HTML

在 Rust 领域,与 Crawlbase Crawling API 交互涉及制作 HTTP 请求来检索 HTML 内容。 下面是一个 Rust 代码片段示例,演示了如何向 Airbnb 搜索页面发起 GET 请求。 复制此代码并替换您 main.rs 文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 抓取 Airbnb 搜索页面 HTML

使用 要求;
使用 urlencoding::编码;

fn () -> 结果<(), 请求::错误> {
// 使用 urlencoding crate 对 Airbnb URL 进行编码
编码的_airbnb_搜索_url = 编码("https://www.airbnb.com/s/United-States/homes?query=United%20States&checkin=2023-12-07&checkout=2023-12-08&adults=2");

// 将 'YOUR_CRAWLBASE_JS_TOKEN' 替换为您的令牌
crawlbase_api_url = 格式!(“https://api.crawlbase.com/?token=YOUR_CRAWLBASE_JS_TOKEN&url={}&page_wait=5000&ajax_wait=true”、encoded_airbnb_search_url);

// 向 Airbnb 搜索页面发出 GET 请求
响应 = 请求西::阻塞::得到(crawlbase_api_url)?;

// 检查请求是否成功(状态码200)
if 响应。状态()。是否成功(){
// 提取的 HTML 内容
搜索页面html = 回应。文本()?;
打印!(“{}”、search_page_html);
} 其他 {
打印!(“检索页面失败。状态代码:{}”, 回复。状态());
}

Ok(())
}

该 Rust 代码利用了 reqwest crate 通过 Crawlbase Crawling API 对 Airbnb 搜索页面执行 GET 请求。 这 crawlbase_api_url 变量是使用您的 Crawlbase API 令牌和编码的 Airbnb 搜索页面 URL 构建的 URL,其中包含特定搜索参数,例如位置、入住和退房日期以及成人人数。 然后代码通过以下方式将此 URL 发送到 Crawlbase reqwest::blocking::get 函数,它检索搜索页面的 HTML 内容。 它通过检查状态代码来检查请求是否成功,如果成功,则打印提取的 HTML 内容。 此代码是网络抓取 Airbnb 房产列表的第一步,获取原始 HTML 以进一步分析和提取房产数据。

示例输出:

爬取的 HTML 屏幕截图

检查 HTML 以获取 CSS 选择器

通过从属性页获取 HTML 内容,下一步是分析其结构并查明定价数据的位置。 这项任务正是 Web 开发工具和浏览器开发工具来拯救我们的地方。 让我们概述一下如何检查 HTML 结构并挖掘那些宝贵的 CSS 选择器:

Airbnb 搜索页面检查
  1. 打开网页:导航至 Airbnb 网站并登陆您感兴趣的房产页面。
  2. 右键单击并检查:在您想要提取的元素(例如购买按钮)上发挥您的右键单击能力,然后从上下文菜单中选择“检查”或“检查元素”。 这个神秘的咒语将召唤浏览器的开发工具。
  3. 找到 HTML 源代码:在开发者工具的范围内,网页的 HTML 源代码将揭露其秘密。 将光标悬停在 HTML 面板中的各个元素上,然后见证网页的相应部分神奇地亮起。
  4. 识别 CSS 选择器:要从特定元素中释放数据,请在开发人员工具中右键单击它,然后优雅地选择“复制”>“复制选择器”。 这个优雅的操作会将该元素的 CSS 选择器传输到剪贴板,准备好在网页抓取咒语中使用。

一旦有了这些选择器,您就可以继续构建数据抓取器以有效地提取所需的信息。

从 HTML 中检索属性列表数据

通过识别的 CSS 选择器,我们现在可以从 HTML 中检索属性列表数据。 我们将使用 Scraper(一种流行的 HTML 解析箱)来遍历 HTML 并从指定元素收集信息。

例如,您可以从 HTML 内容中提取属性标题、价格、评级和其他相关详细信息。 然后,检索到的数据被结构化并可以存储以供进一步分析或处理。 让我们扩展之前的脚本并从 HTML 中抓取此信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
使用 要求;
使用 scraper::{Html, 选择器};
使用 urlencoding::编码;

fn () -> 结果<(), 请求::错误> {
// 使用 urlencoding crate 对 Airbnb URL 进行编码
编码的_airbnb_搜索_url = 编码("https://www.airbnb.com/s/United-States/homes?query=United%20States&checkin=2023-12-07&checkout=2023-12-08&adults=2");

// 将 'YOUR_CRAWLBASE_JS_TOKEN' 替换为您的实际 Crawlbase API 令牌
crawlbase_api_url = 格式!(“https://api.crawlbase.com/?token=YOUR_CRAWLBASE_JS_TOKEN&url={}&page_wait=5000&ajax_wait=true”、encoded_airbnb_search_url);

// 向 Airbnb 搜索页面发出 GET 请求
响应 = 请求西::阻塞::得到(&crawlbase_api_url)?;

// 检查请求是否成功(状态码200)
if 响应。状态()。是否成功(){
// 提取的 HTML 内容
搜索页面html = 回应。文本()?;

// 从 HTML 中抓取数据
结果 = 刮页(&search_page_html);

// 打印或使用抓取到的数据
导致 in 结果 {
打印!(“标题: {}”, 结果.标题);
打印!(“评分: {}”,结果.评级);
打印!(“价格: {}”,结果.价格);
打印!(“——”);
}
} 其他 {
打印!(
“检索页面失败。状态代码:{}”,
响应。状态()
);
}

Ok(())
}

// 表示搜索结果的结构体
#[导出(调试)]
结构 搜索结果 {
标题: ,
评分: ,
价格: ,
}

// 从 HTML 中抓取数据并返回 SearchResult 对象数组
fn 刮页(html:&STR) -> 维克{
碎片 = html::解析文档(html);
选择器 = 选择器::解析("div#site-content div[itemprop=\"itemListElement\"]").展开();

// 初始化一个向量来存储搜索结果
MUT 结果 = 维克::();

// 迭代每个列表结果并提取数据
节点 in 分段。选择(&选择器){
标题 = 提取文本(&节点, "div[data-testid=\"列表卡标题\"]");
等级 = 提取文本(&节点, “div.g1qv1ctd 跨度.r1dxllyb”);
车资 = 提取文本(&节点, “div.g1qv1ctd div.pquyp1l div._i5duul span.a8jt5op”);

// 创建一个SearchResult对象并将其添加到向量中
导致 = 搜索结果 {
标题,
评分,
价钱,
};
结果。(结果);
}

结果
}

// 从特定选择器中提取文本内容的辅助函数
fn 提取文本(节点:&scraper::ElementRef,选择器:&STR) -> {
子选择器 = 选择器::解析(选择器)。展开();
if (元素)= 节点。选择(&子选择器)。下页(){
元件。文本()。收集()
} 其他 {
::()
}
}

该脚本首先使用必要的查询参数对 Airbnb 搜索 URL 进行编码。 然后,它为网页抓取 API(大概是 Crawlbase)构建一个 URL,并发出 GET 请求来检索 Airbnb 搜索页面的 HTML 内容。 确保请求成功后,脚本继续提取 HTML 内容并使用 scraper crate 来解析文档。 它使用 CSS 选择器来定位表示属性列表的特定元素。 提取的数据(包括房产名称、评级和价格)使用自定义格式以结构化格式存储 SearchResult 结构。 最后,脚本打印或使用抓取的数据。 值得注意的是,在部署此类脚本时,应遵守负责任的网络抓取实践、遵守服务条款以及道德考虑。

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
职位名称: 半月湾露营车/房车
评分: 4.99 (85)
价格: $329 每晚
---
职位名称: 东角的树屋
评分: 4.78 (442)
价格: $250 每晚, 原本$300
---
职位名称: 斯凯科米什的木屋
评分: 4.84 (568)
价格: $295 每晚, 原本$365
---
职位名称: 安吉利斯港的树屋
评分: 4.87 (484)
价格: $325 每晚
---
职位名称: 奥德维尔的小房子
评分: 4.93 (317)
价格: $162 每晚, 原本$249
---
职位名称: 普特尼的小房子
评分: 4.95 (647)
价格: $200 每晚
---
职位名称: 威廉姆斯的家
评分: 5.0 (21)
价格: $235 每晚, 原本$349
---
职位名称: 农家乐在卡利斯佩尔
评分: 5.0 (161)
价格: $199 每晚, 原本$266
---
职位名称: 木屋(伍德斯托克)
评分: 4.9 (41)
价格: $70 每晚, 原本$148
---
职位名称: 小屋(弗雷德里克斯堡)
评分: 4.97 (312)
价格: $215 每晚
---
职位名称: 公寓(怀特霍恩)
评分: 4.97 (111)
价格: $500 每晚
---
职位名称: 坎尼斯贝德路小屋
评分: 5.0 (655)
价格: $80 每晚
---
职位名称: 塞奎姆城堡
评分: 4.77 (410)
价格: $235 每晚, 原本$334
---
职位名称: 约书亚树的圆顶
评分: 4.95 (736)
价格: $89 每晚, 原本$159
---
职位名称: 旅馆(艾德代尔)
评分: 4.96 (759)
价格: $375 每晚
---
职位名称: 约书亚树农家乐
评分: 4.93 (45)
价格: $110 每晚, 原本$153
---
职位名称: 布鲁克斯维尔的帐篷
评分: 4.87 (192)
价格: $54 每晚, 原本$66
---
职位名称: 约书亚树之家
评分: 4.98 (197)
价格: $210 每晚, 原本$365
---

存储抓取的数据

成功从 Airbnb 的房产页面抓取数据后,下一个关键步骤是存储这些有价值的信息以供将来分析和参考。 在本节中,我们将探讨两种常见的数据存储方法: 存储抓取的数据 保存在 CSV 文件中并将其存储在 SQLite 数据库中。 这些方法使您可以有效地组织和管理抓取的数据。

将抓取的数据存储在 CSV 文件中

CSV 是一种广泛使用的格式,旨在保护表格数据。 它代表了一种简单易懂的保存结构化数据的方法,使其成为存档提取的 Airbnb 房产数据的绝佳选择。

我们将添加一个额外的阶段,将收集到的数据保存到 CSV 文件中,以增强我们之前的网页抓取脚本。 以下是脚本的精炼迭代:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
使用 csv::作家;
使用 要求;
使用 scraper::{Html, 选择器};
使用 std::错误::错误;
使用 urlencoding::编码;

fn () -> 结果<(), 盒子<DYN 错误>> {
// 使用 urlencoding crate 对 Airbnb URL 进行编码
编码的_airbnb_搜索_url = 编码("https://www.airbnb.com/s/United-States/homes?query=United%20States&checkin=2023-12-07&checkout=2023-12-08&adults=2");

// 将 'YOUR_CRAWLBASE_JS_TOKEN' 替换为您的实际 Crawlbase API 令牌
crawlbase_api_url = 格式!(“https://api.crawlbase.com/?token=YOUR_CRAWLBASE_JS_TOKEN&url={}&page_wait=5000&ajax_wait=true”、encoded_airbnb_search_url);

// 向 Airbnb 搜索页面发出 GET 请求
响应 = 请求西::阻塞::得到(&crawlbase_api_url)?;

// 检查请求是否成功(状态码200)
if 响应。状态()。是否成功(){
// 提取的 HTML 内容
搜索页面html = 回应。文本()?;

// 从 HTML 中抓取数据
结果 = 刮页(&search_page_html)?;

// 将抓取到的数据写入CSV文件
写入csv(“输出.csv”, &结果)?;

} 其他 {
打印!(
“检索页面失败。状态代码:{}”,
响应。状态()
);
}

Ok(())
}

// 表示搜索结果的结构体
#[导出(调试,serde::序列化)]
结构 搜索结果 {
标题: ,
评分: ,
价格: ,
}

// 从 HTML 中抓取数据并返回结果 , 盒子>
fn 刮页(html:&STR) -> 结果<维克, 盒子<DYN 错误>> {
碎片 = html::解析文档(html);
选择器 = 选择器::解析("div#site-content div[itemprop=\"itemListElement\"]").展开();

// 初始化一个向量来存储搜索结果
MUT 结果 = 维克::();

// 迭代每个列表结果并提取数据
节点 in 分段。选择(&选择器){
标题 = 提取文本(&节点, "div[data-testid=\"列表卡标题\"]");
等级 = 提取文本(&节点, “div.g1qv1ctd 跨度.r1dxllyb”);
车资 = 提取文本(&节点, “div.g1qv1ctd div.pquyp1l div._i5duul span.a8jt5op”);

// 创建一个SearchResult对象并将其添加到向量中
导致 = 搜索结果 {
标题,
评分,
价钱,
};
结果。(结果);
}

Ok(结果)
}

// 从特定选择器中提取文本内容的辅助函数
fn 提取文本(节点:&scraper::ElementRef,选择器:&STR) -> {
子选择器 = 选择器::解析(选择器)。展开();
if (元素)= 节点。选择(&子选择器)。下页(){
元件。文本()。收集()
} 其他 {
::()
}
}

// 将抓取到的数据写入CSV文件
fn 写入csv(文件路径: &STR,结果:&[搜索结果]) -> 结果<(), 盒子<DYN 错误>> {
MUT 作家 = 作者::来自路径(文件路径)?;

// 写入 CSV 标头
作家。写记录(&[“标题”, “评分”, “价钱”])?;

// 将每个SearchResult写入CSV文件
导致 in 结果 {
作家。写记录(&[&结果.标题,&结果.评级,&结果.价格])?;
}

作家。红晕()?;
Ok(())
}

此更新的脚本包括用于 CSV 处理的 csv crate。 这 SearchResult 结构现在派生出 Serialize serde crate 中的特征,使其与 CSV 序列化兼容。 这 write_to_csv 添加了将抓取的数据写入 CSV 文件的功能。 确保替换“YOUR_CRAWLBASE_JS_TOKEN”并根据需要更新输出文件路径。

将抓取的数据存储在 SQLite 数据库中

如果您喜欢一种更加结构化且易于查询的数据存储方法,那么 SQLite 作为一种灵活的无服务器数据库引擎,是一个绝佳的选择。 建立数据库表可以让您系统地 存储您抓取的数据,实现简化的数据检索和操作。 下面概述了为合并 SQLite 数据库存储而对脚本进行的调整:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
使用 要求;
使用 rusqlite::{连接, 结果};
使用 scraper::{Html, 选择器};
使用 urlencoding::编码;

fn () -> 结果<(), 盒子<DYN std::错误::错误>> {
// 使用 urlencoding crate 对 Airbnb URL 进行编码
编码的_airbnb_搜索_url =
编码("https://www.airbnb.com/s/United-States/homes?query=United%20States&checkin=2023-12-07&checkout=2023-12-08&adults=2");

// 将 'YOUR_CRAWLBASE_JS_TOKEN' 替换为您的实际 Crawlbase API 令牌
crawlbase_api_url = 格式!(
“https://api.crawlbase.com/?token=YOUR_CRAWLBASE_JS_TOKEN&url={}&page_wait=5000&ajax_wait=true”,
编码的_airbnb_搜索_url
);

// 向 Airbnb 搜索页面发出 GET 请求
响应 = 请求西::阻塞::得到(&crawlbase_api_url)?;

// 检查请求是否成功(状态码200)
if 响应。状态()。是否成功(){
// 提取的 HTML 内容
搜索页面html = 回应。文本()?;

// 从 HTML 中抓取数据
结果 = 刮页(&search_page_html);

// 将抓取到的数据存储到SQLite中
存储在数据库中(&结果)?;
} 其他 {
打印!(
“检索页面失败。状态代码:{}”,
响应。状态()
);
}

Ok(())
}

// 表示搜索结果的结构体
#[导出(调试)]
结构 搜索结果 {
标题: ,
评分: ,
价格: ,
}

// 从 HTML 中抓取数据并返回 SearchResult 对象数组
fn 刮页(html:&STR) -> 维克{
碎片 = html::解析文档(html);
选择器 = 选择器::解析("div#site-content div[itemprop=\"itemListElement\"]").展开();

// 初始化一个向量来存储搜索结果
MUT 结果 = 维克::();

// 迭代每个列表结果并提取数据
节点 in 分段。选择(&选择器){
标题 = 提取文本(&节点, "div[data-testid=\"列表卡标题\"]");
等级 = 提取文本(&节点, “div.g1qv1ctd 跨度.r1dxllyb”);
车资 = 提取文本(&节点, “div.g1qv1ctd div.pquyp1l div._i5duul span.a8jt5op”);

// 创建一个SearchResult对象并将其添加到向量中
导致 = 搜索结果 {
标题,
评分,
价钱,
};
结果。(结果);
}

结果
}

// 从特定选择器中提取文本内容的辅助函数
fn 提取文本(节点:&scraper::ElementRef,选择器:&STR) -> {
子选择器 = 选择器::解析(选择器)。展开();
if (元素)= 节点。选择(&子选择器)。下页(){
元件。文本()。收集()
} 其他 {
::()
}
}

// 将抓取到的数据存储到SQLite数据库中
fn 存储在数据库中(结果:&[搜索结果]) -> 结果<()> {
康恩 = 连接::打开(“airbnb_data.db”)?;

// 如果表不存在则创建
康涅狄格执行(
“如果列表不存在则创建表(
id 整数主键,
标题文本不为空,
评级文本,
价格文本不为空
)",
[],
)?;

// 向表中插入数据
MUT STMT = 康涅狄格州准备(“插入列表(标题、评级、价格)值(?、?、?)”)?;
导致 in 结果 {
stmt。执行(&[&结果.标题,&结果.评级,&结果.价格])?;
}

Ok(())
}

我们推荐使用 store_in_database 所提供的 Rust 脚本中的函数有助于将抓取的 Airbnb 房产列表数据存储到 SQLite 数据库中。 首先建立与名为的 SQLite 数据库文件的连接 airbnb_data.db。 如果 listings 表不存在,该函数使用以下列创建它 id, title, ratingprice。 随后,该函数准备一条 SQL 语句,用于将数据插入到 listings 桌子。 然后它迭代向量 SearchResult 对象,为每个条目执行 SQL 语句,将相应的属性标题、评级和价格插入数据库。 该过程采用参数化 SQL 查询来确保数据完整性并防止 SQL 注入。 这样, store_in_database 函数提供了一种系统且安全的机制,用于将抓取的 Airbnb 房源列表数据持久保存在 SQLite 数据库中,以便后续检索和分析。

总结

本指南为您提供了使用 Rust 和 Crawlbase Crawling API 轻松抓取 Airbnb 房产列表的基本知识和工具。 无论您是新手还是有一些经验,这里解释的想法都为您的努力提供了一个强有力的起点。

当您继续您的网络抓取之旅时,请记住这些技能的多功能性不仅限于 Airbnb。 探索我们针对以下平台的附加指南 Amazon, 易趣, 沃尔玛全球速卖通,拓宽您的抓取专业知识。

相关指南:
📜 如何爬取 Airbnb 价格

网络抓取带来了挑战,我们对您成功的承诺超出了本指南的范围。 如果您遇到障碍或寻求进一步指导, Crawlbase支持团队 已准备好提供协助。 您在网络抓取方面的成功是我们的首要任务,我们期待在您的抓取之旅中为您提供支持。

常见问题解答(FAQ)

网络抓取是一种中立的技术,但其合法性通常取决于被抓取网站的服务条款。 与许多其他平台一样,Airbnb 也制定了有关自动数据收集的政策。 在抓取之前,必须查看 Airbnb 的服务条款和 robots.txt 文件,确保遵守其规则。

Q2:我可以将 Crawlbase Crawling API 与 Rust 一起用于 Airbnb 以外的网站吗?

绝对地! Crawlbase 抓取 API 是一款多功能工具,其功能已超出 Airbnb 的范围。 它提供了一个强大的解决方案,用于在各种网站上抓取动态和 JavaScript 驱动的内容。 只要您拥有适当的 API 凭证并了解目标网站的结构,您就可以使用 Rust 和 Crawlbase 跨不同平台进行网页抓取。

Q3:Rust 适合网络抓取吗?

是的,Rust 因其高性能、内存安全功能和强大的生态系统而成为网页抓取的绝佳选择。 其并发支持可以有效处理多个请求,所有权系统可确保安全的内存管理。 Rust 的可靠性和速度使其非常适合构建可以处理各种复杂任务的网络抓取工具。

问题 4:如果我在设置 Rust 环境以进行网页抓取时遇到挑战怎么办?

如果您在设置过程中遇到挑战,Rust 社区和文档是宝贵的资源。 Rust 官方文档提供了有关安装、配置和依赖项的全面指导。 此外,探索 Stack Overflow 或 Rust 相关社区等论坛可以让您与经验丰富的开发人员联系起来,他们可能会针对特定问题提供见解和解决方案。

问题 5:使用 Rust 抓取 Airbnb 房产列表时如何处理分页?

处理分页是网络抓取中的常见要求,我们的指南专门解决了这个方面。 我们将探索使用 Rust 和 Crawlbase Crawling API 浏览 Airbnb 房产列表多个页面的有效技术。 这些方法将帮助您有效地检索全面的数据集,而不会丢失任何列表。