post Image
golangの AriticleExtractor “GoOse” を試してみる

追記

取得できる要素を詳細にしました(2016/02/02)。

目的

golangのArticle Extractorである”GoOse”を試してみる。

概要

ArticleExtractorとはWebページのタイトルやメインコンテンツ、メイン画像、その他諸々の要素を判別して抽出するライブラリのことです。

golangでスクレイピングをするときはjQueryライクに処理を書ける”goquery”が有名でよく使われていると思います。
ただ不特定多数のWebサイトから狙い撃った要素をスクレイピングしたいときはArticleExtractorライブラリである”GoOse”があります。

https://github.com/advancedlogic/GoOse

別にScala製で”goose”というArticleExtractorがありますが、それとの関係は不明です。
まったく無いということはなさそうですが…

https://github.com/jiminoc/goose

また”golang goose” でググると同名のgolang製DBマイグレーションツールばかり引っかかるのでググラビリティは低いです。

使い方

URLまたはHTMLを指定する

urlString, rawHTMLはともにstringです。
(ExtractFromRawHTML(rawHtml)のほうは試したことはありません。)

g := goose.New()
article, err := g.ExtractFromURL(urlString)
// または
article, err := g.ExtractFromRawHTML(rawHtml)

戻り値 article から必要なプロパティを取得する

戻り値 articleから取得できるプロパティは20個あります。
READMEには書かれていません。

  • AdditionalData
    GitHubリポジトリで検索したところ Article struct で定義されているのみ。

  • CanonicalLink
    goqueryでlink[rel=canonical]を探して取得しています。

  • CleanedText
    TopNodeから優先度の低いノードを削除し、段落やstrongなどの装飾タグなどを綺麗に整理したもの。

  • Doc
    *goquery.Document

  • Delta
    time.Now().UnixNano()

  • Domain
    url.Parse(CanonicalLink).Host

  • FinalURL
    基本的にはWebサイトのURL?

  • LinkHash
    こんな感じで作ってます。どういう役割なのかはよくわかりません。

h := md5.New()
io.WriteString(h, url)
bytes := h.Sum(nil)
linkHash = fmt.Sprintf("%s.%d", string(bytes), time.Now().UnixNano())
  • Links
    TopNode内のaタグから画像リンク以外のhrefをsliceにしたものです。

  • MetaDescription
    meta[name=”description”]

  • MetaFavicon
    Webサイトのソース内にfaviconファイルがあった場合はそれを使用。
    なかった場合は link[rel=”icon”]を探してそのhrefを取得。

  • MetaKeywords
    meta[name=”keywords”]

  • MetaLang
    html[lang]

  • Movies
    “iframe”, “embed”, “object”, “video”タグを探して取得?

  • PublishDate
    GitHubリポジトリで検索したところ Article struct で定義されているのみ。

  • RawHTML
    生のHTML文字列

  • Tags
    a[rel=tag]のテキストを取得

  • Title
    タイトルっぽい要素(meta[property=”og:title”]やtitle,post-title,headlineタグ)を探して取得

  • TopImage

  • TopNode

試してみる

Qiita Blogのエントリで実際に試してみます。

ユーザページでcontribution数やフォロワー数の推移が見られるようになりました

package main

import (
    "github.com/advancedlogic/GoOse"
)

func main() {
    g := goose.New()
    article := g.ExtractFromURL("http://blog.qiita.com/post/136806363764/new-users-page")
    println("title", article.Title)
    println("description", article.MetaDescription)
    println("keywords", article.MetaKeywords)
    println("content", article.CleanedText)
    println("url", article.FinalURL)
    println("top image", article.TopImage)
}

Title
ユーザページでcontribution数やフォロワー数の推移が見られるようになりました

MetaDescription
ユーザページでcontribution数やフォロワー数の推移が見られるようになりました こんにちは、yuku_tです。小寒が過ぎてから朝起きるのがつらいです。 さて、このたびユーザページのデザインがリニューアルされました! 一番大きな変化はなんといっても大きく目を引くグラフが追加されたことでしょう。過去30日間の数値の変化を確認することができます。画面中央の「Followers」の箇所をクリックする…

MetaKeywords
qiita

CleanedText
ユーザページでcontribution数やフォロワー数の推移が見られるようになりました

FinalURL
http://blog.qiita.com/post/136806363764/new-users-page

TopImage
http://increments.github.io/blog.qiita.com/images/og_image.png


もう一つ、もう少しゴタゴタしたページで試してみます。

Qiitaが変えるエンジニアの「情報共有の世界」CTO髙橋侑久が語る『仕事の流儀』(前編)

Title
Qiitaが変えるエンジニアの「情報共有の世界」CTO髙橋侑久が語る『仕事の流儀』(前編)|CodeIQ MAGAZINE

MetaDescription
なし

MetaKeywords
cto,increments,qiita,髙橋侑久

CleanedText
Qiitaが変えるエンジニアの「情報共有の世界」CTO髙橋侑久が語る『仕事の流儀』(前編)|CodeIQ MAGAZINE

FinalURL
https://codeiq.jp/magazine/2016/01/36482/

TopImage
https://codeiq.jp/magazine/wp-content/uploads/2016/01/46A0242.jpg

まとめ

なんかぱっとしない感じになってしまいました。
とりあえずもっといいのがあったら教えて下さい。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。