用 Ruby 进行网络抓取:终极教程

Raluca Penciuc,2023 年 1 月 15 日

随着时间的推移,互联网的数据量只会继续增加。这种情况是任何人都无法控制的,但这真的是坏事吗?

特别是在过去的十年中,网络搜刮得到了极大的普及。要在当今的商业世界中取得成功,公司需要适当的战略,这就要求在短时间内获得大量信息。此外,对于开发人员来说,这也是提高编码技能和帮助公司的好方法。

如果你是 Ruby 团队的一员,但与网络搜刮没什么关系,那么本文将为你提供一个新的探索领域:制作自己的网络搜刮器。

了解网络搜索

让我们以价格比较平台为例。它的工作是从多个在线零售商那里获取众多商品的成本。但为什么仅限于实体产品呢?由于有了比价网站,航空和酒店业也变得更加方便消费者了。那么,这些神奇的网站或应用程序是如何运作的呢?当然是通过网络搜索!

你现在可能想知道:"我还能如何使用这些数据?让我们来看看网络搜索的一些实际应用:

这篇讨论网络刮擦的文章写得很好,提供了详细的说明和其他用例。

即使了解了网络刮擦程序的工作原理和潜在好处,也不容易创建它。网站有很多方法可以识别并阻止机器人访问其数据。

下面举几个例子:

  • 地理屏蔽:在查询其他地区的信息时,可能会显示特定地区的结果(如机票价格)。
  • IP 屏蔽:当网站发现你从某个 IP 地址重复发出请求时,就会阻止你或降低你的访问速度;
  • 蜜罐:人类无法看到蜜罐链接,但机器人可以;一旦机器人上当,其 IP 地址就会被屏蔽;
  • 验证码:人们可以相对较快地解决这些简单的逻辑问题,但刮擦程序往往会发现它们很困难;

要克服所有这些障碍并非易事。创建一个简单的机器人并不难,但创建一个优秀的网络搜刮器则更具挑战性。因此,在过去十年中,用于网络搜刮的 API 已成为最热门的话题之一。

使用 WebScrapingAPI 可以从任何网站收集 HTML 内容,我们前面提到的所有问题都将自动得到解决。此外,我们还使用亚马逊网络服务来确保速度和可扩展性。听起来很有趣吧?那么,不要只停留在声音上!您可以通过免费 WebScrapingAPI 试用版获得的 5000 次免费 API 调用亲自体验一下。

了解网络

要了解网络,就必须了解超文本传输协议(HTTP)。它解释了服务器和客户端如何进行通信。信息包含描述客户端及其处理数据方式的信息:方法、HTTP 版本和报头。

对于 HTTP 请求,网络刮擦工具使用 GET 方法从服务器检索数据。此外,还有一些高级方法,如 POST 和 PUT。这里详细介绍了 HTTP 方法,供你参考。

在 HTTP 头信息中,可以找到有关请求和响应的各种附加信息。对于网络搜索来说,这些信息非常重要:

  • User-Agent(用户代理):网络刮擦程序依靠该标头使其请求看起来更真实;它包含应用程序、操作系统、软件和版本等信息。
  • Cookie:服务器和请求可以交换机密信息(如身份验证令牌)。
  • Referrer:包含用户访问的源网站;因此,必须考虑这一事实。
  • 主机:用于标识连接的主机。
  • 接受:为服务器提供响应类型(如 text/plain、application/json)。

了解 Ruby

Ruby 是一种高级多范式编程语言,也是一种完全可解释的语言。这意味着程序代码以纯文本形式存储,并传输给执行它的解释器。

1995 年,Yukihiro Matsumoto(在 Ruby 社区也被称为 Matz)结合了 Perl、Lisp 和 Smalltalk 等不同编程语言的特点,创建了一种注重简洁性和生产力的新语言。

这是一种利基编程语言,其天然领域是网络应用程序。以下是在项目中使用这种语言的显著优势:

  • 它见效快。结合 Rails 框架,你可以相对快速地创建软件;这就是为什么初创公司主要喜欢用 Ruby 来迅速构建他们的 MVP(最小化可行产品)。
  • 它由不断壮大的Ruby 社区精心开发和维护。
  • 有用的工具和库(称为 gem)可确保在几乎任何情况下都能轻松遵循最佳编码实践。

