東北大学の放射線モニタリング情報を取得する

福島の原発事故を受けて、東北大学が以下のurlで放射線のモニタリング情報を公開しています。

http://www.bureau.tohoku.ac.jp/anzen/monitoring/

ここから情報を取ってくるスクリプトを書きました。/jsonとかでデータにアクセスできるといいんだけどな。

# coding: utf-8
import urllib
import decimal
import re
import time
from BeautifulSoup import BeautifulSoup as BS

class SievertPerHour(object):
    def __init__(self, sv):
        if isinstance(sv, decimal.Decimal):
            self.sv = sv
        else:
            self.sv = decimal.Decimal(str(sv))
    def asMicro(self):
        return self.sv * 10**6
    def asMilli(self):
        return self.sv * 10**3
    def __repr__(self):
        return '<%s Sv/h>' % self.sv

class LatLng(object):
    __slots__ = ['lati', 'long']
    def __init__(self, lati, long):
        self.lati = lati
        self.long = long

class Info(object):
    def __init__(self, svh, note, timeat, latlng, additional=None):
        self.svh = svh
        self.note = note
        self.latlng = latlng
        self.timeat = timeat
        self.additional = additional
    @classmethod
    def listFromTohokuUniv(cls):
        ENCODING = 'utf-8'
        URL = 'http://www.bureau.tohoku.ac.jp/anzen/monitoring/'
        PLACE = LatLng(38.26066, 140.841873) # http://bit.ly/gbOAog
 
        # fetch html document from web
        html = urllib.urlopen(URL).read()
        unihtml = html.decode(ENCODING)
        # and drop it into soup
        soup = BS(unihtml)
        lst = soup.findAll('h5')
 
        infolist = []
        for n in lst:
            detail = n.nextSibling.nextSibling
            s,u = unicode(detail.next.next.next.next).split()
            m = {u'マイクロシーベルト/時間': 10**6,
                u'ミリシーベルト/時間': 10**3,
                u'シーベルト/時間': 1}
            
            sph = SievertPerHour(float(s) / m[u])
            note = unicode(detail.next.next.next.next.next.next.next.next.next)
            lst = map(int, re.findall('\d+', n.contents[0]))
            timeat = '%02d-%02d %02d:%02d' % (lst[0], lst[1], lst[-2], lst[-1])
            additional = None
 
            infolist.append(Info(sph, note, timeat, PLACE, additional))
 
        return infolist

def main():
    lst = Info.listFromTohokuUniv()
    for n in lst:
        print '%s uSv/h on %s, <<%s>>' % (n.svh.asMicro(), n.timeat, n.note)

if __name__ == '__main__':
    main()

実行結果

$ python radiation.py 
0.1000000 uSv/h on 04-04 16:00, <<人体に影響はない>>
0.1000000 uSv/h on 04-04 10:00, <<人体に影響はない>>
0.1000000 uSv/h on 04-03 12:00, <<人体に影響はない>>
0.1000000 uSv/h on 04-02 12:00, <<人体に影響はない>>
0.11000000 uSv/h on 04-01 16:00, <<人体に影響はない>>
0.1000000 uSv/h on 04-01 10:00, <<人体に影響はない>>
0.1000000 uSv/h on 03-31 16:00, <<人体に影響はない>>
0.1000000 uSv/h on 03-31 10:00, <<人体に影響はない>>
0.11000000 uSv/h on 03-30 16:00, <<人体に影響はない>>
0.11000000 uSv/h on 03-30 10:00, <<人体に影響はない>>
0.11000000 uSv/h on 03-29 16:00, <<人体に影響はない>>
0.11000000 uSv/h on 03-29 10:00, <<人体に影響はない>>
0.12000000 uSv/h on 03-28 16:00, <<人体に影響はない>>
0.12000000 uSv/h on 03-28 10:00, <<人体に影響はない>>
0.13000000 uSv/h on 03-27 12:00, <<人体に影響はない>>
0.12000000 uSv/h on 03-26 12:00, <<人体に影響はない>>
0.13000000 uSv/h on 03-25 16:00, <<人体に影響はない>>
0.13000000 uSv/h on 03-25 10:00, <<人体に影響はない>>
0.16000000 uSv/h on 03-24 16:00, <<人体に影響はない>>
0.12000000 uSv/h on 03-24 10:00, <<人体に影響はない>>
0.13000000 uSv/h on 03-23 16:00, <<人体に影響はない>>
0.13000000 uSv/h on 03-23 10:00, <<人体に影響はない>>
0.15000000 uSv/h on 03-22 16:00, <<人体に影響はない>>
0.15000000 uSv/h on 03-22 10:00, <<人体に影響はない>>
0.16000000 uSv/h on 03-21 12:00, <<人体に影響はない>>
0.15000000 uSv/h on 03-20 12:00, <<人体に影響はない>>
0.13000000 uSv/h on 03-19 12:00, <<人体に影響はない>>
0.17000000 uSv/h on 03-18 16:00, <<人体に影響はない>>
0.15000000 uSv/h on 03-18 10:00, <<人体に影響はない>>