ホームページ  >  記事  >  バックエンド開発  >  Golang クローラーの書き方

Golang クローラーの書き方

王林
王林オリジナル
2023-05-10 11:12:07573ブラウズ

Golang は、効率的で同時実行可能な Web クローラーの作成に適した最新のプログラミング言語です。 Golang の高い同時実行機能によりクロールが大幅に高速化され、その構文は簡潔で学習と理解が容易です。この記事では、Golangを使った簡単なWebクローラーの書き方を詳しく紹介します。

  1. Golang のインストール

まず、Golang をインストールする必要があります。公式 Web サイト (https://golang.org/dl/) から、対応するオペレーティング システムのバイナリ ファイルをダウンロードしてインストールできます。インストール後、環境変数を設定する必要があります。 Linux および Mac では、~/.bashrc ファイルを編集して、ファイルの最後に次の行を追加できます:

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/ bin

Windows では、環境変数を編集し、GOPATH を環境変数に追加し、%GOPATH% を PATH に追加できます。

  1. Go Modules を使用して依存関係を管理する

Golang 1.13 以降では、Go Modules が公式の依存関係管理ツールとして正式に認められています。これを使用してプロジェクトの依存関係を管理できます。プロジェクトのルート ディレクトリを入力し、次のコマンドを実行します。

go mod init Spider

は、スパイダー プロジェクトに関する情報を含む go.mod ファイルを作成します。

  1. HTTP クライアントの構築

HTTP クライアントを作成するには、Golang に付属の net/http パッケージを使用する必要があります。このパッケージは、HTTP リクエストとレスポンスの解析を含む、HTTP プロトコルの詳細をすべて実装します。

まず、新しい HTTP クライアントを作成します。

func newHTTPClient(timeout time.Duration) *http.Client {

return &http.Client{
    Timeout: timeout,
}

}

このクライアントを使用して HTTP GET リクエストを送信します:

func fetch(url string) (string, error) {

client := newHTTPClient(time.Second * 5)
resp, err := client.Get(url)
if err != nil {
    return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    return "", fmt.Errorf("status code error: %d %s", resp.StatusCode, resp.Status)
}
bodyBytes, _ := ioutil.ReadAll(resp.Body)
return string(bodyBytes), nil

}

fetch 関数は、要求された Web を返します。ページのコンテンツとエラー。 defer キーワードを使用して、関数が返されたときに応答本文が確実に閉じられるようにします。

  1. HTML の解析

Web ページのソース コードを正常に取得したら、HTML を解析して必要な情報を取得する必要があります。 Go 言語の標準パッケージである html/template (HTML テンプレート) と html/parse (HTML パーサー) を使用できます。

func parse(htmlContent string) {

doc, err := html.Parse(strings.NewReader(htmlContent))
if err != nil {
    log.Fatal(err)
}
// Do something with doc...

}

html.Parse 関数を使用して HTML ソース コードを解析し、ツリー構造として返すことができます。このツリー構造を再帰的にたどることで、必要な情報を取得できます。

  1. 正規表現の使用

URL リンクやテキストなど、HTML ソース コードから特定の情報を抽出する必要がある場合があります。この場合、正規表現を使用できます。 Golang は正規表現を非常に適切にサポートしており、正規表現を実装するために regexp パッケージを使用できます。

たとえば、HTML ソース コードからすべての a タグのリンクを抽出する必要がある場合は、次のコードを使用できます:

func extractLinks(htmlContent string) []string {

linkRegex := regexp.MustCompile(`href="(.*?)"`)
matches := linkRegex.FindAllStringSubmatch(htmlContent, -1)
var links []string
for _, match := range matches {
    links = append(links, match[1])
}
return links

}

正規表現href="(.*?)" すべてのリンクと一致し、文字列配列を返します。

  1. 完全なコード

以下は、Web サイト ページ上のすべてのタグ リンクを取得する完全なクローラー コードです:

package main

import (

"fmt"
"log"
"net/http"
"regexp"
"strings"
"time"

"golang.org/x/net/html"

)

const (

url = "https://example.com"

)

func main() {

htmlContent, err := fetch(url)
if err != nil {
    log.Fatal(err)
}
links := extractLinks(htmlContent)
for _, link := range links {
    fmt.Println(link)
}

}

func newHTTPClient(タイムアウト時間.Duration) *http.Client {

return &http.Client{
    Timeout: timeout,
}

}

func fetch(url string) (string, error) {

client := newHTTPClient(time.Second * 5)
resp, err := client.Get(url)
if err != nil {
    return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    return "", fmt.Errorf("status code error: %d %s", resp.StatusCode, resp.Status)
}
bodyBytes, _ := ioutil.ReadAll(resp.Body)
return string(bodyBytes), nil

}

func extractLinks(htmlContent string) []string {

linkRegex := regexp.MustCompile(`href="(.*?)"`)
matches := linkRegex.FindAllStringSubmatch(htmlContent, -1)
var links []string
for _, match := range matches {
    links = append(links, match[1])
}
return links

}

func parse(htmlContent string) {

doc, err := html.Parse(strings.NewReader(htmlContent))
if err != nil {
    log.Fatal(err)
}
// Do something with doc...

}

概要

Golang を使用して Web クローラーを作成すると、クロール速度が大幅に向上します。また、Golang のような強力な言語を使用してクローラー コードを作成すると、より高い保守性とスケーラビリティを実現できます。この記事では、Golang を使用して簡単なクローラーを作成する方法について説明します。この記事が、Web クローラーを学習したい読者や Golang を使用する開発者に役立つことを願っています。

以上がGolang クローラーの書き方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。