另一方面,这些优势并不能使 Ruby 成为一种神奇的万能解决方案,适用于所有新软件。在做出决定之前,您还可以考虑该语言的这些特点:

  • 随着规模的扩大,使用 Ruby 构建的应用程序会变得越来越慢,从而导致可扩展性问题。
  • 它的天然领域是网络应用程序。因此,它不太适合桌面/移动应用程序
  • 由于使用解释器,面向对象代码的速度可能会更慢

制作自己的网络刮刀

现在,我们可以开始讨论提取数据了。首先,我们需要一个能提供有价值信息的网站。

步骤 1:设置环境

要构建 Ruby 网络搜刮器,我们首先需要确保具备所有先决条件:

  • Ruby 的最新稳定版本:查看其官方安装指南,选择最适合您操作系统的方法。
  • 集成开发环境:在本指南中,我们将使用 Visual Studio Code,因为它是轻量级的,不需要额外的配置,但你也可以选择任何你喜欢的集成开发环境。
  • Bundler:一种依赖管理 Ruby 工具(也称为 gem);
  • Watir:Selenium 支持的用于自动测试的 gem,因为它可以模仿用户在浏览器上的行为;
  • Webdrivers:Watir 推荐的一款软件,可自动下载浏览器实例的最新驱动程序;
  • Nokogiri:一款因能轻松分析网页而闻名的软件。它可以解析 HTML、XML,检测损坏的 HTML 文档,并通过 XPath 和 CSS3 选择器访问元素。

设置好 Ruby 环境后,在电脑的任意位置新建一个目录,然后用你选择的集成开发环境打开它。然后在终端窗口中运行以下命令,安装我们的第一个 gem:

> gem install bundler

现在,在项目根目录下创建一个名为 Gemfile 的文件。在这里,我们将添加其余的 gem 作为依赖项:

source 'https://rubygems.org'

gem 'watir', '~> 6.19', '>= 6.19.1'
gem 'webdrivers', '~> 4.6'
gem 'nokogiri', '~> 1.11', '>= 1.11.7'

现在回到终端窗口,运行以下命令安装我们声明的宝石:

> 捆绑安装

酷炫设置最后,只需创建一个 "scraper.rb "文件来保存我们的网络搜刮程序代码。无论我们在这里写了什么,都可以用命令来执行:

> ruby scraper.rb

第 2 步:检查要搜索的页面

很好,我们继续!导航到要抓取的页面,右击页面上的任意位置,然后点击 "检查元素"。这时会弹出开发者控制台,你可以看到网站的 HTML 代码。

博客图片

第 3 步:发送 HTTP 请求并抓取 HTML

现在,要在本地计算机上获取 HTML,我们必须使用 Watir 发送 HTTP 请求以返回文档。让我们回到集成开发环境,将这一想法付诸代码。

首先,编写我们需要的导入程序:

require 'watir'
require 'webdrivers'
require 'nokogiri'

然后,我们初始化一个浏览器实例,并导航到我们要抓取的网站。然后,我们访问 HTML 并将其传递给 Nokogiri 构造函数,它将帮助我们解析结果。

browser = Watir::Browser.new
browser.goto 'https://blog.eatthismuch.com/latest-articles/'
parsed_page = Nokogiri::HTML(browser.html)

File.open("parsed.txt", "w") { |f| f.write "#{parsed_page}" }

browser.close

我们还将结果写入一个名为 "parsed.txt "的文本文件,以便查看 HTML。收到响应后关闭连接很重要,因为进程将继续运行。

步骤 4:提取特定部分

因此,我们有一个 HTML 文档,但我们需要的是数据,这意味着我们应该将之前的响应解析为人类可读的信息。

让我们从最基本的开始,提取网站的标题。Ruby 的一个显著特点是,所有东西都是对象,只有极少数例外,这意味着即使是一个简单的字符串也可以有属性和方法。

博客图片

因此,我们只需通过解析页面对象的属性访问网站标题的值即可。

puts parsed_page.title

