Go 网页抓取入门教程

收集、解析、存储和处理数据是几乎每个人在软件开发生涯中都需要完成的基本任务。另一个挑战是,掌握能够极大提高应用程序开发的稳定性、速度和效率的新兴技术。为了深入了解如何实现这两个目标,我写了这本书。在这里,您可以找到在 Go 中执行 web 抓取的指南。本书从超文本传输协议HTTP)和超文本标记语言HTML的基础知识)到构建高度并发的分布式系统,涵盖了 web 抓取的广泛视角。

在本章中,您将看到关于以下主题的解释:

其核心是从互联网上为特定目的收集公开信息。它以许多不同的名称形成,例如:

  • 蜘蛛
  • 爬虫
  • 机器人

虽然这个名字可能带有负面的含义,但网络抓取的实践从互联网诞生以来就一直存在,并发展成各种技术和技术。事实上,有些公司的整个业务都建立在网络抓取上!

在许多不同的用例中,您可能需要构建 web 刮板。所有案例都围绕着这样一个事实,即互联网上的信息往往是不同的,但当收集到一个单独的包中时,可能非常有价值。通常,在这些情况下,收集信息的人与数据的生产者没有工作或业务关系,这意味着他们无法要求将信息打包并交付给他们。由于缺乏这种关系,需要数据的人必须依靠自己的手段来收集信息。

一个著名的 web 抓取用例是为网站编制索引,以构建搜索引擎。在这种情况下,网络爬虫将访问不同的网站并跟踪其他网站的引用,以便发现互联网上的所有可用内容。通过从页面收集一些内容,您可以通过将术语与您收集的页面内容相匹配来响应搜索查询。如果您跟踪页面是如何链接在一起的,并且根据与其他站点的连接数对最重要的页面进行排序,那么您也可以推荐类似的页面。

谷歌机器人是最著名的用于构建搜索引擎的网络刮板的例子。这是构建搜索引擎的第一步,因为它可以下载、索引和排列网站上的每个页面。它还将跟踪到其他网站的链接,这是它能够索引大部分互联网的方式。根据 Googlebot 的文档,scraper 每隔几秒钟就会尝试访问每一个网页,这要求他们每天达到数十亿页的估计值!

如果你的目标是建立一个搜索引擎,尽管规模要小得多,你会在这本书中找到足够的工具来收集你需要的信息。然而,本书将不涉及索引和排名页面,以提供相关的搜索结果。

另一个已知的用例是查找通过各种网站销售的特定产品或服务,并跟踪其价格。您将能够看到谁出售该商品,谁的价格最低,或者该商品最有可能在何时上市。您甚至可能对来自不同来源的类似产品感兴趣。让一个网络刮板定期访问网站来监控这些产品和服务将很容易解决这个问题。这与追踪航班、酒店和租车的价格非常相似。

