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'
インストールしている外部パッケージは以下のものです。
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のページから取得したプログラミング言語一覧の文字が表示されるようになります。