きっかけ
下記の単なるわがままから 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 セレクタ の指定が間違えなければ、ちゃちゃっと作れますね。
