人気記事の記事タイトルとurlを取得してターミナルに表示してみる。
スクレイピングのため、goqueryを使って取得します。
go get github.com/PuerkitoBio/goquery
Qiitaの人気記事一覧ページのurlはこれ
https://qiita.com/popular-items
ページタイトルを取得する
これをgoqueryのNewDocumentを使って取得する。
doc, err := goquery.NewDocument("https://qiita.com/popular-items")
以下でページtitleを取得できるようなので取得する。
Find("title").Text() //=>Popular Items beta - Qiita
記事タイトルを取得する
記事タイトルのセレクタを調べる。
要素を検証していくと以下で記事のタイトルは取れそう。
doc.Find(".popularItem .popularItem_articleTitle .popularItem_articleTitle_text span")
これが複数あるからEachで回そう。
doc.Find(".popularItem .popularItem_articleTitle .popularItem_articleTitle_text span").Each(func(i int, s *goquery.Selection) { fmt.Println(s.Text()) })
これで記事タイトルは取得できた。 今のところこんな感じ。
package main import ( "fmt" "github.com/PuerkitoBio/goquery" ) func main() { doc, err := goquery.NewDocument("https://qiita.com/popular-items") if err != nil { fmt.Println(err) } // ページtitleの取得 title := doc.Find("title").Text() fmt.Println(title) //人気記事のタイトルを取得 doc.Find(".popularItem .popularItem_articleTitle .popularItem_articleTitle_text span").Each(func(i int, s *goquery.Selection) { fmt.Println(s.Text()) }) }
実行すると上記のように表示される。
人気記事のurlを取得する
人気記事のurlはほとんど階層が変わらない。一括で行うためにFindからspanは消す。
doc.Find(".popularItem .popularItem_articleTitle .popularItem_articleTitle_text").Each(func(i int, s *goquery.Selection) { fmt.Println(s.Text()) u := url.URL{} url, _ := s.Attr("href") u.Path = url fmt.Println(u.String()) })
"net/url"をインポートして、hrefを取得する処理を書けば終了。
直感的に記述できるので、使いやすいですね。