首頁 > 後端開發 > Golang > 主體

網頁抓取

王林
發布: 2024-09-10 14:30:30
原創
593 人瀏覽過

第一步

首先我們必須安裝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 元素的href > 元素。換句話說,「名稱」
將採用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 中的程式碼

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)
}
登入後複製
我們準備建立 scraper.go 文件,導入必要的套件並定義主函數:

? WebExtractor 是 Colibri 的預設接口,可以開始在網路上抓取或提取資料。

使用 webextractor 的新功能,我們產生一個 Colibri 結構,其中包含開始提取資料所需的內容。

然後我們將 JSON 格式的規則轉換為 Rules 結構,並呼叫 Extract 方法將規則作為參數傳送。


我們獲得輸出,HTTP 回應的 URL、HTTP 狀態代碼、回應的內容類型以及使用選擇器提取的資料都列印在螢幕上。請參閱輸出結構的文件。

go mod tidy
登入後複製
我們執行以下指令:

? go mod tidy 指令確保 go.mod 中的依賴項與模組原始碼相符。

go run scraper.go
登入後複製
最後,我們使用以下命令在 Go 中編譯並執行程式碼:

結論

在這篇文章中,我們學習如何使用 Colibri 套件在 Go 中執行網頁抓取,使用 CSS 和 XPath 選擇器定義擷取規則。 Colibri 是為那些希望在 Go 中自動化 Web 資料收集的人提供的工具。其基於規則的方法和易用性使其成為所有經驗水平的開發人員的一個有吸引力的選擇。 簡而言之,Go 中的網頁抓取是一種強大且多功能的技術,可用於從各種網站中提取資訊。需要強調的是,網頁抓取必須符合道德規範,尊重網站的條款和條件,並避免伺服器超載。

以上是網頁抓取的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!