像 Cammel(这样的网站 https://camelcamelcamel.com/ 围绕这样一个案例构建他们的商业模式。根据他们解释系统工作原理的博客文章,他们每半小时到几小时主动从多家零售商收集定价信息,涵盖数百万种产品。这允许用户查看跨多个平台的定价差异,以及在商品价格下跌时获得通知

你可以在上阅读他们的帖子 https://camelcamelcamel.com/blog/how-our-price-checking-system-works

这种类型的 web 爬虫需要非常仔细地解析 web 页面,以便只提取相关的内容。在后面的章节中,您将学习如何从 HTML 页面提取信息以收集这些信息。

数据科学家通常需要数十万个数据点来构建、训练和测试机器学习模型。在某些情况下,这些数据已经预打包并准备好使用。大多数情况下,科学家需要自己冒险建立一个自定义数据集。这通常是通过构建一个 web scraper 来从各种感兴趣的来源收集原始数据,并对其进行细化,以便以后可以对其进行处理来实现的。这些网络爬虫还需要定期收集新数据,用最相关的信息更新预测模型。

数据科学家遇到的一个常见用例是确定人们对特定主题的感受,称为情绪分析。通过这个过程,一家公司可以寻找围绕其产品之一或其整体存在的讨论,并获得普遍共识。为了做到这一点,必须对模型进行正面评论和负面评论的培训,这可能需要数千条个人评论才能形成一个平衡的培训集。构建一个网络刮板,从相关论坛、评论和社交媒体网站收集评论,将有助于构建这样一个数据集。

这些只是谷歌、Mozenda 和Cheapflights.com等推动大型企业发展的网络爬虫的几个例子。还有一些公司会免费从网络上获取你需要的任何可用数据。为了在如此大规模的情况下运行 scraper,您需要使用一种快速、可扩展且易于维护的语言。

Go 是谷歌员工在 2007 年创建的一种编程语言。在创建时,目标是构建一种快速、安全和简单的语言。Go first 于 2012 年正式发布了其 1.0 版本,是当今发展最快的编程语言之一。根据Stack Overflow 2018 开发者调查,Go 在最受欢迎的语言中排名前五,在最受欢迎的语言中排名前三。

Go 为许多大型 web 基础设施平台和工具提供了动力,如 Docker、Kubernetes 和 Terraform。这些平台使公司能够构建支持财富 500 强公司的生产规模产品。这主要是 Go 语言设计的结果,使其简单明了。许多其他使用 Go 进行开发的公司经常吹嘘其性能优于其他语言。

Go 编程语言的体系结构及其标准库使其成为构建快速、可扩展和可维护的 web scraper 的最佳选择。Go 是一种静态类型的垃圾收集语言,其语法更接近 C/C++。对于来自面向对象编程语言的开发人员来说,这种语言的语法将非常熟悉。Go 还有一些函数编程元素,例如高阶函数。综上所述,Go 非常适合抓取网页的主要原因有三个:

速度是 Go 编程语言的主要目标之一。许多基准测试的速度与 C++、java 和 RISE 的速度相当,并且领先于 Python 和 Ruby 等语言。基准测试应该总是带着一点怀疑的态度来考虑,但 Go 作为一种具有极高性能数字的语言,一直都很突出。这种速度通常与低资源占用相结合,因为运行时非常轻量级,并且不使用太多 RAM。这样做的一个潜在好处是能够在较小的机器上运行 Go 程序,或者在同一台机器上运行多个实例,而不会产生很大的开销。这降低了在更大范围内操作刮纸机的成本。

这种速度在构建 web scraper 时具有内在的重要性,并且在更大的范围内变得更加明显。举个例子,一个网页刮板需要两分钟才能刮掉一页;理论上你一天可以处理 720 页。如果您能够将该时间减少到每页一分钟,那么您将使每天的页数翻倍,达到 1440 页!更好的是,这将以同样的成本完成。Go 的速度和效率让你用更少的钱做更多的事。

影响其速度的一个因素是 Go 是静态类型的。这使得该语言成为大规模构建系统的理想语言,并且对程序在生产环境中的运行方式充满信心。此外,由于 Go 程序是用编译器构建的,而不是用解释器运行,因此它允许您在编译时捕获更多错误,并大大减少可怕的运行时错误。

这个安全网也延伸到 Go 垃圾收集器。垃圾收集意味着您不需要手动分配和释放内存。这有助于防止由于错误处理代码中的对象而导致的内存泄漏。有些人可能会认为垃圾收集会妨碍应用程序的性能,但是,Go 垃圾收集器在干扰代码执行方面只增加很少的开销。许多消息来源报告说,Go 的垃圾收集器导致的暂停不到一毫秒。在大多数情况下,为了避免将来追查内存泄漏,所付出的代价很小。这当然适用于 web scraper。

随着 web scraper 的规模和复杂性的增长,跟踪处理过程中可能出现的所有错误可能会变得困难。考虑到每天处理数千个 web 页面的规模,一个小错误可能会对数据收集造成重大影响。归根结底,丢失数据就是金钱损失,因此在系统运行之前尽可能多地防止已知错误对系统至关重要。

除了 Go 编程语言本身的体系结构之外,标准库还提供了使 web 抓取变得容易所需的所有正确包。Go 在net/http包中提供了一个内置的 HTTP 客户机,该客户机具有完全的开箱即用功能,但也允许进行大量定制。发出 HTTP 请求非常简单,如下所示:

http.Get("http://example.com")

net/http包的另一部分是用于构造 HTTP 请求、HTTP 响应和所有 HTTP 状态代码的实用程序,我们将在本书后面深入讨论。您很少需要任何第三方软件包来处理与 web 服务器的通信。Go 标准库还提供了一些工具,可以帮助分析 HTTP 请求、快速使用 HTTP 响应体以及调试 web 应用程序中的请求和响应。net/http包中的 HTTP 客户端也是非常可配置的,允许您调整特殊参数和方法以满足您的特定需求。通常不需要这样做,但如果遇到这种情况,该选项是存在的。

这种简单性将有助于消除编写代码时的一些猜测。您不需要确定发出 HTTP 请求的最佳方式;Go 已经解决了这个问题,并为您提供了完成工作所需的最佳工具。即使您需要的不仅仅是标准库,Go 社区也已经构建了遵循相同简单文化的工具。这无疑使集成第三方库成为一项容易的任务

在开始构建 web 刮板之前,您需要适当的工具。为编写 Go 代码设置开发环境相对简单。您不需要安装很多外部工具,并且支持所有主要的计算平台。对于本章中列出的所有工具,您可以找到针对 Windows、Mac 和 Linux 系统的单独说明。此外,由于我们将使用的所有工具都是开源的,因此您将能够访问源代码,并在必要时根据您的特定需要构建它。

首先,您需要在您的机器上安装 Go 编程语言和工具。安装过程因操作系统而异,请按照中的说明进行操作 https://golang.org/doc/install 。在安装页面上,您将找到平台的 Go 下载说明以及最低操作系统要求。

您最好多花些时间浏览 Go 编程语言网站,了解更多关于该语言的信息,阅读教程,并查找标准库文档。

这是 Go 网站安装页面的屏幕截图,包含在计算机上安装 Go 所需的所有说明:

如果您愿意,也可以从源代码构建语言。在安装结束时,您应该已经构建了所有 Go 库、Go 命令行和一个简单的 helloworld 项目,以确保所有内容都已正确安装。

在整个安装测试过程中,始终遵循说明是非常重要的。关于$GOPATH,Go 有时会有点棘手。设置$GOPATH后,您必须确保完成以下操作:

  • 您拥有所需的srcbinpkg目录
  • 所有源代码都包含在src目录中
  • src目录中的文件夹结构模仿您希望的包名

通过完成测试部分,您将在将来避免很多挫折。

自版本 1.11 发布以来,Go 团队已宣布支持 Go 模块,允许您在$GOPATH之外开发。因为这个特性仍然被认为是实验性的,所以这本书将继续使用 Go 开发的经典方法。

您还需要安装 Git 版本控制软件。这将用于将第三方库下载到您的计算机上。go get命令依赖于系统上安装的 Git 来下载库并将它们直接安装到$GOPATH中。您也可以免费使用 Git 下载每章的示例。本书中的所有示例都将使用 GitHub 上提供的开源库。您可以按照中的说明为您的系统安装 Githttps://git-scm.com/download

Git 命令行工具是用于版本控制、存储和检索源代码的大量命令集。这些命令是 GitHub 网站的基础。强烈建议您学习如何使用该工具与 GitHub 站点交互,而不是通过 UI。

以下是 Git 下载页面的屏幕截图,其中包含各自操作系统的链接:

您需要的第二个工具是一个好的文本编辑器或集成开发环境IDE)。如果您不熟悉 IDE,那么它们基本上是为编写特定编程语言的应用程序而定制的文本编辑器。Go 的一个著名 IDE 是 JetBrains 的 GoLand。它内置了对语法突出显示、运行和调试模式、内置版本控制和包管理的支持。

