
ログインが必要なページをスクレイピングする方法【競馬AI開発#53】
この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っています。
■今回やること
今回は、netkeiba.comのプレミアム会員限定ページをスクレイピングする方法について解説します。
競馬AIでは、レース結果や馬の過去成績やオッズなど、さまざまなデータをnetkeiba.comから収集していますが、例えば調教データなどの一部のデータはプレミアム会員でないと閲覧できないコンテンツです。通常のスクレイピングでアクセスしようとすると、ログインページにリダイレクトされてしまい、データを取得することができません。
そこで今回は、ブラウザ自動操作ライブラリPlaywrightを使って、ログインが必要なページのスクレイピングを実現していきます。記事は以下の2部構成で進めます。
■競馬AIについて
netkeiba.comから収集したデータを機械学習モデルに学習させることで期待リターンを計算し、リターンが最大化するように自動投票を行う競馬予想AIを開発しています。
すでにシステムとしては一通り完成しており、現在はこの完成したシステムをベースに、特徴量の追加やモデルの改善など、さらなる精度向上に取り組んでいる段階です。
このシリーズでは、こうしたシステムをゼロから構築する過程を、コード付きで詳しく解説しています。ソースコードは、下に進んでダウンロード・解凍すれば使うことができるので、ぜひ実際にコードを動かしてみてください。
1. Playwrightと前提知識
1.1. Playwrightとは
Playwrightは、Microsoftが開発したブラウザ自動操作ライブラリです。Pythonのコードからブラウザを操作し、ページの表示・フォームの入力・ボタンのクリックといった操作をプログラムで実行することができます。
WebスクレイピングといえばrequestsやurllibでHTMLを取得する方法がメジャーですが、これらはHTTPリクエストを送ってHTMLをダウンロードするだけなので、ログインが必要なページや、JavaScriptで動的に描画されるページには対応できません。一方Playwrightは実際のブラウザを起動して操作するため、人間がブラウザで行う操作と同じことをプログラムから実行できます。
Playwrightの基本的な使い方については、以下の記事で詳しく解説しています。
また、#32の記事ではPlaywrightを使ったIPAT(JRAの馬券購入サイト)への自動ログインと馬券の自動購入の仕組みを構築しています。今回のnetkeiba.comへのログインも、基本的な考え方は同じです。
1.2. Webサイトのログインの仕組み(Cookie・セッション)
Playwrightでログイン状態を保存する仕組みを理解するために、まずWebサイトのログインがどのように動作しているのかを初心者向けに解説します。
■Cookieとは
Webの通信は「HTTP」という仕組みで動いているのですが、この通信方法にはステートレス(状態を持たない)という性質があります。つまり、サーバーは1回のリクエストごとに「このリクエストは誰から来たのか?」を忘れてしまいます。
これだと、ログインしても次のページに移動した瞬間に「誰だっけ?」となってしまうので、ログイン状態を維持する仕組みが必要になります。そこで使われるのがCookie(クッキー)です。
Cookieは、サーバーがブラウザに預ける小さなデータです。お店で発行される会員証のようなもので、初めてお店に行ったとき(=ログインしたとき)に会員証を発行してもらい、次回以降はその会員証を見せるだけで本人確認が済みます。
Cookieも同じで、一度ログインするとサーバーから「セッションID」という会員証が発行され、以降のアクセスではブラウザがこの会員証を自動的に提示してくれます。
具体的な流れは以下の通りです。
1. ユーザーがID・パスワードを入力してログイン
↓
2. サーバーが認証し、セッションIDを発行
↓
3. サーバーが「Set-Cookie: session_id=abc123」をブラウザに返す
↓
4. ブラウザがCookieを保存
↓
5. 以降のアクセスでは、ブラウザが自動的にCookieを送信
→ サーバーはCookieを見て「ログイン済みのユーザーだ」と判断つまり、Cookieさえ持っていればログイン済みとして扱われるわけです。この仕組みを理解しておくと、後で登場するstorage_state()で「なぜログイン状態を保存できるのか」がすんなり理解できます。
■CookieとlocalStorageの比較
Cookieの他にも、Webブラウザ上でデータを保存する仕組みとして「localStorage」があります。

Playwrightのstorage_state()はこの両方をまとめてJSONファイルに保存・復元してくれるため、サイトがどちらの仕組みでログイン情報を管理していても対応できます。
1.3. 前提条件・セットアップ
ここから、実際にplaywrightを動かして、プレミアム限定ページの情報を取得してみましょう。それにあたって、前提条件をまとめておきます。
■前提条件
・netkeiba.comのプレミアム会員であること
・playwright install でブラウザをインストール済みであること
・.envファイルにログイン情報を設定済みであること
■.envファイルの準備
ログイン情報(メールアドレスとパスワード)は、セキュリティのためにコードに直接書かず、.envファイルに記載して読み込みます。(.envファイルによるパスワード管理の方法は、#32の記事でも解説)
▼.env
NETKEIBA_EMAIL=your_email@example.com
NETKEIBA_PASSWORD=your_password■ディレクトリ構成
ソースコードを入手している方は、以下のようなkeibaAI-v3/common/src/にdev.ipynbを配置して実行すると良いでしょう。
keibaAI-v3/
└── common/
├── src/
│ └── dev.ipynb ← 今回のnotebook
├── data/
│ ├── session/
│ │ └── netkeiba_state.json ← セッション保存ファイル
│ └── html/
│ └── horse/
│ └── training/ ← スクレイピング結果の保存先
└── .env ← ログイン情報2. 逐次実行で動きを体感する
まずはPlaywrightの操作を1ステップずつ実行して、何が起きているかを確認しましょう。各セルを実行するたびに、ブラウザが動く様子を目で見ることができます。
最初にライブラリのインポートと定数の定義を行います。