接下来,让我们提取网站上的所有链接。为此,我们将使用一种解析特定标记的通用方法,即css方法。

links = parsed_page.css('a')
links.map {|element| element["href"]}

puts links

我们还使用映射方法,只保留 HTML 中带有href属性的链接。

让我们举一个更现实的例子。我们需要从博客中提取文章、标题、地址和元描述。

博客图片

If you inspect one of the article cards, you can see that we can get the address and the article’s title through the link’s attributes. Also, the meta description is under a <div> tag with a specific class name.

Of course, there are many ways to perform this search. The one we’ll use will consist of looking for all the <div> tags with the td_module_10 class name and then iterating through each one of them to extract the <a> tags and the inner <div> tags with the td-excerpt class name.

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")

article_cards.each do |card|
title = card.xpath("div[@class='td-module-thumb']/a/@title")
link = card.xpath("div[@class='td-module-thumb']/a/@href")
meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")
end

是的,正如你可能已经猜到的,XPath 表达式就是实现这一功能的方法,因为我们要根据 HTML 元素的类名和升序来查找它们。

第 5 步:将数据导出为 CSV

当数据需要传递给另一个应用程序(在我们的例子中是一个文章聚合器)时,这种类型的提取会非常有用。因此,我们需要将解析后的数据导出到外部文件。

我们将创建一个 CSV 文件,因为它可以很容易地被另一个应用程序读取,并用 Excel 打开进行进一步处理。首先,再进行一次导入:

需要 'csv

然后,我们将以 "追加 "模式创建 CSV,并封装之前的代码,现在我们的刮擦器看起来就像这样:

CSV.open("articles.csv", "a+") do |csv|
csv << ["title", "link", "meta"]

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")
article_cards.each do |card|

title = card.xpath("div[@class='td-module-thumb']/a/@title")
link = card.xpath("div[@class='td-module-thumb']/a/@href")
meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")

csv << [title.first.value, link.first.value, meta.first.text.strip]
end
end

酷,就是这样!现在,我们可以以一种干净、不可怕、易于转发的方式查看所有解析数据了。

博客图片

结论和替代方案

现在我们已经完成了教程。祝贺你希望这篇文章能为你提供大量有关网络刮削的信息,帮助你更好地理解网络刮削。

显然,这项技术除了为文章聚合器提供动力外,还能发挥更多作用。关键在于找到正确的数据并对其进行分析,从而提出新的可能性。

然而,正如我在文章开头所说,网络刮擦器会面临许多挑战。除了能促进你的业务外,对于开发人员来说,使用自己的网络刮擦器来解决问题也是一个很好的学习机会。不过,如果你需要完成一个项目,你可能会希望降低成本(时间、金钱、人力)。

致力于解决这些问题的应用程序接口总是更容易使用。即使存在 Javascript 渲染、代理、CAPTHAs 和其他阻塞因素等障碍,WebScrapingAPI 也能克服所有这些障碍,并提供可定制的体验。如果您仍不放心,何不试试免费试用版?

新闻和更新

订阅我们的时事通讯,了解最新的网络搜索指南和新闻。

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

相关文章

缩图
指南如何抓取亚马逊产品数据:最佳实践与工具综合指南

通过我们的深入指南,探索刮擦亚马逊产品数据的复杂性。从最佳实践和亚马逊 Scraper API 等工具到法律注意事项,了解如何应对挑战、绕过验证码并高效提取有价值的见解。

Suciu Dan
作者头像
Suciu Dan
15 分钟阅读
缩图
使用案例在金融领域利用网络抓取另类数据:投资者综合指南

探索网络搜索在金融领域的变革力量。从产品数据到情感分析,本指南深入介绍了可用于投资决策的各类网络数据。

米赫内亚-奥克塔维安-马诺拉什
作者头像
米赫内亚-奥克塔维安-马诺拉什
13 分钟阅读
缩图
网络抓取科学轻松进行网络抓取:数据解析的重要性

了解如何通过数据解析、HTML 解析库和 schema.org 元数据有效地提取和组织数据,以便进行网络搜刮和数据分析。

Suciu Dan
作者头像
Suciu Dan
12 分钟阅读