White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

正規表現を使ったTwitterスクレイピング

Twitterクライアント作る時に問題となるのがAPIを使うかスクレイピングを使うかって事なのだけど、今のところスクレイピング使ってるのはTweenくらいしか知らない。

で、TweenはWindowsでしか使えないので、今作ってるマルチプラットフォームクライアントcrochet(長いな)に組み込んでみた。

まずそもそもAPI,スクレイピングの説明が必要だろうけどここでは割愛。要は要求を投げる先と受け取るデータが変わる。APIならデータとして使うための配列の類で、スクレイピングはHTML。

Tweenは取得してきたHTMLファイルに固定文字列のマッチングを行ってる。その文字列はhttp://wedata.net/databases/Tween/itemsに公開され、編集する事で急な仕様変更時に作者不在でも直せるようになっている(と思う)

一方私の方は正規表現を使った。固定文字列よりも処理に時間がかかるけど、ブロック毎に解釈してるので要素の出現順が変わっても大きなトラブルにはならないんじゃないかと思う。

  import re
  
  regTwit = re.compile("<tr class=\"hentry hentry_hover\"([\w\W]*?)</tr>",re.MULTILINE)
  regImage = re.compile("<img [\w\W]*? src=\"([\w\W]*?)\"",re.MULTILINE)
  regUserAndMessage = re.compile("<td class=\"content\">([\w\W]*?)</td>")
  regUser = re.compile("<a href=.*?>(.*?)</a>")
  regMessage = re.compile("<span class=\"entry-content\">([\w\W]*?)</span>")       
  regTime = re.compile("<abbr class=\"[\w\W]*?\" title=\"([\w\W]*?)\">")
  str = str.replace("\t","")
  str = str.replace("\n","")
  a = regTwit.findall(str)
  resultList = []
  for aa in a:
    resultData = {}
        
    b = regImage.search(aa)
    resultData['image'] = b.group(1)
    c = regUserAndMessage.search(aa).group(1)
    d1 = regUser.search(c)
    d2 = regMessage.search(c)   
    resultData['user'] = unicode(d1.group(1),'utf-8')
    resultData['message'] = unicode(d2.group(1),'utf-8')
    tm = regTime.search(aa)
    resultData['time'] = tm.group(1)

まだ一部抜けがある(htmlタグ除去とか・・)と思うけど、これで一応動いてる。
codereposにもあげたのでcrochet使ってる人はsvn upでもするといいかと。

coderepos内ページ
http://coderepos.org/share/wiki/crochet