Go 保护你的网页爬虫详解

现在,您已经构建了一个能够自动从各种网站收集信息的 web scraper,您应该做一些事情来确保它安全运行。应该采取一些重要的措施来保护你的网站。你应该知道,如果你没有完全的所有权,互联网上的任何东西都不应该被完全信任。

在本章中,我们将讨论确保 web 刮板安全所需的以下工具和技术:

当您对网站发出 HTTP 请求时,您是在计算机与目标服务器之间建立直接连接。通过这样做,您将向他们提供您的机器的公共 IP 地址,该地址可用于确定您的一般位置,以及您的互联网服务提供商ISP)。虽然这不能直接联系到你的确切位置,但如果它落入坏人之手,它可能会被恶意使用。记住这一点,最好不要将任何个人资产暴露给不受信任的服务器。

在远离物理位置的计算机上运行 web scraper,并进行某种远程访问,是将 web scraper 与个人计算机解耦的好方法。您可以在 web 上向各种提供商租用虚拟专用服务器VPS实例)。

一些比较著名的公司包括:

  • 亚马逊网络服务**AWS**
  • 微软 Azure
  • 谷歌云
  • 数字海洋
  • 利诺德

这些公司将允许您创建虚拟机,并为您提供访问实例的凭据。他们有各种各样的产品,这取决于你所需要的机器的大小,如果低于一定的大小,他们中的大多数都会提供一些免费的资源。

您将需要在这些机器上部署 web 抓取代码,并从 VPS 中运行该程序。本书不会详细介绍 Go 应用程序的打包和部署,但以下是一些入门技巧:

  • 安全复制协议SCP
  • 吉特
  • 安西布尔
  • 木偶
  • 码头工人
  • 库伯内特斯

通过在 VPS 上操作 web 刮板,您可以放心,如果您的机器暴露在外,它可以安全地销毁,而不会损坏您的个人计算机。此外,在 VPS 中运行刮板允许您在开始刮板更多网站时轻松扩展以满足您的需要。您可以启动多个 VPS 实例以并行运行刮板。

代理的作用是在系统顶部提供额外的保护层。代理的核心是一个服务器,它位于 web scraper 和目标 web 服务器之间,并在两者之间传递通信。您的 web scraper 向代理服务器发送请求,然后代理服务器将请求转发到网站。从网站的角度来看,请求只来自代理服务器,不知道请求的来源。有许多类型的代理可用,每个都有自己的优点和缺点

一些代理向公众开放使用。但是,它们可以被许多不同的人共享。这会危及您的可靠性,因为如果其他用户滥用代理,可能会危及您的 web 安全。速度是公共代理关注的另一个问题:通过代理的流量越多,可用带宽就越少。另一方面,这些代理是免费使用的,在测试和调试阶段可能很有用。

列出公共代理的几个站点如下所示:

由于可用的公共代理的成功率各不相同,您需要确保在将其投入生产之前进行研究。您将需要考虑这些代理是否可靠,并且可以达到您的目标网站。您还需要确保您的信息在通过它们连接时受到保护。

专用代理是确保只有您才能控制流经代理服务器的流量的好方法。有许多公司在按需和批量销售专用代理。一些值得考虑的公司包括:

  • 风暴代理
  • 火爆搜索引擎优化
  • 幽灵代理
  • 氧气实验室

选择一家公司时有一些事情要考虑。

专用代理的定价模式因公司而异。在大多数情况下,您按您使用的 IP 地址付费,并且您将能够使用您想要的 IP 地址。有许多公司拥有一个 IP 地址池,并将根据您的带宽向您收费。在这种定价模式中,您需要确保您拨打的电话尽可能最有效。

每个 IP 代理的成本在每月 1 美元到 6 美元之间。通常,批量购买会获得更大的折扣。一些公司也可能会限制您的带宽。