GoLand 的试用期为 30 天,之后您必须购买许可证才能继续使用。

以下是 GoLand IDE 显示标准Hello World程序的屏幕截图:

如果您更喜欢使用文本编辑器,那么有很多可用的插件,它们通常都有 Go 插件,使开发更容易。目前可用的两个最好的文本编辑器是 Microsoft 的 Visual Studio 代码和 GitHub 的 Atom。这两个编辑器都是通用编辑器,它们还具有用于语法突出显示、构建和运行 Go 代码的插件。通过这种方式,您可以添加所需内容,而无需太多开销。

此屏幕截图是相同的Hello World程序,显示在 Visual Studio 代码中:

最后,Hello World程序的 Atom 版本如下图所示:

VisualStudio 代码和 Atom 都是构建 Go 应用程序的最佳选择,因为社区对插件的支持程度很高,我强烈建议安装这些插件。或者,您可以在任何文本编辑器中编写 Go 程序,并使用终端或命令提示符和标准 Go 命令运行代码。

你需要一个可靠的互联网连接。正确的互联网连接将消除连接到不同网站的错误。如果您正在构建一个位于网络防火墙后面的 web scraper,或者如果您的网络连接很弱,那么访问本书中用作示例的一些站点可能会遇到困难。

在本章中,您学习了构建 web 刮板的一些用例以及与之相关的业务示例。您还学习了 Go 编程语言的一些优点,并创建了一个适合构建 web scraper 的开发环境。这些步骤应该可以帮助您开始这条道路

第 2 章请求/响应循环中,我们将了解如何在 Go 中与 web 服务器进行通信。我们将学习 web 刮板如何与 web 服务器进行通信的基础知识。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

深入浅出gRPC -〔李林锋〕

Redis核心技术与实战 -〔蒋德钧〕

人人都用得上的写作课 -〔涵柏〕

A/B测试从0到1 -〔张博伟〕

玩转Vue 3全家桶 -〔大圣〕

深入浅出分布式技术原理 -〔陈现麟〕

零基础GPT应用入门课 -〔林健(键盘)〕

结构思考力 · 透过结构看问题解决 -〔李忠秋〕

云时代的JVM原理与实战 -〔康杨〕