Personal tools

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

The URL to Trackback this entry is:
http://coreblog.org/ats/300/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
コメントスパム避けのための認証文字列です

Captcha Image

Pythonな求人
r = urlopen("http://www.webcore.co.jp/recruit")
About this blog
■Author
atsこと柴田淳です。Atsushiはガイジンにうまく発音して頂けないので,これからはJunというペンネームで行こうと思っていましたがあんまり使ってません。
Webcore株式会社 代表取締役
■TRIVIAL TECHNOLOGIES 2.0
トリビアル・テクノロジー 2.0,「トリテク 2.0」と呼んでください。
Blog(ブログ)サイトです。Plone上で動く,オープンソースのBlog Product - COREBlog2を使っています。
 
最近書いた本,Mook
みんなのPython Webアプリ編
Pythonの基礎から,Webアプリやフレームワークの仕組みまで,つまることなく一気に学べる書籍です。「みんなのPython」と一緒に読んでください:-)。
みんなのPython
Pythonの入門書です。基本的なことから分かりやすく解説するよう勤めました。Pythonをはじめたいと思っている人,JavaやC++,PerlやRubyを学ぼうと思って躓いてしまった人はぜひ読んで下さい。
 

Powered by Plone, the Open Source Content Management System