Scala 网络抓取

Scala Web Scraping:逐步教程 2025

在本教程中,您将学习如何设置您的 Scala 环境中提取数据、处理分页内容,以及使用 Selenium 等工具刮擦动态网站。课程结束时,您将牢固掌握 Scala 网页抓取技术。

为什么选择 Scala 进行网络抓取?

Scala 是网络搜刮的实用选择,这是因为

  • 语法简单,表现力强: 其简洁的语法使代码易于阅读和维护。
  • 互操作性: Scala 可以利用 Jsoup、Selenium 和 HtmlUnit 等 Java 库。
  • 职能能力: 它支持简化数据操作任务的函数式编程范式。

虽然 Python 和 Node.js Scala 在性能和灵活性之间实现了独特的平衡。

无代码网络抓取

如果你想在不使用任何代码的情况下搜刮网站,我建议你看看这些平台:

  1. Bright Data - 具有高度可扩展性和自动化的企业级刮板。
  2. Octoparse - 用户友好、灵活的数据提取与调度。
  3. ParseHub - 直观的点击式结构化数据搜刮器。
  4. Apify - 基于云的刮擦,并提供预建模板和应用程序接口。
  5. Web Scraper - 浏览器扩展,用于快速、简单地进行网络搜索。

有兴趣了解更多信息?查看全文 无代码网络搜刮器文章.我与任何供应商都没有任何关系!

前提条件和环境设置

要开始使用 Scala 进行刮擦,需要先准备好环境。

安装 Java 和 Scala

  1. Java: Scala 需要一个 Java 开发工具包 (JDK).如果尚未安装 JDK,请下载最新的 LTS 版本。
  2. 斯卡拉 下载并安装 Scala 3.x,使用 Coursier 软件包管理器。
  3. SBT: "(《世界人权宣言》) Scala 构建工具 (sbt) 是项目管理必不可少的工具。它与 Scala 安装程序捆绑在一起。

设置 Scala 项目

按照以下步骤创建一个新的 Scala 项目:

  1. 导航至要创建项目的目录。
  2. 运行以下命令生成新的项目模板:
sbt new scala/scala3.g8

根据提示为项目命名。例如,将其命名为 scala-web-scraper。

输入项目文件夹:

CD scala-web-scraper

将项目导入首选的集成开发环境(如 IntelliJ IDEA 或 Visual Studio Code)。

创建第一个网络抓取器

我们将使用流行的 Scala 库 scala-scraper 来构建我们的网络搜索器。

步骤 1:添加依赖关系

编辑 build.sbt 文件并添加以下依赖关系:

库依赖 = "net.ruippeixotog" %% "无字天书" % "3.1.1"

运行 update 命令安装程序库:

sbt 更新

步骤 2:连接到网页

在 src/main/scala/Main.scala 中创建一个 Scala 对象,用于从网页中检索 HTML。

import net.ruippeixotog.scalascraper.browser.JsoupBrowser
反对 ScalaScraper {
def main(args: Array[String]): 单位 = {
// 初始化浏览器
缬氨酸 浏览器 = JsoupBrowser()
// 连接到网页
缬氨酸 doc = 浏览器。get("https://www.scrapingcourse.com/ecommerce/")
// 提取并打印 HTML 源代码
缬氨酸 html = doc.toHtml
println(html)
}
}

运行项目:

运行

该脚本连接到页面并打印 HTML 内容。

从 HTML 元素中提取数据

要从网页中抓取特定元素,可以使用 CSS 选择器。将这些导入添加到 Main.scala 文件中:

import net.ruippeixotog.scalascraper.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL.Parse._

现在,从目标页面抓取产品详细信息。

缬氨酸 htmlProductElement = doc >> element("li.product")
缬氨酸 name = htmlProductElement >> text("h2")
缬氨酸 url = htmlProductElement >> element("a")>> attr("href")
缬氨酸 图像 = htmlProductElement >> element("img")>> attr("src")
缬氨酸 价格 = htmlProductElement >> text("span")
println(s"姓名: $name")
println(s"URL: $url")
println(s"图像: $image")
println(s"价格 $price")

