如何使用 Geziyor 进行网络抓取

如何使用 Geziyor 进行网络抓取?

在本指南中,我将指导你设置 Geziyor、使用它来抓取数据,甚至将数据导出到 CSV 文件。最后,你将准备好使用 Geziyor!

什么是 Geziyor?

Geziyor 是一个 Golang-它是一个基于框架的工具,专为网络搜刮和抓取而设计。它专为希望从网站中提取数据的开发人员设计,无需手动处理 HTTP 请求、HTML 解析或并发问题。Geziyor 使用 Go 的 goroutines 来处理并发请求,让你可以一次高效地抓取多个网页。它还内置了管理 Cookie、缓存内容和将数据导出为各种格式的功能。

为什么使用 Geziyor?

Geziyor 有几大优势,使其成为网络搜刮的理想选择:

  1. 并发扫描: Geziyor 使用 Go 的 goroutines 简化了同时搜索多个页面的过程。
  2. 轻松解析 HTML Geziyor 使用支持 CSS 选择器的内置 HTML 解析器,让你可以轻松地从 HTML 元素中提取数据。
  3. 可定制: 您可以根据自己的需要修改框架,为特定的搜索任务添加自定义逻辑。
  4. 数据导出: Geziyor 支持将数据自动导出为各种格式,包括 CSV 和 JSON。
  5. 缓存和会话管理 Geziyor 提供内容缓存和会话管理,可更有效地处理重复刮擦。

现在,让我们深入了解如何使用 Geziyor 从网站上抓取数据。

为网络抓取设置 Geziyor

在开始使用 Geziyor 搜刮网站之前,您需要设置环境。Geziyor 需要 Go 1.22 或更高版本,因此请确保已安装最新版本的 Go。您可以从官方 转到网站.

步骤 1:创建 Go 项目

打开终端,为你的刮擦项目创建一个新目录。导航至该目录并初始化 Go 项目。

mkdir my_scraper
CD my_scraper
go mod init scraper

步骤 2:安装 Geziyor

要在项目中使用 Geziyor,需要使用 go get 命令进行安装:

go get -u github.com/geziyor/geziyor

此命令将下载 Geziyor 框架并安装到项目中。

步骤 3:创建 Scraper 代码

安装 Geziyor 后,在项目目录中新建一个名为 scraper.go 的文件。该文件将包含刮擦目标网站的代码。

步骤 4:首次申请获取 HTML

首先,让我们创建一个简单的 scraper,向网站发出 HTTP 请求并打印出页面的原始 HTML 内容。在 scraper.go 文件中,添加以下代码:

package main
import (
"fmt"
"github.com/geziyor/geziyor"
"github.com/geziyor/geziyor/client"
)
func main() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs:[]string{"https://www.example.com"},
ParseFunc: scraper、
RobotsTxtDisabled: true,
}).Start()
}
func 刮刀(g *geziyor.Geziyor, r *client.Response) {
fmt.Println("HTML内容:", r.HTMLDoc.Text())
}

在此代码中

  • StartURLs 指定了要抓取的 URL。
  • ParseFunc 是处理请求返回的 HTML 内容的函数。
  • RobotsTxtDisabled:true 表示 Geziyor 忽略 robots.txt 文件,该文件通常用于阻止网络爬虫。

在终端执行以下命令,运行这段代码:

 运行刮刀。

这将获取页面的 HTML 内容并打印到终端中。

步骤 5:从 HTML 中提取特定数据

既然知道了如何获取完整的 HTML 内容,我们就来提取页面中的特定数据。假设您想从一个电子商务网站中提取产品名称和价格。

要提取特定数据,请使用 CSS 选择器。让我们修改 scraper 函数,以提取产品名称和价格。下面是一个示例:

package main
import (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/geziyor/geziyor"
"github.com/geziyor/geziyor/client"
)
func main() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs:[]string{"https://www.example.com/products"},
ParseFunc: scraper、
RobotsTxtDisabled: true,
}).Start()
}
func 刮刀(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product").Each(func(i int, s *goquery.Selection) {
name := s.Find("h2.product-name").Text()
price := s.Find("span.product-price").Text()
fmt.Println("产品:"姓名 "Price:", price)
})
}

