in

Golang网页爬虫构建的初学者指南

Golang网页爬虫构建的初学者指南

Golang,又称Go,是一种以简单语法和卓越性能著称的编程语言。实际上,它的性能甚至可以超越一些常用的网页爬虫语言,如Python、JavaScript(Node)和Ruby。

在本指南中,我将逐步介绍如何创建一个Golang网页爬虫,并避免被封锁。为此,我将使用一些知名工具,如Golang Playwright和住宅代理服务。


网页爬虫的用途是什么?

网页爬虫可以大规模地收集数据。你可以用它来监控价格、收集新闻、设置职位提醒、检查库存水平、监控客户评论等。

总体来说,网页爬虫可以自动化任何真人操作,因此你可以完成任何手动操作的任务。你可以获取数据、处理数据,甚至与网站互动,点击链接、填写表单和截取屏幕截图。


Golang中的网页爬虫是什么?

在Golang中,网页爬虫是指自动从那些未公开数据的网站上提取数据。因此,你可以使用Golang像普通人一样从网站读取数据,但可以大规模地进行。


Golang适合做网页爬虫吗?

Golang是做网页爬虫的绝佳选择。一些测试表明,Golang的性能可以超过Python和Ruby。而且,Golang上手非常容易。

总的来说,网页爬虫有很多优秀的编程语言选择。关键在于选择你熟悉和擅长的工具。


如何用Golang制作网页爬虫?

你可以使用Golang的库来连接网站、下载其代码,并从页面中提取数据。

你可以使用像Playwright这样的库,通过无头浏览器连接到网站。这些是由代码控制的常规浏览器,因此你可以像普通访客一样加载页面,但可以使用代码命令从中提取数据。

什么是Gocolly?

Gocolly是一个流行的Golang网页爬虫框架。使用它,你可以创建爬虫、蜘蛛和爬取器。它速度快且易于使用,但只能用于静态内容。

因此,如果目标网站有动态内容,你需要手动检查JS请求并从中爬取内容。

什么是Golang Playwright?

Golang Playwright是一个用于Go的浏览器自动化库。它是一个基于Playwright的社区支持项目,Playwright是微软创建的跨语言自动化库。

它允许你使用代码与任何浏览器进行编程交互。因此,你可以从任何真实访客能看到的网站中提取数据。

这种方法灵活,可以在不被封锁的情况下爬取内容。由于无头浏览器本质上是一次真实的用户访问,因此很难检测到网页爬虫的存在。

 如何避免网页爬虫被封锁?

你可以通过使用无头浏览器住宅代理来避免网页爬虫被封锁。

虽然网页爬虫是合法的,但网站所有者会尝试阻止它们。因此,他们会尝试检测任何看起来不像真实访客的请求。

通常,他们会检查连接请求是否看起来像真人请求,是否包含浏览器通常包含的元数据,并且是否以真实浏览器的方式渲染页面。然后,他们会检查这些用户是否访问了许多页面,或者是否在多天内同时访问页面。

你可以使用无头浏览器,如Golang Playwright,来创建你的Golang网页爬虫,不引起任何怀疑。因为请求确实来自真实浏览器,所以网站所有者无法真正判断这是自动化请求。这与其他可能不包含元数据或无法正确渲染页面的爬虫库不同。

此外,你可以使用如IPRoyal(之后将以它为例来进行介绍)之类的住宅代理服务。通过它,你可以每次使用不同的IP地址加载页面。因此,网站所有者无法判断你是在加载一个页面还是一千个页面。他们也无法知道你是否在固定时间表内加载这些页面,因为每个请求都来自不同的地址。


Golang网页爬虫 – 分步指南

让我们详细探讨如何创建你的Golang网页爬虫。

以下是你需要执行的主要步骤:

1. 安装Go和一个集成开发环境(IDE)
2. 创建一个新的go.mod文件
3. 安装Golang Playwright
4. 创建你的main.go文件
5. 截取屏幕截图
6. 使用Playwright代理
7. 提取数据
8. 点击按钮
9. 填写表单

如何安装Golang?

你可以在MacOS上使用Homebrew安装Golang:

brew install go

你可以使用Chocolatey在Windows上安装Golang:

choco install golang

如果你想在Linux或其他操作系统上安装Go,你可以使用他们的安装包。

