Golangでクローラーを書く方法

WBOY
リリース: 2023-05-10 14:00:08
オリジナル
925 人が閲覧しました

インターネットの普及に伴い、大量の情報を取得する必要があり、その大部分は Web サイトからクロールする必要があります。クロール方法は数多くありますが、その中でも golang で書かれたクローラーは、この情報をより効率的に取得するのに役立ちます。

Golang は、直感的で簡潔かつ効率的なプログラミング言語であり、高同時実行性、高パフォーマンスのアプリケーション シナリオに適しています。また、クローラは高同時性、高パフォーマンスのタスクであるため、golang の使用に非常に適しています。のクローラーを書きます。この記事では、初心者が Golang クローラーの基本的な方法をすぐに習得できるように、Golang でクローラーを作成するための基本プロセス、一般的に使用されるライブラリ、コア テクノロジを紹介します。

1. golang でクローラーを作成するための基本手順

golang でクローラーを作成するための基本手順を紹介する前に、基本的な HTML 構造を理解する必要があります。

  1. HTTPリクエスト

golangの標準ライブラリにはHTTPリクエストに関連する関数が用意されており、URL、リクエストヘッダ、Cookie、リクエストパラメータを設定するだけで済みます。基本情報を取得したら、必要な HTTP リクエストを作成できます。メイン コードは次のとおりです。

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("http://www.baidu.com")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
ログイン後にコピー

このコードは、http.Get 関数を使用して HTTP 要求を開始し、応答から応答本文を読み取ります。重要なポイントは defer ステートメントです。このステートメントは関数の最後に実行され、応答本文を閉じてリソース リークを回避します。

  1. HTML ページの解析

HTTP リクエストによって取得された応答データは HTML ドキュメントであり、必要なデータを取得するにはこれを解析する必要があります。 golang では、GoQuery ライブラリを使用して HTML ドキュメントを解析できます。このライブラリは jQuery の構文に基づいており、使いやすいです。

GoQuery が提供する主な解析関数は、Find、Filter、Each、Attr などです。 Find 関数は条件を満たすサブ要素を検索するために使用され、Filter 関数は条件を満たす要素をフィルタリングするために使用されます。 Each 関数は条件を満たすすべての要素を走査するために使用され、Attr 関数は要素の属性を取得するために使用されます。 Baidu ホームページの分析を例にとると、コードは次のとおりです。

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    resp, err := http.Get("http://www.baidu.com")
    if err != nil {
        log.Fatal(err)
    }
    body := resp.Body
    defer body.Close()

    doc, err := goquery.NewDocumentFromReader(body)
    if err != nil {
        log.Fatal(err)
    }

    doc.Find("title").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text())
    })
}
ログイン後にコピー

上記のコードでは、 goquery.NewDocumentFromReader 関数を使用してドキュメント オブジェクトを構築し、その後、 title 要素がFind メソッドを使用すると、すべての修飾された要素が Each メソッドとテキストを介して検索されます。

  1. データの保存

最後のステップは、取得したデータを保存することです。データ ストレージには、データベース、ファイル、キャッシュなど、さまざまな方法から選択できます。

たとえば、クロールされたデータを CSV ファイルに保存したい場合の手順は次のとおりです:

package main

import (
    "encoding/csv"
    "log"
    "os"
)

func main() {
    file, err := os.Create("data.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()
    
    writer.Write([]string{"name", "address", "tel"})
    writer.Write([]string{"John Smith", "123 Main St, Los Angeles, CA 90012", "123-456-7890"})
    writer.Write([]string{"Jane Smith", "456 Oak Ave, San Francisco, CA 94107", "123-456-7891"})
}
ログイン後にコピー

上記のコードは、os.Create 関数を使用して data という名前のファイルを作成します。次に、csv.NewWriter 関数を使用して CSV ライターを作成します。最後に、writer.Write メソッドを使用して、保存するデータを CSV ファイルに書き込みます。

2. golang でクローラーを作成するために一般的に使用されるライブラリ

golang でクローラーを作成するには、多くの基礎となるコードを自分で記述する必要はありません。一般的なクローラー ライブラリは次のとおりです:

  1. Gocolly

Gocolly は、golang に基づく軽量のクローラー フレームワークで、データのクロールに役立つ便利なメソッドを多数提供します。リダイレクト、Cookie、プロキシ、速度制限などの問題を自動的に処理できるため、データ抽出ルールの定義にさらに集中できるようになります。次のコードは、Gocolly を使用して Baidu タイトルを取得する方法を示しています。

package main

import (
    "fmt"
    "github.com/gocolly/colly"
)

func main() {
    c := colly.NewCollector()
    
    c.OnHTML("head", func(e *colly.HTMLElement) {
        title := e.ChildText("title")
        fmt.Println(title)
    })
    
    c.Visit("http://www.baidu.com")
}
ログイン後にコピー
  1. Beautifulsoup4go
#Beautifulsoup4go は、有名な Python ライブラリ BeautifulSoup4 と同じ、Golang ベースの HTML パーサーです。インターネットからのさまざまな HTML ページを解析できます。次のコードは、Beautifulsoup4go を使用して Baidu のタイトルを取得する方法を示しています。

package main

import (
    "fmt"
    "github.com/sundy-li/go_commons/crawler"
)

func main() {
    html := crawler.FetchHTML("http://www.baidu.com", "GET", nil, "")

    bs := crawler.NewSoup(html)

    title := bs.Find("title").Text()
    
    fmt.Println(title)
}
ログイン後にコピー

    goquery
goquery ライブラリは以前に紹介されました。CSS セレクターに基づいた HTML パーサーです。 、チェーン操作をサポートしており、非常に実用的なライブラリです。以下のコードは、goquery を使用して Baidu タイトルを取得する方法を示しています:

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "log"
)