在此代码中

  • 我们使用 goquery 软件包来解析 HTML。
  • 利用带有 CSS 选择器的查找功能,可以从页面上的每个产品中提取产品名称和价格。

第 6 步:将数据导出到 CSV 文件

Geziyor 还能轻松地将搜刮到的数据导出到 CSV 文件。让我们修改刮板,将提取的产品数据保存到 CSV 文件中。

首先,导入 geziyor/export 模块,然后在 Geziyor 对象中添加 Exporters 选项:

package main
import (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/geziyor/geziyor"
"github.com/geziyor/geziyor/client"
"github.com/geziyor/geziyor/export"
)
func main() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs:[]string{"https://www.example.com/products"},
ParseFunc: scraper、
RobotsTxtDisabled: true,
出口商[]export.Exporter{
&export.CSV{FileName: "products.csv"},
},
}).Start()
}
func 刮刀(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product").Each(func(i int, s *goquery.Selection) {
name := s.Find("h2.product-name").Text()
price := s.Find("span.product-price").Text()
g.Exports <- map[string]界面{}{
"姓名": name、
"Price":价格、
}
})
}

给你

  • CSV 导出器会将提取的产品数据写入项目根目录中名为 products.csv 的文件。
  • 每个产品的名称和价格都会写入 CSV 文件。

第 7 步:处理分页和抓取多个页面

许多网站都有多个页面的内容需要刮除。Geziyor 可让您轻松跟踪分页链接并抓取多个页面。

让我们修改刮板功能,使其跟随页面上的 "下一步 "按钮,该按钮通常会链接到下一组产品。下面是实现分页的方法:

func 刮刀(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product").Each(func(i int, s *goquery.Selection) {
name := s.Find("h2.product-name").Text()
price := s.Find("span.product-price").Text()
g.Exports <- map[string]界面{}{
"姓名": name、
"Price":价格、
}
})
// 点击 "下一步 "按钮链接
if href, ok := r.HTMLDoc.Find("a.下一个").Attr("href"); ok {
g.Get(r.JoinURL(href), scraper)
}
}

在这段代码中,Geziyor 会在刮除当前页面后检查是否存在 "下一页 "按钮 (a.next)。如果存在按钮,它就会跟随链接进入下一页,并继续刮擦。

步骤 8:处理 JavaScript 渲染的页面

有些网站使用 JavaScript 动态加载内容。Geziyor 一开始并不支持 JavaScript 渲染,但你可以使用 GetRendered 函数等待 JavaScript 加载内容。

下面是一个如何抓取 JavaScript 渲染页面的示例:

func main() {
geziyor.NewGeziyor(&geziyor.Options{
StartRequestsFunc: requestFunc、
ParseFunc: scraper、
请求延迟 10,
}).Start()
}
func requestFunc(g *geziyor.Geziyor) {
g.GetRendered("https://www.example.com/javascript-page", g.Opt.ParseFunc)
}
func 刮刀(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product-info").Each(func(i int, s *goquery.Selection) {
fmt.Println("产品:", s.Find(".产品名称").Text()、 "Price:", s.Find(".产品价格").Text())
})
}

在此代码中

GetRendered 会等待 JavaScript 内容加载完毕,然后再继续刮擦。

为进一步提高刮擦可靠性,可考虑集成 Bright Data 的住宅代理 到你的 Geziyor 工作流程中。这些代理可以帮助绕过反僵尸措施,确保高速、不间断地提取数据,即使是最难处理的网站也不例外。对其他提供商感兴趣?查看我的 最佳住宅代理.

结论

Geziyor 是一个功能强大、简单易用的 Golang 网络搜刮框架。它具有并发刮擦功能、简单的 API 和内置的 HTML 解析您还可以使用该软件,快速设置并开始从网站上抓取数据。您还可以 CSV 和 JSON 等格式导出数据,并处理复杂的任务,例如 分页 和 JavaScript 渲染。如果你正在使用 Go,并且需要一个快速、可扩展的网络刮擦解决方案,Geziyor 绝对值得一试。

类似文章