2025 年使用 Swift 进行网络抓取的教程
在本教程中,我将教你如何使用 Swift,借助 SwiftSoup 库.SwiftSoup 就像是 Swift 的 jQuery,可以轻松解析 HTML 并提取所需数据。无论您是 Swift 的新手,还是只是想尝试使用一种新语言进行刮擦,本指南都将帮助您快速高效地入门。让我们开始吧
为什么选择 Swift 进行网络抓取?
斯威夫特 主要用于 iOS 和 macOS 开发,但也能处理以下任务 网络抓取.虽然 Swift 在这方面的应用不如 Python 普遍,但它的一些优势还是很吸引人的:
- 性能:Swift 快速高效,尤其适合处理大量数据。
- 本地支持:Swift 可在 macOS 上原生运行,因此对于在苹果生态系统中工作的开发人员来说是一个不错的选择。
- 安全类型:Swift 是一种类型安全语言,这意味着可以在编译时而不是运行时捕获错误。这使您的刮擦脚本更健壮,不易出现错误。
⚡ 备选方案:使用无代码刮板
如果您希望大规模地搜索数据,或避免处理浏览器设置、代理轮换或反僵尸挑战,您可能需要考虑托管解决方案,例如 网络抓取 API.它是一款完全可管理的工具,可处理 JavaScript 渲染、验证码解锁和 IP 旋转。
虽然本教程的重点是使用 Swift 构建刮板,但对于更喜欢专注于数据分析而非基础架构的开发人员来说,Bright Data 或 ScrapingBee 等工具也是一种实用的替代方法。在处理复杂或受保护的网站时,它尤其有用。
先决条件
在开始之前,请确保具备以下条件:
- 已安装 Swift:如果您使用的是 macOS,可以安装包含 Swift 的 Xcode。在 Windows 或 Linux 上,您可以从官方网站下载 Swift,并按照说明进行安装。
- Swift 软件包管理器 (SPM):该工具将帮助您管理 SwiftSoup 等库,您需要使用这些库来解析 HTML。
安装好 Swift 后,打开终端并键入验证:
swift - 版本
如果看到类似 "Swift 版本 5.9.2 "的内容,就可以开始了!
设置 Swift 项目
步骤 1:创建新的 Swift 项目
首先,为项目创建一个新目录并导航进入。然后,初始化一个新的 Swift 命令行工具:
mkdir SwiftScraper
CD SwiftScraper
swift 软件包 init - 名称 SwiftScraper type 可执行
这将为 Swift 项目创建一个包含必要文件的新目录。您将看到一个 Package.swift 文件和一个包含 main.swift 的 Sources 文件夹。
第 2 步:打开项目
您可以在 Xcode 或其他与 Swift 兼容的集成开发环境。Sources 文件夹中的 main.swift 文件包含一个简单的 "Hello, World!"程序,你将用你的网页抓取代码替换它。
第 3 步:安装 SwiftSoup
接下来,您需要安装 SwiftSoup,这是一个可以帮助您解析和提取 HTML 数据的库。打开 Package.swift 文件,将 SwiftSoup 添加为依赖项:
import 软件包描述
let package = 包装(
名称: "SwiftScraper,
依赖项:[
.package(url: "https://github.com/scinfu/SwiftSoup.git"从 "2.6.0")
],
目标:[
.executableTarget(
name: "SwiftScraper,
依赖项:[
.product(name: "SwiftSoup,包装: "SwiftSoup)
]
),
]
)
更新 Package.swift 后,运行以下命令安装软件包:
雨燕软件包更新
这将下载 SwiftSoup 并将其集成到您的项目中。
使用 Swift 执行网络抓取
现在,您已经建立了项目并安装了 SwiftSoup,是时候开始从网站上刮取数据了。我们将使用网站"https://scrapeme.live/shop/"为例。该网站有一份我们可以提取的产品清单。
步骤 1:获取 HTML 内容
要抓取网页,第一步是检索 HTML 内容。Swift 提供了使用 URLSession但为了简单起见,我们将使用字符串初始化器直接获取 HTML:
import 基金会
import 基础网络
import SwiftSoup
let url = URL(字符串: "https://scrapeme.live/shop/")!
let html = 试试看 String(contentsOf: url)
在这段代码中,我们创建了一个指向目标页面的 URL 对象,并使用 String(contentsOf:) 来获取 HTML 内容。
第 2 步:解析 HTML 内容
获得 HTML 内容后,下一步就是对其进行解析。SwiftSoup 的解析函数让这一步变得简单。该函数可将 HTML 字符串转换为您可以操作的 Document 对象:
let document = 试试看 SwiftSoup.parse(html)
此时,整个网页已经加载并解析成一个结构,你可以从中查询和提取数据。
步骤 3:提取数据
现在,HTML 已被解析,您可以开始提取所需的数据。例如,可以从页面中提取所有产品名称、价格和 URL。我们将使用 CSS 选择器来选择相关元素。以下是提取单个产品数据的方法:
let product = try document.select("li.product").first()!
let url = try product.select("a").first()!.attr("href")
let image = try product.select("img").first()!.attr("src")
let name = try product.select("h2").first()!.text()
let price = try product.select("span").first()!.text()
print("URL: (url)")
print("图像: (图片)")
print("姓名: (姓名)")
print("价格 (价格)")
在这个例子中
- select("li.product") 选择所有产品列表项。
- select("a")、select("img")、select("h2")和select("span")用于定位特定产品的详细信息,如 URL、图片、名称和价格。
- attr("href") 和 attr("src") 提取属性值,而 text() 则获取文本内容。
步骤 4:提取多种产品
该页面包含多个产品,因此您需要循环浏览所有产品元素,提取每个元素的数据。下面是您的操作方法:
var 产品:[Product] = []
let 产品元素 = try document.select("li.product")
for element in productElements.array() {
let url = try element.select("a").first()!.attr("href")
let image = try element.select("img").first()!.attr("src")
let name = try element.select("h2").first()!.text()
let price = try element.select("span").first()!.text()
let product = Product(url: url, image: image, name: name, price: price)。
products.append(product)
}
for product in 产品 {
print("(产品名称) - (product.price) - (product.url)")
}
在这段代码中,我们使用 array() 将元素转换为数组,然后遍历这些元素,提取每个产品的必要数据。
第 5 步:将数据保存为 CSV 文件
最后,您可能想将刮擦数据保存到 CSV 文件中,以便于分析。为此,您可以使用 CSV.swift 库.将其添加到 Package.swift 依赖项中:
.软件包(url: "https://github.com/yaslab/CSV.swift.git", from: "2.4.3"),
然后,将其导入到你的 main.swift 中:
import CSV
现在,您可以将刮擦的数据写入一个 CSV file:
let 溪流 = 输出流(toFileAtPath: "products.csv", append: false)!
let csv = 试试看 CSVWriter(数据流:数据流)
试试看 csv.write(row: ["URL", "图像", "姓名", "Price"])
for product in 产品 {
试试看 csv.write(row: [product.url, product.image, product.name, product.price])
}
csv.stream.close()
这段代码将创建一个名为 products.csv 的 CSV 文件,并将产品数据写入其中。每一行将包含产品的 URL、图片 URL、名称和价格。
处理分页和抓取多个页面
许多网站,尤其是电子商务网站,都有分页功能,这意味着产品数据分布在多个页面上。在这种情况下,您需要抓取多个页面来收集所有数据。
下面介绍如何处理分页:
- 获取第一页的 URL。
- 解析页面的 HTML 内容。
- 提取下一页的链接。
- 对下一页重复该过程,直到所有页面都被刮除。
例如,如果分页链接位于类名为 page-numbers 的锚标签中,则可以像这样提取下一页链接:
let 分页链接 = try document.select("a.page-numbers")
for link in paginationLinks.array() {
let nextPageUrl = try link.attr("href")
print("下一页 (nextPageUrl)")
}
结论
Swift 为网络搜刮提供了一个快速高效的平台,利用 SwiftSoup 等库,您可以轻松地从 HTML 内容中解析和提取数据。虽然网络抓取可能很复杂,尤其是在处理分页和反僵尸措施时,但 Swift 提供了构建强大高效的网络抓取程序所需的所有工具。