有时,代理的位置可能对您很重要。许多代理公司将其服务器分布在世界各地,以实现更大的覆盖范围。如果您在不同的国家/地区抓取网站,您可以通过位于该国家/地区的代理运行抓取程序,以避免防火墙或异常流量签名。不同的国家也可能有不同的法律,关于在该国允许通过互联网的内容,因此,在采用此方法之前,您应该始终咨询当地法律

您应该注意两种主要类型的代理:住宅代理和数据中心代理。住宅代理具有由在住宅区注册的 ISP 分配的 IP 地址。IP 地址与特定区域直接相关,许多网站可以根据这些 IP 地址估计您所在的位置。这就是谷歌分析如何知道你网站的网络流量来自哪里。从网络的角度来看,如果网络流量来自旧金山而不是伦敦,则可能会有所不同。如果您的内容因您的位置而发生变化,您可能需要在正确的位置使用住宅代理。

第二种类型的代理是数据中心代理。这些代理由与数据中心相关的 ISP(如 VSP 提供商)分配。创建新虚拟机时,分配给该机器的 IP 地址很可能是数据中心 IP。这些地址可能会被网站故意屏蔽,以防止非居民访问者访问。

在选择代理提供商时,匿名性应该被认为是列表中非常重要的一部分。并非所有代理在向目标服务器传递数据时都完全隐藏请求的原始源

透明代理为目标服务器提供有关您是谁的信息,在大多数情况下应避免使用。这些代理将 HTTP 头传递给目标服务器,例如X-Forwarded-For<your_ip_address>,以标识请求的原始源,以及Via<proxy_server>以标识代理本身。

匿名代理提供与透明代理相同的头,但它们可能提供虚假信息以隐藏您的真实身份。在这种情况下,目标服务器将知道连接是通过代理进行的,但请求的真正来源未知。

精英代理是您可以通过代理实现的最高匿名级别。Elite 代理不会转发任何有关原始源的信息,也不会透露请求来自代理。相反,web 服务器认为该请求是源自代理的 IP 地址的正常请求。

收到要使用的代理地址列表后,配置 Go HTTP 客户端非常简单。Go HTTP 客户端包含一个名为传输的对象。传输负责与 web 服务器的低级通信,包括打开和关闭连接、发送和接收数据以及处理 HTTP 1XX 响应代码。您可以通过设置一个函数来设置传输的Proxy()方法,该函数接受*http.Request,并将代理地址返回为*url.URL

以下是设置Proxy()功能的示例:

package main

import (
  "math/rand"
  "net/http"
  "net/url"
)

// Public proxies from https://hidemyna.me
// These proxies are subject to frequent change.
// Please replace them if necessary.
var proxies []string = []string{
 "http://207.154.231.208:8080",
 "http://138.68.230.88:8080",
 "http://162.243.107.45:8080",
}

func GetProxy(_ *http.Request) (*url.URL, error) {
  randomIndex := rand.Int31n(int32(len(proxies)) - int32(1))
  randomProxy := proxies[randomIndex]
  return url.Parse(randomProxy)
}

func main() {
  http.DefaultTransport.(*http.Transport).Proxy = GetProxy
  // Continue with your HTTP requests ...
}

GetProxy()函数在三个配置的代理之间随机选择,并将字符串转换为*url.URL。通过配置http.DefaultTransport.Proxy功能,每次使用http.DefaultClient时,GetProxy将决定使用哪个随机代理。通过检查*http.Request并根据提供的主机名返回所需的代理,您还可以为不同的主机使用不同的代理。

根据您的需要,您可能需要连接到一个虚拟专用网络VPN),以确保隐藏您的所有网络抓取流量。当代理通过屏蔽 web scraper 的 IP 地址提供一层保护时,VPN 也会屏蔽通过加密隧道在 scraper 和目标站点之间流动的数据。这将使 ISP 和任何其他有权访问您网络的人看不到您正在抓取的内容。

虚拟专用网络并非在所有国家/地区都是合法的。请遵守当地法律。

有许多公司提供 VPN 接入,成本通常在每月 5 美元到 15 美元之间