一般来说,在你安装Go之后,你可以运行这个命令来确保一切正常:

go version

然后,如果你想运行你的一个文件,你可以运行这个命令:

go run [filename]

将[filename]替换为你的文件。例如,运行main.go。

然后,你需要安装一个IDE来编写代码。你可以使用任何你想要的IDE。在本教程中,我们使用VS Code。转到Extensions部分并安装Go扩展:

go extension download

创建新的go.mod文件

如果你刚开始接触Golang,这一步可能会有些困惑。但简单来说,在Go中,你需要创建模块来构建代码。而要开始一个模块,你需要一个go.mod文件。

这个文件包含了模块描述、Go版本以及所需的包信息。

首先,导航到Go文件夹(通常是你的用户文件夹中的/go),并在其中创建一个名为scraper的新文件夹。然后,在终端中导航到这个文件夹并运行以下命令:

go mod init iproyal.com/golang-web-scraper

如何安装Go Playwright

现在你需要安装Playwright及其一些依赖项。你可以使用以下命令来完成安装:

go get github.com/playwright-community/playwright-go

然后运行这个命令:

go run github.com/playwright-community/playwright-go/cmd/playwright install --with-deps

如果你计划使用其他库,现在可以一并安装。

截取网站截图

现在是时候开始使用你的Golang网页爬虫了。在你的scraper文件夹中创建一个新的main.go文件。

然后在文件中添加以下代码:

package main

import (
    "log"
    "github.com/playwright-community/playwright-go"
)

func main() {
    pw, err := playwright.Run()
    if err != nil {
        log.Fatalf("could not launch playwright: %v", err)
    }
    browser, err := pw.Chromium.Launch()
    if err != nil {
        log.Fatalf("could not launch Chromium: %v", err)
    }
    page, err := browser.NewPage()
    if err != nil {
        log.Fatalf("could not create page: %v", err)
    }
    if _, err = page.Goto("https://ipv4.icanhazip.com/", playwright.PageGotoOptions{
        WaitUntil: playwright.WaitUntilStateNetworkidle,
    }); err != nil {
        log.Fatalf("could not goto: %v", err)
    }
    if _, err = page.Screenshot(playwright.PageScreenshotOptions{
        Path: playwright.String("screenshot.png"),
    }); err != nil {
        log.Fatalf("could not create screenshot: %v", err)
    }
    if err = browser.Close(); err != nil {
        log.Fatalf("could not close browser: %v", err)
    }
    if err = pw.Stop(); err != nil {
        log.Fatalf("could not stop Playwright: %v", err)
    }
}

代码各部分的功能解析

  • package main – 声明主包。
  • import {} – 加载依赖项。
  • func main() – 主函数,当你从终端运行时,Go会执行这个函数。
  • pw, err := playwright.Run() – 创建一个新的Playwright实例并保存在pw变量中。:= 运算符用于创建新变量。Go允许函数返回多个值,所以如果有错误,Playwright函数会返回一个错误并保存在err变量中。
  • if err != nil {} – 你会在所有代码块中看到这个检查,这是为了更好的错误处理。每个代码块都会测试前一个函数是否有错误,并告诉你错误发生的位置。
  • browser, err := pw.Chromium.Launch() – 启动Chromium浏览器。你也可以使用其他浏览器,如Firefox。
  • page, err := browser.NewPage() – 打开一个新的浏览器标签页,并将其保存在page变量中。
  • page.Goto(“https://ipv4.icanhazip.com/”, playwright.PageGotoOptions{}) – 相当于在URL栏中输入一个地址。
  • page.Screenshot(playwright.PageScreenshotOptions{}) – 截取屏幕截图并保存为“screenshot.png”。
  • browser.Close() – 关闭浏览器及所有标签页。
  • pw.Stop() – 停止Playwright。

你可以使用以下命令运行你的Golang网页爬虫:

go run main.go

如果你没有看到任何错误信息,说明截图工作正常。你应该看到这样的内容:

website screenshot with IP address

 

如何使用Playwright代理?

你可以在浏览器的启动选项中使用Playwright代理。

首先,注册IPRoyal的住宅代理服务。然后,你可以访问客户区域,在那里你可以看到你的连接凭证:

IPRoyal dashboard with randomized IP addresses

在这种情况下,连接设置为随机化IP地址,因此每次连接时你都会获得一个新的IP地址。现在,你可以在你的Golang网页爬虫中使用这些数据。

将以下代码:

browser, err := pw.Chromium.Launch()

替换为:

proxyOptions := playwright.BrowserTypeLaunchOptionsProxy{
        Server:   playwright.String("geo.iproyal.com:12321"),
        Username: playwright.String("username"),
        Password: playwright.String("password"),
    }
    browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
        Proxy: &proxyOptions,
    })

