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

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

開発の手順

環境構築

# 開発環境構築
$ brew install --cask temurin
$ brew install gradle
$ brew install scala

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

# プロジェクトの初期化
$ gradle init --type scala-application

$ gradle init –type scala-application のコマンドが実行完了したら、以下のファイルが作成されていることを確認してください。この2つのファイルを編集して開発を進めていきます。

app/build.gradle ファイルの dependencies { … } の中に、以下の行を追加してください。

    implementation 'org.scalatra:scalatra_2.13:2.7.1'
    implementation 'org.eclipse.jetty:jetty-webapp:9.4.12.v20180830'
    implementation 'javax.servlet:javax.servlet-api:4.0.1'
    implementation 'net.ruippeixotog:scala-scraper_2.13:2.2.0'
    implementation 'com.google.code.gson:gson:2.4'

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

Webサーバーの起動

App.scala を以下の内容に変更します。

package scraping_server

import org.scalatra.ScalatraServlet
import javax.servlet.Servlet
import org.eclipse.jetty.webapp.WebAppContext
import org.eclipse.jetty.servlet.ServletHolder
import org.eclipse.jetty.server.Server

class MyWebService extends ScalatraServlet  {
  get("/") {
    "test"
  }
}

object WebServiceBuilder {
  def buildWebService(port: Integer, webServiceClass: Class): Server = {
    val server = new Server(port)
    val context = new WebAppContext()
    context.setContextPath("/")
    context.setResourceBase("/tmp")
    context.addServlet(new ServletHolder(webServiceClass), "/")
    server.setHandler(context)
    server
  }
}

object App {
  def main(args: Array): Unit = {
    val server: Server = WebServiceBuilder.buildWebService(3000, classOf)
    server.start()
  }
}

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

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

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

package scraping_server

import org.scalatra.ScalatraServlet
import javax.servlet.Servlet
import org.eclipse.jetty.webapp.WebAppContext
import org.eclipse.jetty.servlet.ServletHolder
import org.eclipse.jetty.server.Server
// パッケージの追加
import net.ruippeixotog.scalascraper.browser.JsoupBrowser
import net.ruippeixotog.scalascraper.dsl.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL.Parse._
import com.google.gson.Gson

object Scraper {
  // スクレイピング用の関数を追加
  def getItems(): List = {
    val browser = JsoupBrowser()

    val url = "https://en.wikipedia.org/wiki/List_of_programming_languages"
    val doc = browser.get(url)

    val lists = doc >> elementList(".div-col li")
    lists.map(_ >> allText)
  }
}

class MyWebService extends ScalatraServlet  {
  get("/") {
    // 追加した関数を呼び出す
    val items: List = Scraper.getItems()
    val gson = new Gson()
    gson.toJson(items.toArray)
  }
}

object WebServiceBuilder {
  def buildWebService(port: Integer, webServiceClass: Class): Server = {
    val server = new Server(port)
    val context = new WebAppContext()
    context.setContextPath("/")
    context.setResourceBase("/tmp")
    context.addServlet(new ServletHolder(webServiceClass), "/")
    server.setHandler(context)
    server
  }
}

object App {
  def main(args: Array): Unit = {
    val server: Server = WebServiceBuilder.buildWebService(3000, classOf)
    server.start()
  }
}

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