以下列出了一些推荐公司:

  • Vypr VPN
  • 快速 VPN
  • IP 虚拟专用网
  • 诺德 VPN

将 web scraper 配置为使用 VPN 与代理不同。VPN 通常需要特定的客户端将您的计算机连接到其网络,这不是通过代码完成的。其优点是,使用 scraper 编写的代码将独立于任何网络配置工作。不幸的是,如果不使用 shell 命令,您将无法将网络中的动态更改合并到代码中。

按照 VPN 提供商提供的说明连接到 VPN 网络。

当你在一个网站上爬行时,你可能并不总是知道你会在哪里结束。网页中的许多链接会将您带到您可能不像目标站点那样信任的外部站点。这些链接页面可能包含不相关的信息,或者可能被用于恶意目的。为您的 web scraper 定义边界以安全地在未知源中导航是很重要的。

域列入白名单是一个过程,通过该过程,您可以明确允许您的刮板访问某些网站。白名单上列出的任何站点都可以让 web scraper 访问,而未列出的任何站点都会自动跳过。这是一种简单的方法,可以确保您的 scraper 只访问一小部分特定站点的页面,这有助于收集非常集中的信息。通过只允许访问网站的路径,您可以更进一步。

使用 URL 和 path 包在 Go 中构建白名单相当简单。让我们以 Packt Hub 站点(上的文章索引为例 https://hub.packtpub.com/ )。这里发布的许多文章都包含指向外部网站的链接,目的是记录它们的信息来源。但是,如果我们只对在 Packt Hub 上查找其他文章感兴趣,那么我们只会将Hub.packtpub.comURL 列为白名单。

您可能遇到的示例文章链接如下所示:https://hub.packtpub.com/8-programming-languages-to-learn-in-2019/

使用 GoLang URL 包,我们可以查看主机名以确定它是否是值得以下链接:

parsedUrl, err := url.Parse("https://hub.packtpub.com/8-programming-languages-to-learn-in-2019")

if err != nil {
  panic(err)
}

site := parsedUrl.Host + parsedUrl.Path

然后,您可以使用path.Match()函数验证此匹配,如下所示:

doesMatch, err := path.Match("hub.packtpub.com/*", site)
if err != nil {
  panic(err)
}
if doesMatch {
// Continue scraping …
}

与白名单相反,黑名单定义了你的爬虫绝对不应该冒险的网站。您希望在此处包含的站点可能是您知道的不包含任何相关信息的地方,或者您只是对其内容不感兴趣。您还可以暂时将遇到性能问题的站点列入黑名单,例如大量 5XX 错误,如第 2 章请求/响应循环中所述。您可以按照与前面示例相同的方式将链接 URL 与其主机名相匹配。

唯一需要修改的是修改最后一个if块,如下所示,所以只有当doesMatch为 false 时才会运行:

if !doesMatch {
// Continue scraping …
}

在这一章中,我们回顾了许多不同的技术,以确保我们和我们的网络爬虫在浏览互联网时受到保护。通过使用 VPS,我们可以保护我们的个人资产免受恶意活动和互联网上的可发现性。代理还有助于限制有关互联网流量来源的信息,提供一层匿名性。VPN 通过为我们的数据流创建一个加密隧道,在代理上增加了额外的安全层。最后,创建白名单和黑名单可以确保你的爬虫不会深入未知和不受欢迎的地方。

第 7 章并发抓取中,我们将研究如何使用并发来增加我们的 web 抓取器的规模,而不增加合并额外资源的成本。

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

技术教程推荐

微服务架构核心20讲 -〔杨波〕

Service Mesh实践指南 -〔周晶〕

技术管理实战36讲 -〔刘建国〕

面试现场 -〔白海飞〕

Swift核心技术与实战 -〔张杰〕

视觉笔记入门课 -〔高伟〕

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

AI绘画核心技术与实战 -〔南柯〕

结构思考力 · 透过结构看表达 -〔李忠秋〕