LoginSignup
0
0

More than 1 year has passed since last update.

Yahoo!リアルタイム検索を CLI 化

Posted at

きっかけ

下記の単なるわがままから 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 を見ます。

Screenshot 2023-03-12 at 15.15.02.jpg

リスト要素を特定できそうな要素を確認していきます。

  • 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 セレクタ の指定が間違えなければ、ちゃちゃっと作れますね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0