Scala實現網頁數據采集示例

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系統

擴展建議

  • 并發采集:結合 SourceFlow 實現多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)

以上就是全部的內容,總體來說步驟還是很詳細的,對于小型爬蟲還是非常適合的。如果任何問題都可以這里留言一起討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90499.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【IO復用】五種IO模型

文章目錄五種IO模型Linux設計哲學BIONIOAIOSIOIO多路復用五種IO模型 Linux設計哲學 在linux系統中&#xff0c;實際上所有的I/O設備都被抽象為了文件這個概念&#xff0c;一切皆文件&#xff0c;磁盤、網絡數據、終端&#xff0c;甚至進程間通信工具管道pipe等都被當做文件對…

FeatherScan v4.0 – 適用于Linux的全自動內網信息收集工具

前言 在平時滲透打靶的時候&#xff0c;經常要自己手工輸入命令&#xff0c;做各種基本的信息收集&#xff0c;非常的繁瑣&#xff0c;所以自研了一款工具&#xff0c;這款工具沒有接入AI&#xff0c;因為不合適&#xff0c;接入了AI的話在一些不能上網的環境下進行信息收集&a…

如何精準篩選優質SEO服務資源?

核心要點&#xff1a; 中小企業選擇SEO服務常陷困惑——效果難量化、承諾不透明、策略模糊化。本文剖析核心痛點&#xff0c;拆解技術合規性、策略透明度、行業經驗匹配度等關鍵篩選維度&#xff0c;提供一套清晰的評估路徑&#xff0c;助您在復雜市場中找到真正專業的合作伙伴…

在教育領域中,如何通過用戶ID跑馬燈來對視頻進行加密?

文章目錄前言一、什么是用戶跑馬燈二、用代碼如何實現用戶ID跑馬燈的功能三、如何通過用戶ID跑馬燈來對視頻進行加密&#xff1f;總結前言 在教育領域&#xff0c;優質視頻課程易遭非法傳播。為強化版權保護與責任追溯&#xff0c;引入基于用戶ID的跑馬燈水印技術成為有效手段…

MCP協議:AI時代的“萬能插座”如何重構IT生態與未來

MCP協議&#xff1a;AI時代的“萬能插座”如何重構IT生態與未來 在人工智能技術爆炸式發展的浪潮中&#xff0c;一個名為Model Context Protocol&#xff08;MCP&#xff09; 的技術協議正以驚人的速度重塑IT行業的底層邏輯。2024年11月由Anthropic首次發布&#xff0c;MCP在短…

同步,異步復位問題

1.同步復位的基本原理是&#xff0c;復位信號僅在時鐘的有效邊沿影響或重置觸發器的狀態。復位的主要目標之一是使 ASIC 在仿真時進入已知狀態。由于復位樹的扇出較大&#xff0c;復位信號相對于時鐘周期可能成為 “晚到信號”。即使復位信號會通過復位緩沖樹進行緩沖&#xff…

數組和指針回顧,練習與解析

代碼見&#xff1a;登錄 - Gitee.com 1.數組和指針練習與解析 1.1數組名 1.sizeof(數組名)&#xff0c;這里的數組名表示整個數組&#xff0c;計算的是整個數組的大小。 2.&數組名&#xff0c;這里的數組名表示整個數組&#xff0c;取出的是整個數組的地址。 3.除此之…

【牛客刷題】活動安排

文章目錄一、題目介紹二、解題思路2.1 核心問題2.2 貪心策略2.3 正確性證明三、算法分析3.1 為什么按結束時間排序&#xff1f;3.2 復雜度分析3.3 算法流程圖解3.3.1 流程圖說明3.3.2 關鍵步驟說明四、模擬演練五、完整代碼一、題目介紹 活動安排 題目描述 給定 nnn 個活動&am…

第1講:C語言常見概念

目錄 一、什么是C語言&#xff1f; 二、C語言的歷史與成就 三、編譯器選擇&#xff08;VS2022&#xff09; 1、編譯與鏈接 2、編譯器對比 3、VS2022的優缺點 四、VS項目與源文件、頭文件介紹 五、第一個C語言程序 六、main函數 七、printf和庫函數 八、關鍵字介紹 …

WinUI3入門18:從APP打開商店鏈接以及實現內購

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

BI布局拖拽 (1) 深入react-gird-layout源碼

