Scala实现网页数据采集示例

Scala 可以轻松实现简单的数据采集任务,结合 Akka HTTP(高效HTTP客户端)和 Jsoup(HTML解析库)是常见方案。Scala因为受众比较少,而且随着这两年python的热门语言,更让Scala不为人知,今天我将结合我所学的知识实现一个简单的Scala爬虫代码示例。

以下就是我整理的一个完整示例,演示如何抓取网页标题和链接:

示例代码

importakka.actor.ActorSystem

importakka.http.scaladsl.Http

importakka.http.scaladsl.model._

importakka.stream.scaladsl._

importorg.jsoup.Jsoup

importscala.concurrent._

importscala.util.{Success,Failure}

objectWebScraper{

// 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"

// )

defmain(args:Array[String]):Unit={

// 目标网站(示例:Scala官网)

valtargetUrl="https://www.scala-lang.org/"

// 创建Actor系统(Akka基础组件)

implicitvalsystem:ActorSystem=ActorSystem("WebScraper")

importsystem.dispatcher// 线程池

// 1. 发送HTTP GET请求

valresponseFuture:Future[HttpResponse]=

Http().singleRequest(HttpRequest(uri=targetUrl))

// 2. 处理响应:提取HTML -> 解析数据

responseFuture.flatMap{response=>

response.statusmatch{

caseStatusCodes.OK=>

// 将响应体转为字符串

valhtmlString=response.entity.toStrict(5.seconds).map(_.data.utf8String)

htmlString.map{html=>

// 3. 使用Jsoup解析HTML

valdoc=Jsoup.parse(html)


// 提取页面标题

valtitle=doc.title()

println(s"网页标题: $title\n")


// 提取所有链接 (示例:打印前5个)

vallinks=doc.select("a[href]")

println(s"发现 ${links.size()} 个链接,示例:")

links.stream().limit(5).forEach{link=>

valhref=link.attr("abs:href")// 获取绝对URL

valtext=link.text().trim.take(30)// 截取部分文本

println(s"- [$text] -> $href")

           }

         }


case_=>

Future.failed(newRuntimeException(s"请求失败: ${response.status}"))

     }

}.onComplete{

// 4. 处理最终结果

caseSuccess(_)=>

println("\n数据采集完成!")

system.terminate()// 关闭Actor系统


caseFailure(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,可集成 SeleniumPlaywright

执行前准备

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)

以上就是全部的内容,总体来说步骤还是很详细的,对于小型爬虫还是非常适合的。如果任何问题都可以这里留言一起讨论。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容