func main() {
    resp, err := http.Get("http://www.baidu.com")
    if err != nil {
        log.Fatal(err)
    }
    body := resp.Body
    defer body.Close()

    doc, err := goquery.NewDocumentFromReader(body)
    if err != nil {
        log.Fatal(err)
    }

    title := doc.Find("title").Text()
    
    fmt.Println(title)
}
ログイン後にコピー

上記 3 つのライブラリにはそれぞれ特徴があり、自分に合ったライブラリを選択することで、より効率的にクローラーを完成させることができます。

3. golang でクローラーを作成するためのコア テクノロジー

    同時実行性
クローラーの実装プロセスにおいて、非常に重要な機能は同時実行性です。 、同時アクセス 複数の Web サイトまたは複数の URL。 golang では、コルーチンを使用してタスクを同時に実行できます (例:

package main

import (
    "fmt"
    "github.com/gocolly/colly"
)

func main() {
    urls := []string{
        "http://www.baidu.com",
        "http://www.sogou.com",
        "http://www.google.com",
    }

    ch := make(chan string, len(urls))

    for _, url := range urls {
        go func(url string) {
            c := colly.NewCollector()

            c.OnHTML("head", func(e *colly.HTMLElement) {
                title := e.ChildText("title")
                ch <- title
            })

            c.Visit(url)
        }(url)
    }

    for range urls {
        title := <-ch
        fmt.Println(title)
    }
}
ログイン後にコピー

上記のコードでは、コルーチンを使用して複数の URL に同時にアクセスし、各 Web サイトの head タグからタイトルを抽出します。情報と印刷)。

    クローラー対策メカニズム
ご存知のとおり、クローラー アクセスを制限するために、多くの Web サイトはリクエスト頻度の制限、追加の追加などのクローラー対策メカニズムを採用しています。確認コード、および一般的なクローラー ツールの特定。これらのクローラー対策メカニズムでは、Web サイトからのアクセス禁止を回避するために、いくつかの技術的手段を使用する必要があります。技術的手段は次の 2 つです。

(1) アクセス頻度制御

Web サイトによる制限を回避するために、アクセス間隔の設定、プロキシ IP の使用、分散方式の使用などを行うことができます。 . 対爬虫類メカニズムによる識別を避ける手段。

たとえば、Gocolly フレームワークでは、WaitTime、RandomDelay、Limit などのメソッドを使用して、クロール頻度とリクエスト制限を設定できます。

package main

import (
    "fmt"
    "github.com/gocolly/colly"
    "time"
)

func main() {
    c := colly.NewCollector()

    c.Limit(&colly.LimitRule{
        DomainGlob:  "*",
        Parallelism: 2,
        RandomDelay: 5 * time.Second,
    })

    c.OnHTML("head", func(e *colly.HTMLElement) {
        title := e.ChildText("title")
        fmt.Println(title)
    })

    c.Visit("http://www.baidu.com")
}
ログイン後にコピー
上記のコードでは、同時アクセスの数がは 2 に設定され、リクエスト間隔は 5 秒です。これにより、Web サイトによる制限を効果的に回避できます。もちろん、実際に使用する場合には、Web サイトに応じて適切なアクセス間隔を設定する必要もあります。

(2) 分散クロール

分散クロールにより、Web サイトによる制限を効果的に回避し、クロールの効率を向上させることができます。基本的な考え方は、異なるタスクを異なるノードまたはマシンに割り当て、それらを個別に処理し、結果をまとめてまとめるというものです。分散クロールには、スケジュール、通信、その他のテクノロジが必要ですが、これは比較的複雑です。実際のクローラーでは、サードパーティのライブラリまたはクラウド サービスを使用して分散クロールを実装できます。

結論

この記事では、基本的な手順、一般的に使用されるライブラリ、コア テクノロジなど、golang を使用してクローラーを作成する方法を紹介します。 Golang は高性能で簡潔かつ明確な言語であり、クローラーのニーズを十分に満たすことができます。ただし、クロールの実践においては、クロール タスクを正常に完了するために、より多くのテクノロジーを理解し、新しいアンチクロール テクノロジーを常に学習する必要があります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート