インターネットの普及に伴い、大量の情報を取得する必要があり、その大部分は Web サイトからクロールする必要があります。クロール方法は数多くありますが、その中でも golang で書かれたクローラーは、この情報をより効率的に取得するのに役立ちます。
Golang は、直感的で簡潔かつ効率的なプログラミング言語であり、高同時実行性、高パフォーマンスのアプリケーション シナリオに適しています。また、クローラは高同時性、高パフォーマンスのタスクであるため、golang の使用に非常に適しています。のクローラーを書きます。この記事では、初心者が Golang クローラーの基本的な方法をすぐに習得できるように、Golang でクローラーを作成するための基本プロセス、一般的に使用されるライブラリ、コア テクノロジを紹介します。
1. golang でクローラーを作成するための基本手順
golang でクローラーを作成するための基本手順を紹介する前に、基本的な HTML 構造を理解する必要があります。
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 ステートメントです。このステートメントは関数の最後に実行され、応答本文を閉じてリソース リークを回避します。
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 メソッドとテキストを介して検索されます。
最後のステップは、取得したデータを保存することです。データ ストレージには、データベース、ファイル、キャッシュなど、さまざまな方法から選択できます。
たとえば、クロールされたデータを 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 でクローラーを作成するには、多くの基礎となるコードを自分で記述する必要はありません。一般的なクローラー ライブラリは次のとおりです:
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") }
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) }
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) }
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) } }
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") }
分散クロールにより、Web サイトによる制限を効果的に回避し、クロールの効率を向上させることができます。基本的な考え方は、異なるタスクを異なるノードまたはマシンに割り当て、それらを個別に処理し、結果をまとめてまとめるというものです。分散クロールには、スケジュール、通信、その他のテクノロジが必要ですが、これは比較的複雑です。実際のクローラーでは、サードパーティのライブラリまたはクラウド サービスを使用して分散クロールを実装できます。
結論
この記事では、基本的な手順、一般的に使用されるライブラリ、コア テクノロジなど、golang を使用してクローラーを作成する方法を紹介します。 Golang は高性能で簡潔かつ明確な言語であり、クローラーのニーズを十分に満たすことができます。ただし、クロールの実践においては、クロール タスクを正常に完了するために、より多くのテクノロジーを理解し、新しいアンチクロール テクノロジーを常に学習する必要があります。
以上がGolangでクローラーを書く方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。