2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

どのURLも200を返すサイトで、CSVだけを信じる話【kurashi-skill Day 19】

2
Posted at

朝からのどがイガイガする。PM2.5か、黄砂か、ただの乾燥か。「今、空気は悪いの?」に答えるデータは、環境省が公開している。大気汚染物質広域監視システム、通称そらまめくん(AEROS)。全国の測定局の速報値を24時間公開していて、しかも公式サイトに開発者向けのAPI説明ページまである。APIキーもログインもいらない。ただし、このサイトには優しい罠があった。

起: 全国1,594局の「今」が1本のCSVに

最新の全国データは、時刻つきのCSV1本だ。2026-09-26未明の実測では、01時のファイルが255,102バイト、1,594測定局分。しかも測定局の名前、住所、局種別、市区町村名まで入っている。PM2.5のその時刻の全国平均は8.9、最大は28.0(国設尼崎自動車交通環境測定所)だった。測定局ごとの今日の値や直近7日分もCSVで取れる。月ごとの履歴は、公式が案内するJSON APIが都道府県単位で返してくれる。東京都の9月分を取ったら4.4MB、50,830行だった。太っ腹である。

承: 速報値という立場

ひとつだけ立場を押さえておく。このデータは速報値で、確定値ではない。確かな統計が欲しい人は政府のオープンデータカタログへ、というのが公式の案内だ。だから答え方も決まる。「9月26日01時の速報値では」という時刻つきで話す。局にも種類があって、住宅地などを測る一般局(1,244局)と、道路沿いの自動車排出ガスを測る自排局(349局)がある。同じ町の「28」でも、どちらの局かで意味が違う。

転: このサイトは、404を返さない

ここで罠だ。存在しないURLを叩いても、このサイトは404を返さない。どんな適当なパスでも「200 OK」で、2.6KBのHTMLが返ってくる。ブラウザのための器(いわゆるSPAのシェル)だ。時刻の組み立てを間違えても、ファイル名を推測で書いても、サーバは笑顔で200を返す。

何も知らないエージェントはここで転ぶ。「データ取得成功!」と言って、HTMLをCSVとして読み始める。200はデータの証明ではないのだ。対策は単純で、受け取った中身の先頭行が「測定局コード」で始まるかを必ず見る。スキルにはそう書いた。それから、PM2.5を測っているのは1,594局中1,031局だけだった(同時刻実測)。近所の局が黙っていたら、それは故障ではなく、その局がその項目を測っていないということだ。

結: 中身を見てから、取れたと言う

  1. 200はデータの証明ではない。 404を返さないサイトでは、中身のヘッダ行を見る。これが今回いちばんの教訓だ。

  2. 速報値は時刻つきで伝える。 「01時の速報値では」の一言が、確定値との混同を防ぐ。

  3. 局の種類で意味が変わる。 一般局と自排局、測っていない項目。数字は出所とセットで読む。

kurashi-skillは公開開発中。リポジトリはここ → https://github.com/tahodev/kurashi-skill

ちなみにその時刻の東京のPM2.5は7だった。僕ののどのイガイガの犯人は、データでは特定できなかった。たぶん乾燥である。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?