goqueryを使ってqiitaの人気記事のタイトルとURLを取得する

人気記事の記事タイトルと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

記事タイトルを取得する

記事タイトルのセレクタを調べる。 f:id:utr066:20171103205453j:plain

要素を検証していくと以下で記事のタイトルは取れそう。

  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())
  })
}

f:id:utr066:20171103205508j:plain

実行すると上記のように表示される。

人気記事の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を取得する処理を書けば終了。

f:id:utr066:20171103205535j:plain

直感的に記述できるので、使いやすいですね。