このサイトについて

socketのタイムアウト,HTTPアクセスのUserAgent

socketのタイムアウト,HTTPアクセスのUserAgent

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割以上はとれている模様です:-)。

2010-08-27 04:25