你会注意到这里使用了两个新组件。`proxyOptions`变量存储了代理的详细信息。别忘了将用户名和密码替换为你的真实凭证。

然后,你可以在`BrowserTypeLaunchOptions`中使用这些选项。

再次运行你的代码,你应该会看到一个使用不同IP地址的截图。

website screenshot with a proxy IP address

还有许多其他启动选项可以探索。你可以使用不同的用户代理、不同的位置、超时选项等。

此外,截图也有很多选项。你可以截取全屏截图、改变浏览器大小、截取特定元素的截图。

如何从元素中提取数据

你可以通过选择元素,然后将它们的文本内容保存到变量中来提取数据。

你可以使用`QuerySelectorAll`或`QuerySelector`方法,通过CSS代码选择元素。

以下是一个示例,使用这个代码块替换之前的`GoTo`行:

if _, err = page.Goto("https://playwright.dev/", playwright.PageGotoOptions{
        WaitUntil: playwright.WaitUntilStateNetworkidle,
    }); err != nil {
        log.Fatalf("could not goto: %v", err)
    }

    herotitle, err := page.QuerySelector(".hero__title")
    text, err := herotitle.TextContent()
    fmt.Print(text)

这段代码加载剧作家站点,然后选择元素“”。Hero__title”并输出其内容:

website .hero__title output

你可以将此文本保存在数据库中,也可以将其用于进一步的交互。

如何点击按钮和填写表单

你可以使用Playwright与页面进行互动,就像真实访客一样。因此,你可以点击按钮、填写表单、滚动页面、使用键盘、右键点击,甚至使用浏览器开发者工具。

与提取文本内容类似,你可以使用CSS代码查询一个元素,然后点击它或填写表单字段。

以下是如何进行这两项操作的示例:

button, err := page.QuerySelector(".DocSearch-Button")
    button.Click()

    input, err := page.QuerySelector("#docsearch-input")
    input.Fill("test")

注意,即使你不使用错误变量,也需要对其进行赋值。

结果如下:

clicking on buttons and filling forms with Go


常见问题

模块找到但不包含包

如果你运行 `go install [url]` 时遇到类似的错误,尝试直接指向包的URL。例如,不要使用 `https://github.com/playwright-community/playwright-go@latest`,而是使用 `https://github.com/playwright-community/playwright-go/cmd/playwright@latest`。

$GOPATH/go.mod 存在但不应该存在

这通常发生在你试图在主 `/go` 文件夹中创建 `go.mod` 文件时。确保你在一个子文件夹中创建它,如果那里有任何 `go.mod` 文件,删除它。

无法将 “text”(无类型字符串常量)用作结构字面量中的 *string 值*

你可能会在Golang代码中遇到这个和类似的错误。你需要用 `playwright.String()` 和其他类似方法来包装字符串,以确保它们被正确处理。

同样,对于传递对象,比如代理选项,你需要在前面加上 `&`。所以,不要这样写:

browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
        Proxy: proxyOptions,
})

而是这样写:

browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
        Proxy: &proxyOptions,
})

结    论

现在,你学会了如何使用Playwright来创建一个Golang网页爬虫。你可以用它来自动化数据收集和操作。不过,这只是一个开始。你还可以执行更复杂的操作,比如视频屏幕录制、从多个页面加载数据、保存PDF、在页面上执行JS代码等。

Written by 河小马

河小马是一位杰出的数字营销行业领袖,广告中国论坛的重要成员,其专业技能涵盖了PPC广告、域名停放、网站开发、联盟营销以及跨境电商咨询等多个领域。作为一位资深程序开发者,他不仅具备强大的技术能力,而且在出海网络营销方面拥有超过13年的经验。