使用 Watir Ruby 进行网页爬取:2025年最新教程
在本文中,我将指导你在 Ruby 中设置 Watir,并向你展示如何提取数据、处理分页、滚动页面和截图。让我们开始吧!
什么是Watir?
Watir(Ruby 中的网络应用程序测试)是一个 Ruby 库,可帮助实现网络浏览器的自动化测试。它能与 Chrome、Firefox 和 Edge 等浏览器交互,模仿人类的操作,如点击按钮、输入表单和在页面间导航。
虽然 Watir 最初是为网络应用程序测试而设计的,但它也可用于网络搜刮。Watir 可以呈现 JavaScript 并与动态内容交互,因此适用于需要类人交互(如点击或滚动)的网站搜刮。
如何在 Ruby 中设置 Watir
在开始刮擦之前,您需要在 Ruby 中设置 Watir。以下是安装所需工具和库的步骤。
步骤 1:安装 Ruby
首先,确保系统中安装了 Ruby。Ruby 是一种编程语言,Watir 就是基于这种语言构建的,你需要它来运行你的 scraper。您可以从官方网站下载 Ruby。
安装 Ruby 后,您还可以访问 gem,即 Ruby 的软件包管理器。
第 2 步:安装Watir
安装好 Ruby 后,就可以安装 Watir gem 了。打开终端,运行以下命令安装 Watir:
gem install watir
第 3 步:创建新的 Ruby 项目
为项目创建一个新文件夹,并初始化一个新的 Ruby 项目。这样就可以管理项目的依赖关系。在终端中,导航到存放项目的文件夹,然后运行以下命令:
捆绑 启动
这将在你的项目文件夹中创建一个 gem 文件。打开该文件,添加以下一行以包含 Watir gem:
宝 瓦特尔
接下来,运行命令安装 gem:
捆绑安装
制作简单的抓取器
现在,Watir 已设置完毕,让我们编写一个简单的抓取器,从网页中提取数据。
步骤 1:打开网站并获取 HTML
首先,你需要导入 Watir 库并创建一个新的浏览器实例。在本例中,我们将使用无头模式下的 Chrome 浏览器,这意味着浏览器将在后台运行,而不会打开图形用户界面。
下面是一个获取网页 HTML 内容的基本 Ruby 脚本:
require 瓦特尔
# 在无头模式下启动 Chrome 浏览器
browser = Watir::Browser.new :chrome, 无头: true
# 打开网站
browser.goto('https://www.example.com')
# 获取页面的 HTML 代码
html_content = browser.html
# 打印 HTML 内容
将 html_content
# 关闭浏览器
browser.close
步骤 2:提取特定数据
接下来,让我们从网页中提取特定数据。假设您想从产品页面中提取产品标题。您可以使用浏览器的方法来定位元素并提取其文本。
下面是一个从页面中提取产品标题的示例:
require 瓦特尔
# 在无头模式下启动 Chrome 浏览器
browser = Watir::Browser.new :chrome, 无头: true
# 打开网站
browser.goto('https://www.example.com/products')
# 提取产品标题
product_titles = browser.divs(类: 产品标题).map(&文本)
# 打印产品标题
puts product_titles
# 关闭浏览器
browser.close
在这个示例中,我们使用 divs 方法查找所有带有 product-title 类别的元素,然后提取它们的文本。
处理分页
许多网站对内容进行分页,这意味着产品列表分布在多个页面上。如果要抓取所有产品,就需要浏览所有页面。
让我们看看如何使用 Watir 处理分页。我们将反复点击 "下一步 "按钮,直到它不再可用。
require 瓦特尔
# 在无头模式下启动 Chrome 浏览器
browser = Watir::Browser.new :chrome, 无头: true
# 打开网站
browser.goto('https://www.example.com/products')
# 用于存储产品标题的列表
产品名称 = []
# 循环浏览页面
while browser.button(类: 下一个).exists?
# 从当前页面提取产品标题
标题 = browser.divs(类: 产品标题).map(&文本)
product_titles.concat(titles)
# 点击 "下一页 "按钮进入下一页
browser.button(类: 下一个点击
# Wait for the next page to load
browser.wait
end
# 打印产品标题
puts product_titles
# 关闭浏览器
browser.close
该脚本将继续点击 "下一步 "按钮,直到它不再存在为止。每次点击时,它都会从当前页面提取产品标题并将其添加到列表中。
无限滚动页面的滚动
有些网站使用无限滚动,当用户向下滚动页面时会加载新内容。要抓取此类网站,需要模拟滚动。
下面介绍如何使用 Watir 模拟滚动:
require 瓦特尔
# 在无头模式下启动 Chrome 浏览器
browser = Watir::Browser.new :chrome, 无头: true
# 打开网站
browser.goto('https://www.example.com/infinite-scroll')
# 用于存储产品标题的列表
产品名称 = []
# 设置初始滚动高度
previous_height = 0
# 继续滚动,直到新内容停止加载
环 do
# 提取产品标题
标题 = browser.divs(类: 产品标题).map(&文本)
product_titles.concat(titles)
# 向下滚动
browser.execute_script(window.scrollBy(0, 1000))
睡眠 2
# 获取新的滚动高度
new_height = browser.execute_script(返回 document.body.scrollHeight)
# 如果页面高度未变,则中断
break if new_height == previous_height
previous_height = new_height
end
# 打印产品标题
puts product_titles
# 关闭浏览器
browser.close
该脚本会一直向下滚动页面,直到页面高度不再增加,即不再加载内容。
使用 Watir 拍摄屏幕截图
有时,您可能希望在刮擦时截取屏幕截图。Watir 可以轻松截取整个页面、特定元素或可见区域的截图。
整页截图
要截取全页面截图,可以使用 Watir 内置的截图方法。不过,全页面截图可能需要第三方插件,因为默认情况下,Watir 只截取页面的可见部分。
require 瓦特尔
# 在无头模式下启动 Chrome 浏览器
browser = Watir::Browser.new :chrome, 无头: true
# 打开网站
browser.goto('https://www.example.com/product/1')
# 全屏截图
浏览器截图保存 Fullpage_screenshot.png
# 关闭浏览器
browser.close
特定元素截图
若要截取特定元素的屏幕截图,可以使用 Watir 继承的 Selenium screenshot_as 方法。
require 瓦特尔
# 在无头模式下启动 Chrome 浏览器
browser = Watir::Browser.new :chrome, 无头: true
# 打开网站
browser.goto('https://www.example.com/product/1')
# 获取目标元素
element = browser.div(类: 产品摘要)
# 给元素截图
screenshot_data = element.wd.screenshot_as(:png)
# 保存截图
File.open(元素截图.png, wb) { |文件| file.write(screenshot_data) }
# 关闭浏览器
browser.close
结论
因此,我们已经探索了在 Ruby 中使用 Watir 进行网络刮擦的方法。Watir 是一款用于动态网站搜刮的神奇工具。它具有出色的灵活性,允许你处理分页、滚动和截图等任务。虽然与其他刮擦工具相比,它的速度可能较慢,但它能与 JavaScript 繁重的网站进行交互,因此是你工具包中的必备工具。现在,你已经学会了基础知识,可以开始为各种项目构建网络刮擦工具,从跟踪产品价格到从无限滚动页面中提取数据。