首页  >  文章  >  后端开发  >  网页抓取

网页抓取

王林
王林原创
2024-09-10 14:30:32655浏览

第一步

首先我们必须安装Go,下载和安装Go的说明。

我们为项目创建一个新文件夹,移动到该目录并执行以下命令:

go mod init scraper

? go mod init 命令用于在运行目录中初始化一个新的 Go 模块,并创建一个 go.mod 文件来跟踪代码依赖关系。依赖管理

现在让我们安装 Colibri:

go get github.com/gonzxlez/colibri

? Colibri 是一个 Go 包,它允许我们使用 JSON 中定义的一组规则来抓取和提取网络上的结构化数据。存储库


提取规则

我们定义了 colibri 用于提取我们需要的数据的规则。文档

我们将向 URL https://pkg.go.dev/search?q=xpath 发出 HTTP 请求,其中包含与 Go Packages 中 xpath 相关的 Go 包的查询结果。

使用网络浏览器中包含的开发工具,我们可以检查页面的 HTML 结构。浏览器开发工具有哪些?

Web Scraping en Go

<div class="SearchSnippet">
   <div class="SearchSnippet-headerContainer">
      <h2>
         <a href="/github.com/antchfx/xpath" data-gtmc="search result" data-gtmv="0" data-test-id="snippet-title">
         xpath
         <span class="SearchSnippet-header-path">(github.com/antchfx/xpath)</span>
         </a>
      </h2>
   </div>
   <div class="SearchSnippet-infoLabel">
      <a href="/github.com/antchfx/xpath?tab=importedby" aria-label="Go to Imported By">
      <span class="go-textSubtle">Imported by </span><strong>143</strong>
      </a>
      <span class="go-textSubtle">|</span>
      <span class="go-textSubtle">
      <strong>v1.2.5</strong> published on <span data-test-id="snippet-published"><strong>Oct 26, 2023</strong></span>
      </span>
      <span class="go-textSubtle">|</span>
      <span data-test-id="snippet-license">
      <a href="/github.com/antchfx/xpath?tab=licenses" aria-label="Go to Licenses">
      MIT
      </a>
      </span>
   </div>
</div>

表示查询结果的 HTML 结构片段。

然后我们需要一个选择器“packages”,它将在 HTML 中查找类 SearchSnippet 类的所有 div 元素,从这些元素中选择一个选择器“ name” 将采用元素 h2 内元素 a 的文本和选择器“path” 将采用 a 元素的 href 属性的值h2 元素 。换句话说,“名称”将采用Go包的名称,“路径”将采用包的路径:)

{
    "method": "GET",
    "url":    "https://pkg.go.dev/search?q=xpath",
    "timeout": 10000,
    "selectors": {
        "packages": {
            "expr": "div.SearchSnippet",
            "all": true,
            "type": "css",
            "selectors": {
                "name": "//h2/a/text()",
                "path": "//h2/a/@href"
            }
        }
    }
}
  • method: 指定 HTTP 方法(GET、POST、PUT...)。
  • url: 请求的 URL。
  • 超时: HTTP 请求的超时(以毫秒为单位)。
  • 选择器:选择器。
    • “packages”: 是选择器的名称。
      • expr: 选择器表达式。
      • all: 指定应找到与表达式匹配的所有元素。
      • type: 表达式的类型,在本例中为 CSS 选择器。
      • 选择器:嵌套选择器。
        • “name”“path” 是选择器的名称,它们的值是表达式,在本例中是 XPath 表达式。

Go 中的代码

我们准备创建 scraper.go 文件,导入必要的包并定义主函数:

package main

import (
    "encoding/json"
    "fmt"

    "github.com/gonzxlez/colibri"
    "github.com/gonzxlez/colibri/webextractor"
)

var rawRules = `{
    "method": "GET",
    "url":    "https://pkg.go.dev/search?q=xpath",
    "timeout": 10000,
    "selectors": {
        "packages": {
            "expr": "div.SearchSnippet",
            "all": true,
            "type": "css",
            "selectors": {
                "name": "//h2/a/text()",
                "path": "//h2/a/@href"
            }
        }
    }
}`

func main() {
    we, err := webextractor.New()
    if err != nil {
        panic(err)
    }

    var rules colibri.Rules
    err = json.Unmarshal([]byte(rawRules), &rules)
    if err != nil {
        panic(err)
    }

    output, err := we.Extract(&rules)
    if err != nil {
        panic(err)
    }

    fmt.Println("URL:", output.Response.URL())
    fmt.Println("Status code:", output.Response.StatusCode())
    fmt.Println("Content-Type", output.Response.Header().Get("Content-Type"))
    fmt.Println("Data:", output.Data)
}

? WebExtractor 是 Colibri 的默认接口,可以开始在网络上抓取或提取数据。

使用 webextractor 的新功能,我们生成一个 Colibri 结构,其中包含开始提取数据所需的内容。

然后我们将 JSON 格式的规则转换为 Rules 结构,并调用 Extract 方法将规则作为参数发送。

我们获得输出,HTTP 响应的 URL、HTTP 状态代码、响应的内容类型以及使用选择器提取的数据都打印在屏幕上。请参阅输出结构的文档。

我们执行以下命令:

go mod tidy

? go mod tidy 命令确保 go.mod 中的依赖项与模块源代码匹配。

最后,我们使用以下命令在 Go 中编译并运行代码:

go run scraper.go

结论

在这篇文章中,我们学习了如何使用 Colibri 包在 Go 中执行网页抓取,使用 CSS 和 XPath 选择器定义提取规则。 Colibri 是为那些希望在 Go 中自动化 Web 数据收集的人提供的工具。其基于规则的方法和易用性使其成为所有经验水平的开发人员的一个有吸引力的选择。

简而言之,Go 中的网页抓取是一种强大且多功能的技术,可用于从各种网站中提取信息。需要强调的是,网页抓取必须符合道德规范,尊重网站的条款和条件,并避免服务器超载。

以上是网页抓取的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn