Scala 可以輕松實現簡單的數據采集任務,結合 Akka HTTP(高效HTTP客戶端)和 Jsoup(HTML解析庫)是常見方案。Scala因為受眾比較少,而且隨著這兩年python的熱門語言,更讓Scala不為人知,今天我將結合我所學的知識實現一個簡單的Scala爬蟲代碼示例。
以下就是我整理的一個完整示例,演示如何抓取網頁標題和鏈接:
示例代碼
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.scaladsl._
import org.jsoup.Jsoup
import scala.concurrent._
import scala.util.{Success, Failure}object WebScraper {// sbt依賴配置(build.sbt):// libraryDependencies ++= Seq(// "com.typesafe.akka" %% "akka-http" % "10.5.0",// "com.typesafe.akka" %% "akka-stream" % "2.8.0",// "org.jsoup" % "jsoup" % "1.16.1"// )def main(args: Array[String]): Unit = {// 目標網站(示例:Scala官網)val targetUrl = "https://www.scala-lang.org/"// 創建Actor系統(Akka基礎組件)implicit val system: ActorSystem = ActorSystem("WebScraper")import system.dispatcher // 線程池// 1. 發送HTTP GET請求val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = targetUrl))// 2. 處理響應:提取HTML -> 解析數據responseFuture.flatMap { response =>response.status match {case StatusCodes.OK =>// 將響應體轉為字符串val htmlString = response.entity.toStrict(5.seconds).map(_.data.utf8String)htmlString.map { html =>// 3. 使用Jsoup解析HTMLval doc = Jsoup.parse(html)// 提取頁面標題val title = doc.title()println(s"網頁標題: $title\n")// 提取所有鏈接 (示例:打印前5個)val links = doc.select("a[href]")println(s"發現 ${links.size()} 個鏈接,示例:")links.stream().limit(5).forEach { link =>val href = link.attr("abs:href") // 獲取絕對URLval text = link.text().trim.take(30) // 截取部分文本println(s"- [$text] -> $href")}}case _ =>Future.failed(new RuntimeException(s"請求失敗: ${response.status}"))}}.onComplete {// 4. 處理最終結果case Success(_) =>println("\n數據采集完成!")system.terminate() // 關閉Actor系統case Failure(ex) =>println(s"發生錯誤: ${ex.getMessage}")system.terminate()}}
}
關鍵步驟解析
1、發送HTTP請求
- 使用
akka.http.scaladsl.Http().singleRequest()
發送GET請求 - 支持異步非阻塞IO,適合高并發采集
2、處理響應
- 檢查HTTP狀態碼(僅處理200 OK)
- 將響應實體轉換為字符串(
data.utf8String
)
3、解析HTML
- Jsoup 提供類似jQuery的DOM操作:
doc.title()
獲取頁面標題doc.select("a[href]")
選擇所有帶鏈接的<a>
標簽attr("abs:href")
獲取絕對URL(避免相對路徑問題)
4、資源清理
- 完成后調用
system.terminate()
關閉Actor系統
擴展建議
- 并發采集:結合
Source
和Flow
實現多URL并行處理 - 錯誤處理:添加重試機制(使用
akka.pattern.retry
) - 數據存儲:將結果寫入文件(
scala.util.Using
)或數據庫 - 動態內容:如需執行JavaScript,可集成 Selenium 或 Playwright
執行前準備
1、在 build.sbt
中添加依賴:
libraryDependencies ++= Seq("com.typesafe.akka" %% "akka-http" % "10.5.0","com.typesafe.akka" %% "akka-stream" % "2.8.0", // Akka 2.6+ 兼容"org.jsoup" % "jsoup" % "1.16.1"
)
2、運行程序(支持 Scala 2.13/3.x)
以上就是全部的內容,總體來說步驟還是很詳細的,對于小型爬蟲還是非常適合的。如果任何問題都可以這里留言一起討論。