Scala Web Scraping:逐步教程 2025
在本教程中,您将学习如何设置您的 Scala 环境中提取数据、处理分页内容,以及使用 Selenium 等工具刮擦动态网站。课程结束时,您将牢固掌握 Scala 网页抓取技术。
为什么选择 Scala 进行网络抓取?
Scala 是网络搜刮的实用选择,这是因为
- 语法简单,表现力强: 其简洁的语法使代码易于阅读和维护。
- 互操作性: Scala 可以利用 Jsoup、Selenium 和 HtmlUnit 等 Java 库。
- 职能能力: 它支持简化数据操作任务的函数式编程范式。
虽然 Python 和 Node.js Scala 在性能和灵活性之间实现了独特的平衡。
无代码网络抓取
如果你想在不使用任何代码的情况下搜刮网站,我建议你看看这些平台:
- Bright Data - 具有高度可扩展性和自动化的企业级刮板。
- Octoparse - 用户友好、灵活的数据提取与调度。
- ParseHub - 直观的点击式结构化数据搜刮器。
- Apify - 基于云的刮擦,并提供预建模板和应用程序接口。
- Web Scraper - 浏览器扩展,用于快速、简单地进行网络搜索。
有兴趣了解更多信息?查看全文 无代码网络搜刮器文章.我与任何供应商都没有任何关系!
前提条件和环境设置
要开始使用 Scala 进行刮擦,需要先准备好环境。
安装 Java 和 Scala
- Java: Scala 需要一个 Java 开发工具包 (JDK).如果尚未安装 JDK,请下载最新的 LTS 版本。
- 斯卡拉 下载并安装 Scala 3.x,使用 Coursier 软件包管理器。
- SBT: "(《世界人权宣言》) Scala 构建工具 (sbt) 是项目管理必不可少的工具。它与 Scala 安装程序捆绑在一起。
设置 Scala 项目
按照以下步骤创建一个新的 Scala 项目:
- 导航至要创建项目的目录。
- 运行以下命令生成新的项目模板:
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()
}
}
避免反机器人措施
为防止堵塞:
- 设置真实世界的用户代理。
- 通过 Bright Data 等工具使用旋转代理。
缬氨酸 浏览器 = JsoupBrowser("Mozilla/5.0", Proxy("您的代理 IP, 8080))
结论
恭喜您您已经学会了如何在 Scala 中执行 web scraping,包括静态和动态内容。通过本教程的学习,您现在已经了解了如何设置环境、提取数据、处理分页以及将结果导出为 CSV。请继续尝试,以提高技能并构建更高级的刮擦程序!