今まで例会データを収集するとき、スクリーニング不足と重複リスクという問題があった。各都道府県の公式サイトは構成がバラバラで、命名規則も住所の記載有無もまちまち。そのまま本番のvenues/meetingsに入れてしまうと、誤データが混入したときの影響が大きい。
そこで今日作ったのがraw_meetings(1次情報集積テーブル)だ。
[各ソース] → raw_meetings (status=raw)
↓ 自動スクリーニング
status = ok / duplicate / suspicious
↓ 人間確認(suspiciousのみ)
status = ok
↓ promote_to_meetings.py
venues / meetings(本番)
生データを削除せず常にINSERT ONLYで保持する。原典の証拠として永久保存する設計だ。これで「どのソースから来たデータか」が常に追跡できる。
各都道府県の公式サイトはHTMLの構造がバラバラだ。テーブル形式の県もあれば、散文テキストで書かれた県もある。これをパターン別に実装していたら時間がいくらあっても足りない。
そこで登場したのがclaude-haiku-4-5(haikuちゃん)だ。HTMLテキストを渡して「会場名・例会名・曜日・時刻をJSONで返して」と頼むだけで、サイト構成の違いを吸収してくれる。
curl でHTML取得
↓
テキスト抽出(script/style除去)
↓
haikuちゃんに投げる(max_tokens=8192)
↓
JSON配列で返ってくる
↓
raw_meetingsにINSERT
今日取得した県と件数:
| 都道府県 | 件数 | サイト | 特記 |
|---|---|---|---|
| 大阪府 | 60件 | fudanshu.com | テーブル構造・きれい |
| 京都府 | 34件 | danshu-heian.net | 住所・アクセスまで取得 |
| 福岡県 | 44件 | zdrfukuoka.jp | Googleマップ埋め込みで30万文字→実質2千文字 |
| 兵庫県 | 17件 | hyogo-dansyu.sakura.ne.jp | 夜例会は会場名なし(元サイトの問題) |
| 滋賀県 | 23件 | shigadansyu.com | Shift-JIS対応が必要 |
| 奈良県 | 17件 | nara-danren.com | 住所・曜日・時刻すべて揃う最高品質 |
| 北海道 | 28件 | Googleサイト | 4地区まとめて1ページ |
| 広島県 | 23件 | hiroshima-danshukai-rengoukai.com | 住所まで完備 |
| 岡山県 | 30件 | alien9.web.fc2.com | 2009年更新・needs_human_review=1 |
コストは大阪・京都・福岡・兵庫・滋賀・奈良・北海道・広島・岡山の合計で約$0.20(約30円)。コーヒー1杯どころかエスプレッソ一口分のコストで全国主要県を制覇できた。
ソーバーねっと(addiction-peer.net)はReactで動くSPAのため、通常のcurlでは例会データが取れない。JavaScriptを実行できるブラウザが必要だ。
そこで登場したのがヘッドレスChrome + Seleniumだ。画面なしでブラウザをバックグラウンド動作させる腕利きエンジニアの道具だ。
# Ubuntuサーバーでヘッドレスブラウザを動かす sudo apt-get install -y chromium-browser chromium-chromedriver pip install selenium --break-system-packages # ポイント:mtg_result.htmlはURLパラメータで直接検索できる https://addiction-peer.net/mtg_result.html?pref=43&page=2
このURLパターンを発見したことで、47都道府県×ページネーション対応のスクリプトが書けた。コストはゼロ。夜中にバックグラウンドで全県を回して完了。
| 都道府県 | 件数 | 都道府県 | 件数 |
|---|---|---|---|
| 大阪府 | 143件 | 福岡県 | 91件 |
| 京都府 | 77件 | 兵庫県 | 76件 |
| 島根県 | 64件 | 岡山県 | 57件 |
| 東京都 | 59件 | 沖縄県 | 34件 |
| 岩手・宮城・秋田・山形・群馬・石川・鳥取・鹿児島 | データなし(真の瀕死エリア) | ||
今日の作業で全国の断酒会情報源を整理できた。
| カテゴリ | 都道府県 |
|---|---|
| ✅ HP取得済み | 北海道・大阪・京都・福岡・兵庫・滋賀・奈良・広島・岡山 |
| ✅ iCal対応済み | 埼玉・千葉・東京・神奈川・静岡・栃木 |
| 🔵 iCal予定 | 茨城・香川 |
| 🟠 PDF保留 | 愛知・高知・島根・徳島・和歌山・山口・鳥取 |
| 🩷 JS保留 | 三重・沖縄・長崎 |
| ⬜ サイトなし | 青森・岩手・宮城・秋田・山形・福島・群馬・新潟・富山・石川・福井・山梨・佐賀・熊本・大分・鹿児島 |
岩手・宮城・秋田・山形・群馬・石川・鳥取・鹿児島はソーバーねっとにも登録がなかった。デジタル上に情報が存在しない、本当の意味での瀕死エリアだ。
これらの県に対しては、実際に断酒会員と直接会って話を聞くしかない。デジタルで届かないなら人が届く。それが「心の連鎖握手」の本質だと思う。
「完璧な自動化を最初から目指さない」ということだ。haikuちゃんの出力は確率的で、古いサイトのデータは不正確かもしれない。だからraw_meetingsというクッションを挟んで、人間が確認できる余地を残した。
人命インフラとして、間違った場所への案内は絶対に避けなければならない。精度を上げてから運用の手間を減らし、最終的にコストも下がる。焦らず一つずつ潰していく。それが今日の撃道だった。