PINGサーバで最新エントリのタイトル取得を復活しました。
PINGのリクエストからは,BlogのタイトルとURLしか取得できません。SoftwareDesignの特集にも書きましたけど,清く正しいBlogにはエントリにRDFが埋め込んであって(ソースを見るとわかります),これを正規表現などを使ってパースすると,エントリのタイトルやPermalinkなどを取得できます。
で,このとき,アクセス先のサーバが混雑していたりして,延々応答しなかったような場合,RDF取得プロセスが重複して相手先のサーバに迷惑をかけたりして具合がよろしくありません。相手に迷惑をかけないためには,排他制御するのがひとつ。HTTPアクセスの際タイムアウトするようにするのがひとつ。
Python 2.3からはsocketモジュールにタイムアウトが設定できるようになったので,これを使ってみました。これがない時は,threadでurllib.urlopenをラップしてあげたりしていたものでした。それに比べるとラクチンになった。。。
import socket
socket.setdefaulttimeout(120)
で,urllib.urlopenなどを使ってPINGを送ってきたBlogの本文を取得するわけです。このときUserAgentを明示してあげて,「PINGサーバからやってきましたよ」と相手に伝えるとお行儀がよい。HTTPアクセスの際のUserAgentを帰る方法はいくつかありますが,手軽な方法ということで
import urllib2
request = urllib2.Request(url)
request.add_header('User-Agent','Existences PING Scanner 0.8b...')
opener = urllib2.build_opener()
body = opener.open(request).read()
みたいにしてみました。
たまに,埋め込みのRDFがないBlogがあって,タイトルを取りこぼすことがありますが,現状9割以上はとれている模様です:-)。