Golang は、効率的で同時実行可能な Web クローラーの作成に適した最新のプログラミング言語です。 Golang の高い同時実行機能によりクロールが大幅に高速化され、その構文は簡潔で学習と理解が容易です。この記事では、Golangを使った簡単なWebクローラーの書き方を詳しく紹介します。
まず、Golang をインストールする必要があります。公式 Web サイト (https://golang.org/dl/) から、対応するオペレーティング システムのバイナリ ファイルをダウンロードしてインストールできます。インストール後、環境変数を設定する必要があります。 Linux および Mac では、~/.bashrc ファイルを編集して、ファイルの最後に次の行を追加できます:
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/ bin
Windows では、環境変数を編集し、GOPATH を環境変数に追加し、%GOPATH% を PATH に追加できます。
Golang 1.13 以降では、Go Modules が公式の依存関係管理ツールとして正式に認められています。これを使用してプロジェクトの依存関係を管理できます。プロジェクトのルート ディレクトリを入力し、次のコマンドを実行します。
go mod init Spider
は、スパイダー プロジェクトに関する情報を含む go.mod ファイルを作成します。
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 キーワードを使用して、関数が返されたときに応答本文が確実に閉じられるようにします。
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 ソース コードを解析し、ツリー構造として返すことができます。このツリー構造を再帰的にたどることで、必要な情報を取得できます。
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="(.*?)"
すべてのリンクと一致し、文字列配列を返します。
以下は、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 サイトの他の関連記事を参照してください。