Swift 爬虫:30分钟创建数据解析器

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么 Swift 是鲜为人知的理想爬虫语言

\n\n

当谈到从互联网收集数据时,不知为何大家总是首先想到 Python 及其 BeautifulSoup 和 Scrapy。但如果我告诉你,你用于 iOS 应用的 Swift 语言同样能胜任,甚至做得更好呢?是的,你没听错。Swift 爬虫 并非什么冷门技术,而是一个强大的工具,在相同任务上其运行速度可比 Python 快 2-3 倍。今天我们就来证明这一点。

\n\n

在本文中,你将学习如何配置环境、编写你的第一个 Swift 爬虫、处理错误以及保存数据。我们不会使用复杂的抽象概念——只有纯粹、易懂的代码,你可以在 15 分钟内运行起来。

\n\n

什么是 Swift 中的解析与抓取?

\n\n

Swift 解析 是使用 Swift 编程语言从网页或文档中提取结构化数据的过程。与经典的 Python 网页抓取不同,Swift 提供了与 iOS/macOS 的原生集成,使其成为创建自行收集数据的应用的理想选择。

\n\n

Swift 数据抓取 的主要使用场景:

\n
    \n
  • 从电商网站收集价格以监控竞争对手
  • \n
  • 从目录网站提取联系信息
  • \n
  • 分析新闻推送和博客
  • \n
  • 为应用创建自定义 API(当没有官方 API 时)
  • \n
\n\n

对于 Swift 爬虫,我们将使用两项关键技术:用于下载 HTML 页面的 URLSession 和用于解析 HTML 文档的 SwiftSoup 库。SwiftSoup 是 Python 的 BeautifulSoup 的对应物,但用纯 Swift 编写。

\n\n

项目安装与配置

\n\n

首先,我们需要安装 SwiftSoup。最简单的方法是通过 Swift Package Manager。在 Xcode 中创建一个新项目或打开现有项目,然后添加依赖项:

\n\n
// 在 Package.swift 中\ndependencies: [\n    .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")\n]
\n\n

或者,如果你在没有 Xcode 的情况下使用 SPM,只需将上面的行添加到你的 Package.swift 中。

\n\n

另一种方法是使用 CocoaPods:

\n
pod 'SwiftSoup', '~> 2.6.0'
\n\n

安装后,在你的代码中导入该库:

\n
import SwiftSoup\nimport Foundation
\n\n

搞定!现在我们可以开始编写爬虫了。

\n\n

编写你的第一个 Swift 爬虫:分步指南

\n\n

让我们编写一个爬虫,从 Hacker News 主页(news.ycombinator.com)提取文章标题。这是学习爬虫的经典任务。

\n\n

步骤 1:加载 HTML 页面

\n\n

使用 URLSession 异步加载数据。Swift 是一种对 async/await 有强大支持的语言,因此我们将采用现代方法。

\n\n
func fetchHTML(from urlString: String) async throws -> String {\n    guard let url = URL(string: urlString) else {\n        throw URLError(.badURL)\n    }\n    \n    let (data, _) = try await URLSession.shared.data(from: url)\n    guard let html = String(data: data, encoding: .utf8) else {\n        throw URLError(.cannotDecodeContentData)\n    }\n    \n    return html\n}
\n\n

注意:我们返回一个 HTML 字符串。这是我们将要解析的原始数据。

\n\n

步骤 2:使用 SwiftSoup 解析 HTML

\n\n

现在是最有趣的部分——提取数据。SwiftSoup 的工作方式类似于 CSS 选择器:你指定要获取哪些元素。

\n\n
func parseTitles(from html: String) throws -> [String] {\n    let doc = try SwiftSoup.parse(html)\n    let titles = try doc.select(".titleline a").array()\n    \n    var result: [String] = []\n    for title in titles {\n        let text = try title.text()\n                

博客

书籍推荐