きっかけ
下記の単なるわがままから CLI を作成することにしました。
- トレンドを即座に知りたい
- ただ、ブラウザ立ち上げる面倒さや、他の情報が入るのがイヤ
- Colly ライブラリを使ってみたい
↓↓↓↓↓ https://search.yahoo.co.jp/realtime の出力結果
まず、スクレイピングしていいか確認
https://search.yahoo.co.jp/realtime
をスクレイピングしていいのかを確認。
User-agent: *
Disallow: /assistapi
Disallow: /bin
Disallow: /legacy
Disallow: /language
Disallow: /upyjt
Disallow: /combo
Disallow: /r/
Disallow: /search/psp?
Disallow: /search/msie?
Disallow: /web/save_pref
リストにないので、問題なさそうです。
該当箇所あたりの HTML 覗く
https://search.yahoo.co.jp/realtime
にアクセスして、HTML を見ます。
リスト要素を特定できそうな要素を確認していきます。
-
section
タグのクラスにTrend_container
を含む要素 -
a
タグ にdata-c-params
属性を持つ要素 - その
a
タグ配下のh1
のテキスト
が欲しい情報ですね。
Go で書いてみる
package main
import (
"fmt"
"log"
"github.com/gocolly/colly/v2"
)
type Trend struct {
Item string
Link string
}
func main() {
url := "https://search.yahoo.co.jp/realtime"
var trends []Trend
c := colly.NewCollector()
cssSelector := "section[class^=Trend_container] a[data-cl-params]"
c.OnHTML(cssSelector, func(e *colly.HTMLElement) {
trend := Trend{
Item: e.DOM.Find("h1").Text(),
Link: e.Attr("href"),
}
trends = append(trends, trend)
})
c.Visit(url)
for i := range trends {
fmt.Println(trends[i].Item, trend[i].Link)
}
}
-
section
タグのクラスにTrend_container
を含む要素 →section[class^=Trend_container]
-
^
をつけることで、Trend _container で始まる」という意味になる - この後ろに続く文字列が変わりそうだったので、変わらなさそうな先頭の一部分だけを指定
-
-
a
タグ にdata-c-params
属性を持つ要素 →a[data-c-params]
- 他にも属性はありますが、なんとなくこれを選択
-
section[class^=Trend_container] a[data-cl-params]
と並べることで、section
タグ配下のa
タグとしている - その
a
タグ配下のh1
のテキスト- ここまでくると
h1
は一つしかないので
- ここまでくると
あとは go build でバイナリ化すれば、いつでも欲しい情報が取得できます。
まとめ
思った以上に Colly ライブラリ簡単に使えますね。
欲しい情報が間違いなく取得できるように CSS セレクタ の指定が間違えなければ、ちゃちゃっと作れますね。