3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🎯Numbers3&4の当選番号を予測する『MAGI』システムを作る - データ収集編

Last updated at Posted at 2025-07-05

1. はじめに

どうも、趣味でデータ分析している猫背なエンジニアです。

え~宝くじで一攫千金したくないですか?
宝くじの当選番号を予測するシステムを長年愛してやまない『新世紀エヴァンゲリオン』に登場するMAGIシステムをコンセプトに、つくりたい!そうしたい!と思って開発記録を書いていきます。この記事ではそのデータ収集編と題して当選番号の収集を紹介します。

2. これまでの「🎯Numbers3&4の当選番号を予測する『MAGI』システムを作る」

これまでのエヴァンゲリオン.png

西暦2025年。
あるエンジニアは、繰り返される敗北の記録——「宝くじの外れ券」の山に終止符を打つべく、ひとつの意思決定機構を構築する決意を固めた。
その名は―― N-MAGIシステム。
モデル名はMELCHIOR、BALTHASAR、CASPER。
それぞれが異なる思考ロジックを持ち、合議によって“もっともらしい当選数字”を導き出す。
ベースとなったのは、かつて存在した神話と、そして…アニメ『新世紀エヴァンゲリオン』の意志決定AI。
過去のデータ、時系列学習、出現頻度、逆張りアルゴリズム。それらを融合させ、抽選数字の予測という“人類補完計画”にも似た夢を追い求める開発者の姿があった。

すべては「当てたい」という欲望と、「遊びたい」という本能のままに。

っていう茶番はおいといて...本編に入ります👍

3. 乱数を予測するのになぜ「データ収集」が重要?

Numbers3やNumbers4の当選番号は、基本的に完全ランダムな数字によって決定されます。
そのため、特に工夫をせずに「なにかの番号が欲しい」場合、Pythonのrandomライブラリなどを使って、無作為に数字を生成すれば済む話です。

……ですが、
みずほ銀行の公式サイトでは、過去すべての当選結果が丁寧に公開されています。
これはもう、「使ってください」と言わんばかり。使わない理由がありません。

また、機械学習にしろ統計的分析にしろ、学習には必ず良質な過去データが必要です。
ランダムとはいえ、そこには数字の偏りや分布の揺らぎが現れてくるものです。
それをもとに、「もっとも出やすい数字」や「最近あまり出ていない数字」、「桁ごとの傾向」などを拾い上げて、自分だけの “もっともらしい予測数字” を描いていくのです。

というわけで、平日に更新されるNumbers3&4の当選結果を、みずほ銀行の公式ページから自動で取得し、学習用データとして整形するPythonスクリプトを作成しました。

4. 使用API(BeautifulSoupとPlaywright)

Numbers3/4の最新当選データを取得するために、今回のMAGIシステムでは「Playwright」と「BeautifulSoup」を組み合わせて使用しています。

Playwrightとは?

Microsoft製の次世代ブラウザ自動操作ライブラリです。JavaScriptベースで開発され、Pythonからも簡単に操作できます。
主な特徴として、「JavaScriptで描画されるサイトにも対応」や「Headlessモードで高速&安定動作」「async/await 対応で並列処理が得意」という点があります。特にJavaScriptで描画されるサイトに強いというのはSeleniumに代わってうれしい点です。
みずほ銀行の宝くじページは、一部がJavaScriptで描画されているため、普通のHTTPリクエストだけではデータが取れません。Playwrightを使うことで、あたかも人間がブラウザを開いて操作しているかのように、ページを「完全描画後」に取得できます。

BeautifulSoupとは?

Python製のHTML/XMLパーサ。HTMLの構造を解析し、特定のタグ・クラス名などから必要な情報だけを抽出できます。HTMLをツリー構造として扱えるsoup.select()などでCSSセレクタによる抽出が可能。直感的なAPIでわかりやすい。
今回はPlaywrightで取得した完全描画済みのHTMLページを受け取り、それをパースして「当選日」や「当選番号」だけを抽出します。

5. システム全体の流れ

Playwrightが「ページを開く手」、BeautifulSoupが「中身を読む目」という方法を用いて以下の流れで取得します。

  1. PCからみずほ銀行のサイトにアクセスし、BeautifulSoupとPlaywrightでHTML解析を実施。
  2. HTML解析後に数字と日付を抽出。
  3. 抽出したデータを過去データとマージして蓄積。

6. データ取得の肝:Playwright × BeautifulSoup

① データ取得の基本形

Playwrightでアクセスして、b.js-lottery-number-pc などのセレクタで数字を取得:

py
content = await page.content()
soup = BeautifulSoup(content, "lxml")
dates = soup.select("td.section__table-data.section__table-cell--center.js-lottery-date-pc")
numbers = soup.select("b.section__text--bold.js-lottery-number-pc")

② 不完全データ検出とリトライ機構

