💻️
スクレイピングとサーバー実行のサンプルコード(Swift)

SwiftでスクレイピングとWebサーバーを開発する手順を書いていきます。

開発の手順

環境構築

以下のコマンドを実行してプロジェクトを作成します。

# プロジェクトのディレクトリ作成
$ mkdir ScrapingServer
$ cd ScrapingServer

# プロジェクトの開発環境構築
$ swift package init --type executable

$ swift package init –type executable のコマンドが実行完了後、 以下のファイルが存在することを確認してください。

Package.swift の 内容を以下のように書き替えます。

// swift-tools-version: 5.7

import PackageDescription

let package = Package(
    name: "ScrapingServer",
    platforms: [
        // 対応するプラットフォームをここに追加
    ],
    dependencies: [
        // 必要な依存関係をここに追加
    ],
    targets: [
        .target(
            name: "ScrapingServer",
            dependencies: []
        ),
        .testTarget(
            name: "ScrapingServerTests",
            dependencies: ["ScrapingServer"]
        )
    ]
)

インストールしている外部パッケージは以下のものです。

Webサーバーの起動

ScrapingServer.swift を以下の内容に変更します。

import Vapor

@main
public struct ScrapingServer {
  public static func main()  {
    do {
      let app = try Application(.detect())

      app.get("") { request -> EventLoopFuture<String> in
        let promise = request.eventLoop.makePromise(of: String.self)
        promise.completeWithTask {
          return "test"
        }
        return promise.futureResult
      }

      app.http.server.configuration.port = 3000
      try app.run()
    } catch {
      print(error.localizedDescription)
    }
  }
}

その後、以下コマンドを実行して http://localhost:3000 にブラウザでアクセスすると、”test” の文字が表示されます。

$ swift run これで、Webサーバーの起動ができました。

※ 「error: no such module ‘PackageDescription’」というエラーが発生した場合 → Xcodeを開いて、Preferences > Locations > Command Line Tools: に Xcode が選択されている状態にしましょう。

スクレイピングで取得した情報を表示する ScrapingServer.swift に以下の実装を追加します。

import Vapor
// パッケージの追加
import Alamofire
import Kanna

@main
public struct ScrapingServer {

  // 関数の追加
  public static func scraping() async ->  {
    let url = "https://en.wikipedia.org/wiki/List_of_programming_languages"
    async let res = AF.request(url).serializingString().response
    guard let html = await res.value else { return [] }
    guard let doc = try? HTML(html: html, encoding: String.Encoding.utf8) else { return [] }
    var items = ()
    for value in doc.css(".div-col li") {
      guard let text = value.text else { continue }
      items.append(text)
    }
    return items
  }

  // 関数の追加
  public static func getItemsJson() async -> String {
    let items = await scraping()
    let encoder = JSONEncoder()
    guard let itemsJson = try? encoder.encode(items) else { return "" }
    return String(data: itemsJson, encoding: .utf8)!
  }

  public static func main()  {
    do {
      let app = try Application(.detect())

      app.get("") { request -> EventLoopFuture<String> in
          let promise = request.eventLoop.makePromise(of: String.self)
          promise.completeWithTask {
              // 追加した関数を利用
              let itemsJson = await getItemsJson()
              return itemsJson
          }
          return promise.futureResult
      }

      app.http.server.configuration.port = 3000
      try app.run()
    } catch {
      print(error.localizedDescription)
    }
  }
}

追加実装の後、 $ swift runを再実行して http://localhost:3000 にアクセスすると、 Wikipediaのページから取得したプログラミング言語一覧の文字が表示されるようになります。