搜索多个项目

让我们提取页面上的所有产品元素。

缬氨酸 产品元素 = doc >> elementList("li.product")
缬氨酸 products = htmlProductElements.map { 元素 =>
缬氨酸 name = element >> text("h2")
缬氨酸 url = element >> element("a")>> attr("href")
缬氨酸 image = element >> element("img")>> attr("src")
缬氨酸 price = element >> text("span")
产品(名称、url、图像、价格)
}
products.foreach(println)

定义一个产品案例类来存储数据:

case class Product(name: String, url: String, image: String, price: String)

将数据导出为 CSV

要保存刮擦的数据,请使用 scala-csv 库。

步骤 1:添加依赖关系

在 build.sbt 中添加以下内容

库依赖 = "com.github.tototoshi" %% "scala-csv" % "1.3.10"

步骤 2:将数据写入 CSV

使用 CSV 写入器导出产品:

实施网络抓取

要抓取多个页面,我们需要抓取分页链接。

为管理页面添加 Scala 集合:

import scala.collection.mutable._
缬氨酸 页面抓取 = 队列("https://www.scrapingcourse.com/ecommerce/page/1/")
缬氨酸 页面发现 = 设置(pagesToScrape.head)
缬氨酸 products = ListBuffer[Product]()

执行抓取逻辑:

while (pagesToScrape.nonEmpty) {
缬氨酸 page = pagesToScrape.dequeue()
缬氨酸 文件 = browser.get(page)
// 从页面中提取产品
缬氨酸 产品元素 = doc >> elementList("li.product")
productElements.foreach { element =>
缬氨酸 name = element >> text("h2")
缬氨酸 url = element >> element("a")>> attr("href")
缬氨酸 image = element >> element("img")>> attr("src")
缬氨酸 price = element >> text("span")
产品 = 产品(名称、url、图像、价格)
}
// 发现新网页
缬氨酸 分页链接 = doc >> elementList("a.page-numbers")
paginationLinks.foreach { link =>
缬氨酸 下一页 = link >> attr("href")
if (!pagesDiscovered.contains(nextPage)) {
pagesDiscovered = nextPage
pagesToScrape.enqueue(nextPage)
}
}
}

使用 Selenium 抓取 JavaScript 渲染的页面

对于动态页面,可以使用 Selenium 来控制无头浏览器。

步骤 1:添加 Selenium 依赖项

下载 Selenium 和 ChromeDriver。在你的环境中设置它们。

第 2 步:抓取动态内容

import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.By
import Scala.jdk.CollectionConverters._
对象 SeleniumScraper {
定义 main(args:数组[字符串):单位 = {
缬氨酸 options = new ChromeOptions()
options.addArguments(" - headless")
缬氨酸 driver = new ChromeDriver(选项)
driver.get("https://scrapingclub.com/exercise/list_infinite_scroll/")
缬氨酸 products = driver.findElements(By.cssSelector(".职位").asScala.map { 元素 =>
缬氨酸 name = element.findElement(By.cssSelector("h4")).getText
缬氨酸 url = element.findElement(By.cssSelector("a")).getAttribute("href")
缬氨酸 image = element.findElement(By.cssSelector("img")).getAttribute("src")
缬氨酸 price = element.findElement(By.cssSelector("h5")).getText
Product(名称、URL、图像、价格)
}
products.foreach(println)
driver.quit()
}
}

避免反机器人措施

为防止堵塞:

  1. 设置真实世界的用户代理。
  2. 通过 Bright Data 等工具使用旋转代理。
缬氨酸 浏览器 = JsoupBrowser("Mozilla/5.0", Proxy("您的代理 IP, 8080))

结论

恭喜您您已经学会了如何在 Scala 中执行 web scraping,包括静态和动态内容。通过本教程的学习,您现在已经了解了如何设置环境、提取数据、处理分页以及将结果导出为 CSV。请继续尝试,以提高技能并构建更高级的刮擦程序!

类似文章