みずほのページはたまに落ちたり、空欄があったりするため、
チェックして、最大3回までリトライする仕組みを追加。
n3[0] : 日付
n3[1] : Numbers3の当選番号
n4[1] : Numbers4の当選番号

py
if not n3[0] or not n3[1] or not n4[1]:
    raise ValueError(f"不完全なデータを検出: {n3}, {n4}")

③ サーバ負荷軽減のための待機

単純にDoS的攻撃と勘違いされては本末転倒。
スクレイピングは、技術的には可能でも、相手サイトに負担をかけないマナーある設計がとても重要です。このawait asyncio.sleep(2)のような「一呼吸置く」実装は、処理をブロックせずに非同期的にスリープします。

py
await asyncio.sleep(2)  # サーバー負荷軽減のための待機

※Playwrightの初回セットアップとしてブラウザパスの設定が必要な場合もあり、私はここまでたどり着くのに悩み、自動化が遅れました。

os.environ["PLAYWRIGHT_BROWSERS_PATH"] = "C:\\Users\\YourName\\playwright-browsers"

※ソースコードは非公開ですが、重要な部分だけ公開しちゃいます。みなさんのオリジナリティで高速かつサーバ負荷が小さいものを目指してみてください。

7. 保存形式

保存フォーマットはCSVで、取得した宝くじのデータを「過去データの蓄積(使用ファイル)」と「過去データの蓄積(バックアップアーカイブ)」「最新の抽出したデータ」という3種類の構造に分けて保存しています。

保存ファイルの構成
D:/01.開発/06Numbers3/
├─ data.csv                         ← 毎回更新される全体データ
├─ collect_new_lottery_data.csv     ← 今回取得した最新の抽選データ
└─ numbers_19941007_to_20250704.csv ← 日付範囲で保存されるスナップショットデータ

collect_new_lottery_data.csv(最新データ)

Playwright+BeautifulSoupで取得した「直近の抽選結果」を保存します。これは一時的な保存用ファイルであり、取得直後に中身をチェックしたり、既存データとマージする際に使用されます。
※最後の1行には列名そのものをデータとして追加。(これがないとバグってしまうプログラムになっているので後々直したいところ...。)。

collect_new_lottery_data.csv
date,number3,number4
2025年7月4日,407,2452
2025年7月3日,108,1479
2025年7月2日,897,3099
2025年7月1日,307,5261
2025年7月4日,407,2452
date,number3,number4

data.csv(バックアップアーカイブ)

過去から現在までの抽選結果を一元管理するメインデータファイルです。merge_data()関数で自動的に作られ、重複を避けつつ新しいデータを結合します。また、日付は「YYYY年MM月DD日」形式で統一し、重複排除・日付順にソート、毎回上書き保存で最新の状態を保つ仕組みを構築しています。

data.csv
date,number3,number4
1994年10月07日,191,1149
1994年10月14日,988,7921
1994年10月21日,194,0097
...
2025年07月02日,897,3099
2025年07月03日,108,1479
2025年07月04日,407,2452
date,number3,number4

numbers_YYYYMMDD_to_YYYYMMDD.csv(使用ファイル)

これは、data.csvと同内容ですが、対象期間をファイル名に含めたアーカイブ形式です。
実験データとして、仮にデータが消えてもいいように呼び出し用ファイルとして使用。のちのち外部公開用としても準備中です。

numbers_YYYYMMDD_to_YYYYMMDD.csv
numbers_19941007_to_20250704.csv

8. おまけ - 中身を見てみる!

おまけとして出現数をNumbers3/Numbers4で見てみました!
こういう傾向系もモデルに加えることで当選率上げれるかもと思うとモデルづくりがワクワクしますね...😏

  • Numbers3
    image.png

  • Numbers4
    image.png

9. 次回予告

次回予告.png

データを武器にする知性のロマンは、きっと数字を越えるはず。

10. 今後の記事予定(MAGI伝記)

1. 【作戦概要】:全体構想と設計方針
  - 全体構想と設計方針
2. 【データ収集編】(今回):過去の当選番号の収集
  - 過去の当選番号をどう集める?
3. 【モデル構築編】:3種のモデル(CASPER / BALTHASAR / MELCHIOR)実装と精度比較
  - CASPER / BALTHASAR / MELCHIORの実装と精度比較
4. 【投稿編】:X APIを用いた投稿
  - X APIを用いて予測を自動投稿
5. 【UI&演出編】:MAGI風UIをTkinterで再現して、予測を視覚化!
  - TkinterでMAGI風UIを構築

謝辞

今年の10月に30周年を記念すること、誠におめでたく思っております。前回の「庵野秀明展」に引き続き「30周年記念展ALL OF EVANGELION」にもぜひ行きたいと思っております。引き続き応援しています!

付録

ここまで読んでいただいた方、ありがとうございます。最後まで読んでいただいた方だけに付録を添付いたします。
現在、β版としてN-MAGIを運用しております。サンプルを置いておきますので、ぜひチェックしてみてください👍

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?