在 Ruby 中使用 Selenium 进行网页抓取的完整指南
如果你正在寻找制作自己的网络抓取工具的替代方法,请查看 我们的最佳网络抓取工具文章.发现可简化数据提取项目的顶级工具。
让我们开始吧!
为什么使用 Selenium 进行网络抓取?
网络抓取 即自动从网页中提取数据。虽然可以使用 Nokogiri 等库完成基本的搜刮,但有些网站使用 JavaScript 来动态加载内容。传统的搜刮工具很难从这些网站中获取数据。
这就是 Selenium 有帮助。它允许 Ruby 脚本控制真实浏览器,与基于 JavaScript 的网站交互,并提取所需的数据。您还可以在 本条.
Selenium 在网络扫描方面的一些优势
- 处理动态内容:它可以与基于 JavaScript 的页面进行交互。
- 模仿人类行为:Selenium 可以点击按钮、滚动和填写表格。
- 跨浏览器支持:适用于 Chrome、Firefox、Edge 和其他浏览器。
- 灵活:支持多种编程语言,包括 Ruby。
在 Ruby 中设置 Selenium
第 1 步:安装 Selenium for Ruby
安装 Ruby
首先,检查是否安装了 Ruby。打开终端并键入
ruby -v
如果未安装 Ruby,请从 ruby-lang.org 下载。
安装所需Gems
Selenium 需要 selenium-webdriver gem。使用
gem install selenium-webdriver
现在可以开始刮削了。
第 2 步:创建 Selenium 网络抓取器
设置 Ruby 项目
为项目创建一个新文件夹:
mkdir 硒-鲁比-刮板
CD 硒-鲁比-刮板
在文件夹中新建一个 Ruby 文件:
触摸 scraper.rb
现在,用你喜欢的文本编辑器打开 scraper.rb。
初始化 Selenium WebDriver
在 scraper.rb 中编写以下代码:
require "selenium-webdriver"
# 设置浏览器选项
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument(" - headless") # 在无头模式下运行(无图形用户界面)
# Initialize WebDriver
driver = Selenium::WebDriver.for :chrome, options: options
# 打开目标网站
driver.navigate.to "https://scrapingclub.com/exercise/list_infinite_scroll/"
# 获取并打印页面源
将 driver.page_source
# 关闭浏览器
driver.quit
保存文件并运行:
ruby scraper.rb
如果一切正常,脚本将在终端中输出页面的 HTML 代码。
步骤 3:从网页中提取数据
现在,让我们来提取具体信息。目标网页包含产品列表。每个产品都有名称和价格。
修改刮板。rb:
require "selenium-webdriver"
# 确定产品结构
产品 = 结构.new(:name, :price)
# 设置浏览器选项
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument(" - headless")
# Initialize WebDriver
driver = Selenium::WebDriver.for :chrome, options: 选项
driver.navigate.to "https://scrapingclub.com/exercise/list_infinite_scroll/"
# 找到所有产品
产品 = []
html_products = driver.find_elements(:css, ".职位")
# 产品详细信息
html_products.each do |产品|
name = html_product.find_element(:css, "h4").text
price = html_product.find_element(:css, "h5").text
产品 << Product.new(name, price)
end
# 打印提取的数据
products.each { |product| 将 "姓名: #{product.name} (产品名称, Price: #{product.price}" }
# 关闭浏览器
driver.quit
再次运行脚本:
ruby scraper.rb
现在,你应该可以在终端中看到产品名称和价格。
步骤 4:处理无限滚动
有些网站使用无限滚动,即用户滚动时加载内容。Selenium 允许我们模仿这种行为。
修改刮板。rb:
# 向下滚动以加载更多产品
10.次 do
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
sleep(1) # 为内容加载留出时间
end
# 等待加载最后一个产品
等待 = Selenium::WebDriver::Wait.new(超时: 10)
等等。until { driver.find_element(:css, ".post:nth-child(60)") }
第 5 步:将数据保存为 CSV
如果以 CSV 等结构化格式存储,提取的数据会更有用。
修改 scraper.rb:
require "csv"
# 将数据保存为 CSV
CSV.open("products.csv", "wb", write_headers: true, headers: ["姓名", "Price"]) do |csv|
products.each { |product| csv << product }
结束
将 "保存到 products.csv 中的数据"
再次运行脚本,您将在项目文件夹中找到 products.csv 文件。
步骤 6:使用匿名代理
有些网站会通过检测来自同一 IP 的多个请求来阻止搜刮者。使用代理可以帮助避免被封。
修改 scraper.rb:
# 设置代理
proxy = "http://72.10.160.174:22669"
options.add_argument(" - proxy-server=#{proxy}" 代理服务器)
这将通过指定的代理路由请求。
步骤 7:避免被屏蔽
为了避免受阻:
- 使用 旋转代理.
- 设置随机用户代理。
- 使用 sleep().
- 使用以下服务 Bright Data 的扫描浏览器 以绕过反僵尸措施。
设置用户代理的示例
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
options.add_argument(" - user-agent=#{user_agent}")
对于搜索 API,请使用
driver.navigate.to "https://api.brightdata.com/v1/?apikey=YOUR_API_KEY&url=https://targetsite.com"
结论
Selenium 是自动化网络交互和提取数据的强大工具。不过,负责任地进行刮擦非常重要--遵守网站服务条款,避免服务器超负荷,并在可用时使用 API。
现在您已经掌握了 Ruby 中的 Selenium,可以尝试刮擦不同的网站并尝试高级交互!