CollyはGo言語でWebスクレイピングを行うためのライブラリです。
以下にCollyの使い方を紹介します。
インストール
go modコマンドでgo.modファイルを作成し、go getでcollyを導入します。
1 2 |
go mod init colly-scraping-test go get github.com/gocolly/colly/v2 |
collyの基本的な使用方法
Collyを使用してスクレイピングを行うには以下のような流れで処理を行います。
- colly.NewCollector関数で新しいCollectorを作成する
- CollectorのOnHTMLメソッドやOnResponseメソッドを使用してCollectorの動作を定義する
- Visitメソッドでスクレイピングを開始する
例として、このブログのトップページのプロフィール部分のプロフィール画像URLとプロフィール名を
取得してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package main import ( "fmt" "github.com/gocolly/colly/v2" ) func main() { c := colly.NewCollector() var profileImageURL string c.OnHTML("#author_box-3 div figure img", func(e *colly.HTMLElement) { profileImageURL = e.Attr("src") }) var profileName string c.OnHTML("#author_box-3 div div div.author-name a", func(e *colly.HTMLElement) { profileName = e.Text }) err := c.Visit("https://kazusa-pg.com/") if err != nil { panic(err) } fmt.Println(profileImageURL) fmt.Println(profileName) } |
このコードは実行するとプロフィール画像のURLとプロフィール名が表示されます。
1 2 |
https://kazusa-pg.com/wp-content/uploads/2018/10/profile-picture1.png かずさプログラマー |
collectorのOnHTMLメソッドにはセレクター要素ごとに動作を定義できるので
今回のコードでは以下の2つの動作を設定しています。
- #author_box-3 div figure imgのセレクター要素でsrc属性をprofileImageURLに格納する
- #author_box-3 div div div.author-name aのセレクター要素のテキストをprofileNameに格納する
リンク先のページの情報を取得する
Collyを使用すると指定したページに表示されている各リンクをたどって、リンク先のページの情報を取得することができます。
このブログのトップページに表示されている最新の記事10件にアクセスして、各記事のタイトルと何分で読了できるかの情報を取得してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package main import ( "fmt" "github.com/gocolly/colly/v2" ) // 参考URL:https://github.com/gocolly/colly/blob/master/_examples/coursera_courses/coursera_courses.go type pageDetail struct { title string readTime string } func main() { pageDetails := []pageDetail{} c := colly.NewCollector( colly.AllowedDomains("kazusa-pg.com"), ) detailCollector := c.Clone() c.OnHTML("#list > a", func(e *colly.HTMLElement) { detailCollector.Visit(e.Attr("href")) }) detailCollector.OnRequest(func(r *colly.Request) { fmt.Println("visiting", r.URL.String()) }) detailCollector.OnHTML(".main", func(e *colly.HTMLElement) { pd := pageDetail{ title: e.ChildText(".entry-title"), readTime: e.ChildText(".read-time"), } pageDetails = append(pageDetails, pd) }) c.Visit("https://kazusa-pg.com/") for _, pd := range pageDetails { fmt.Printf("%s %s\n", pd.title, pd.readTime) } } |
コードを実行すると各ブログのURLにアクセスし、リンク先のタイトルと何分で読了できるかの情報を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
visiting https://kazusa-pg.com/vba-get-files-in-zip/ visiting https://kazusa-pg.com/golang-colly-web-scraping/ visiting https://kazusa-pg.com/vba-picinfo/ visiting https://kazusa-pg.com/go-screen-capture/ visiting https://kazusa-pg.com/golang-robotgo/ visiting https://kazusa-pg.com/golang-stdin-unittest/ visiting https://kazusa-pg.com/go-mouse-mover/ visiting https://kazusa-pg.com/golang-lifegame/ visiting https://kazusa-pg.com/nsw-nattype/ visiting https://kazusa-pg.com/pytorch-yolov5-object-detection/ 【VBA】zip内のファイル一覧を取得する この記事は約2分で読めます。 【Golang】Collyを使用してWebスクレイピングを行う この記事は約3分で読めます。 【VBA】画像の幅と高さを取得する この記事は約2分で読めます。 Robotgoで指定範囲のキャプチャーを連続で取得する この記事は約2分で読めます。 Robotgoで自動操作 この記事は約3分で読めます。 Golangで標準入力を使用する関数のテスト この記事は約3分で読めます。 Robotgoでマウスポインタを自動で移動させる この記事は約2分で読めます。 Golangでライフゲームを作成しました この記事は約1分で読めます。 Nintendo SwitchのNATタイプがC,Dになったときの対応方法 この記事は約3分で読めます。 【Python】PyTorchとYOLOv5で物体の種類、座標、幅、高さを検出する この記事は約3分で読めます。 |
ファイルや画像を保存する
Collyを使って画像をダウンロードして保存するにはcollectorのOnResponseメソッドを使用します。
OnResponseはサーバーからレスポンスを受け取るたびに呼び出されます。
レスポンスにはサーバーから返されたHTMLや画像などのコンテンツが含まれているので
Saveメソッドを使用することでレスポンスの内容を保存することができます。
下記のコードは、このブログのトップページのプロフィール画像を保存するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main import ( "fmt" "github.com/gocolly/colly/v2" ) func main() { c := colly.NewCollector() c.OnResponse(func(r *colly.Response) { r.Save("./profile.png") fmt.Print("保存しました") }) err := c.Visit("https://kazusa-pg.com/wp-content/uploads/2018/10/profile-picture1.png") if err != nil { panic(err) } } |
コードを実行すると、コードを実行したパスに、このブログのプロフィール画像をprofile.pngとして
保存します。
エラーを処理する
Collyを使ってWebスクレイピングを行う際にエラーが発生することがあります。
例えばサーバーから404エラーが返されたり、タイムアウトしたりすることがあります。
Collyではエラーを処理するためにOnErrorメソッドが用意されています。
このメソッドを設定することで、エラーが発生したときの動作を定義することができます。
下記のコードではテストサーバーから404 Not Foundが返ってくるのでOnErrorメソッドを使って
エラーを処理しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "fmt" "net/http" "net/http/httptest" "github.com/gocolly/colly/v2" ) func main() { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) })) defer server.Close() c := colly.NewCollector() c.OnError(func(r *colly.Response, err error) { fmt.Println("エラーが発生しました:", err) }) c.Visit(server.URL) } |
コードを実行すると下記のように表示されます。
1 |
エラーが発生しました: Not Found |
もしくはVisitメソッドがerrorを返すので、errorの内容を元に処理を行います。
1 2 3 4 |
err := c.Visit("URL") if err != nil { panic(err) } |
参考リンク

コメント