No Programming, No Life

プログラミング関連の話題や雑記

スクレイピング!スクレイピング!

はてなハイクAPIを使わずにHTMLで解析することになった。
ここにとりあえずURLをまとめてある。
で、最終的にはHatenaHaiku4Jに組み込む予定なんですが
とりあえずGroovyで動作などを下調べということで、書いたソースが以下。

ソース

// 正規表現版で実行
getKeywordList1('', 3000).with {
println "${it.size()}件"
it.each { li ->
println "[${li.title}](${li.entryCount}) ${li.url}"
}
}
// XmlSlurper版で実行
getKeywordList2('', 3000).with {
println "${it.size()}件"
it.each { li ->
println "[${li.title}](${li.entryCount}) ${li.url}"
}
}
/** 正規表現版 */
def getKeywordList1(String word = '', int page = 1) {
def text = new URL("http://h.hatena.ne.jp/keywords.body?word=${word}&page=${page}").getText('UTF-8')
def reg = /(?s)<li>.*?<a href="(.+?)" class="keyword">(.+?)<\/a>.*?(?:<span class="entry-count">\((\d+?)\)<\/span>)?.*?<\/li>/
def result = []
text.findAll(reg){ _0, _1, _2, _3 ->
result << [
'url' : 'http://h.hatena.ne.jp' + _1,
'title' : _2,
'entryCount' : _3 ? _3 : 0
]
}
result
}
/** XmlSlurper版 */
def getKeywordList2(String word = '', int page = 1) {
def text = new URL("http://h.hatena.ne.jp/keywords.body?word=${word}&page=${page}").getText('UTF-8')
text = """<?xml version=\"1.0\" encoding=\"utf-8\" ?>
<keyword_list>
${text}
</keyword_list>
"""
def html = new XmlSlurper().parseText(text)
def lists = html.li
def result = []
lists.each { li ->
result << [
'url' : 'http://h.hatena.ne.jp' + li.a.@href,
'title' : li.a.text(),
'entryCount' : li.span.size() ? li.span.text() : 0
]
}
result
}

解説

正規表現版とXmlSlurper版を書いてみた。

正規表現

力技的です。空白とか改行とかの扱いがちょっとイヤだなぁという印象。

XmlSlurper版

取得してきたHTMLにXML宣言などをちょっと付け加えてValidなXMLにしてしまうという方法。
この方法だと空白とか改行とかの扱いはパーサがやってくれるので楽。
正式採用はこちらにします。