因為有個拖拉拽的需求&#xff0c;類似于quickBi那樣的效果。在網上調研了一下發現react-grid-layout實現效果類似&#xff0c;但其也有局限性&#xff0c;比如不支持嵌套&#xff0c;不支持在多個gridLyaout之間互相拖拽。 要求&#xff1a;基于react-grid-layout的思路&#…

CentOS環境搭建-快速升級G++版本

在CentOS環境中快速升級G編譯器版本&#xff0c;對于追求最新語言特性的開發者來說至關重要。由于CentOS默認的軟件倉庫可能不提供G的最新版本&#xff0c;我們通常需要借助第三方軟件源&#xff0c;如Developer Toolset或使用Spack等包管理器來完成這一任務。下面將詳細介紹兩…

分布式接口冪等性的演進和最佳實踐,含springBoot 實現(Java版本)

一、背景&#xff1a;為什么需要冪等性 在微服務、分布式架構下&#xff0c;網絡不可靠、請求重試機制&#xff08;如前端超時重發、客戶端重發、網關重試、消息消費失敗重試等&#xff09;會帶來重復請求&#xff0c;如果接口沒有冪等性&#xff0c;可能導致&#xff1a; 重復…

OGRE 3D----6. 背景圖片渲染實現詳解

1. 背景圖片渲染原理 1.1 渲染隊列機制 Ogre3D 使用渲染隊列(Render Queue)來控制對象的渲染順序。背景圖片需要在所有其他對象之前渲染,因此我們將其設置為 RENDER_QUEUE_BACKGROUND。 1.2 視圖變換控制 為了讓背景圖片始終保持在場景的最遠處,我們需要: 使用單位投影…

K線連續漲跌統計與分析工具

K線連續漲跌統計與分析工具 1. 概述 本工具是一個用于分析金融時間序列數據(特別是K線數據)的Python腳本,主要功能是統計連續n根同方向K線后,第n+1根K線的漲跌情況。該工具不僅提供統計分析功能,還支持圖形化標記以驗證結果,幫助交易者和量化分析師識別市場中的特定模式…

jQuery EasyUI 簡介

jQuery EasyUI 簡介 引言 隨著互聯網技術的飛速發展,前端開發變得越來越重要。jQuery EasyUI 作為一款流行的前端UI框架,極大地簡化了前端開發的工作流程,提高了開發效率。本文將詳細介紹 jQuery EasyUI 的起源、特點、使用方法以及在實際項目中的應用。 一、jQuery Easy…

《測試開發:從技術角度提升測試效率與質量》

測試開發的核心工作內容與職責解析 一、測試開發的定位與核心價值 測試開發&#xff08;Test Development&#xff0c;簡稱 TestDev 或 SDET&#xff09;是融合軟件開發能力與測試工程思維的復合型崗位&#xff0c;不同于傳統測試工程師&#xff0c;其核心目標是通過技術手段提…

20250710解決KickPi的K7開發板刷機之后出現DDR異常:ch:1 dq0 fail,write:0x1,read:0x20300

20250710解決KickPi的K7開發板刷機之后出現DDR異常&#xff1a;ch:1 dq0 fail,write:0x1,read:0x20300 2025/7/10 20:36[BEGIN] 2025/7/10 19:29:03 /DDR 2f85f4b2d4 cym 25/03/04-14:38.55,fwver: v1.09 In ch0 ttot10 ch0 ttot10 ch1 ttot10 ch0 ttot18 LPDDR4, 2112MHz chan…

Ansible:強大的自動部署工具

文章目錄零、Ansible介紹一、安裝 ansible二、配置SSH密鑰1.檢查密鑰是否存在2.兩邊的機器要互相有對方的密鑰三、自動部署1.傳輸文件(1)inventory.ini(2)sync_blt.yml(3)執行命令2.安裝軟件(1)inventory.ini(2)install_efvs.yml(3)執行命令零、Ansible介紹 Ansible 是一個開源…

Nacos的基本功能以及使用Feign進行微服務間的通信

Nacos是Dynamic Naming and Configuration Service的縮寫。What’s Nacos? 下面結合SpringBoot項目&#xff0c;為你介紹Nacos的基本功能以及如何使用Feign進行微服務間的通信。 一、Nacos的基本功能 Nacos是阿里巴巴開源的一個更易于構建云原生應用的動態服務發現、配置管…