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.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
如果你没有看到任何错误信息,说明截图工作正常。你应该看到这样的内容:
如何使用Playwright代理?
你可以在浏览器的启动选项中使用Playwright代理。
首先,注册IPRoyal的住宅代理服务。然后,你可以访问客户区域,在那里你可以看到你的连接凭证:
在这种情况下,连接设置为随机化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地址的截图。
还有许多其他启动选项可以探索。你可以使用不同的用户代理、不同的位置、超时选项等。
此外,截图也有很多选项。你可以截取全屏截图、改变浏览器大小、截取特定元素的截图。
如何从元素中提取数据
你可以通过选择元素,然后将它们的文本内容保存到变量中来提取数据。
你可以使用`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”并输出其内容:
你可以将此文本保存在数据库中,也可以将其用于进一步的交互。
如何点击按钮和填写表单
你可以使用Playwright与页面进行互动,就像真实访客一样。因此,你可以点击按钮、填写表单、滚动页面、使用键盘、右键点击,甚至使用浏览器开发者工具。
与提取文本内容类似,你可以使用CSS代码查询一个元素,然后点击它或填写表单字段。
以下是如何进行这两项操作的示例:
button, err := page.QuerySelector(".DocSearch-Button") button.Click() input, err := page.QuerySelector("#docsearch-input") input.Fill("test")
注意,即使你不使用错误变量,也需要对其进行赋值。
结果如下:
常见问题
模块找到但不包含包
如果你运行 `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代码等。