为什么 Swift 是鲜为人知的理想爬虫语言
\n\n当谈到从互联网收集数据时,不知为何大家总是首先想到 Python 及其 BeautifulSoup 和 Scrapy。但如果我告诉你,你用于 iOS 应用的 Swift 语言同样能胜任,甚至做得更好呢?是的,你没听错。Swift 爬虫 并非什么冷门技术,而是一个强大的工具,在相同任务上其运行速度可比 Python 快 2-3 倍。今天我们就来证明这一点。
\n\n在本文中,你将学习如何配置环境、编写你的第一个 Swift 爬虫、处理错误以及保存数据。我们不会使用复杂的抽象概念——只有纯粹、易懂的代码,你可以在 15 分钟内运行起来。
\n\n什么是 Swift 中的解析与抓取?
\n\nSwift 解析 是使用 Swift 编程语言从网页或文档中提取结构化数据的过程。与经典的 Python 网页抓取不同,Swift 提供了与 iOS/macOS 的原生集成,使其成为创建自行收集数据的应用的理想选择。
\n\nSwift 数据抓取 的主要使用场景:
\n- \n
- 从电商网站收集价格以监控竞争对手 \n
- 从目录网站提取联系信息 \n
- 分析新闻推送和博客 \n
- 为应用创建自定义 API(当没有官方 API 时) \n
对于 Swift 爬虫,我们将使用两项关键技术:用于下载 HTML 页面的 URLSession 和用于解析 HTML 文档的 SwiftSoup 库。SwiftSoup 是 Python 的 BeautifulSoup 的对应物,但用纯 Swift 编写。
项目安装与配置
\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 中。
另一种方法是使用 CocoaPods:
\npod 'SwiftSoup', '~> 2.6.0'\n\n安装后,在你的代码中导入该库:
\nimport 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 有强大支持的语言,因此我们将采用现代方法。
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\nfunc 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