スクレイピングで大量のパチンコ・パチスロデータを一気に収集する方法

プログラミングでギャンブル攻略

パチンコ・パチスロの遊戯データをメモしている方もいるかと思いますが、1店舗数百件のデータを毎日手動でまとめ続けるには相当な情熱と時間が必要です。しかし、そこまでガチで取り組める方は稀だと思いますんで、今回は自分の代わりに遊戯データを収集してくれるコードを書いてみたいと思います。

使用言語はマイブーム中のpythonを使って解説して行きます。

実践的なスクレイピングの注意点

webサイトからデータを収集するには「スクレイピング」と呼ばれる手法を使います。スクレイピングを検索するとネガティブな内容の記事も多く見られますが、基本的にはブラウザでサイトにアクセスする行為と同じです。後は画面を見ながら紙とペンでメモを取るか、通信内容を解析してパターンに合致したデータを機械的に抜き出すかの違いです。

スクレピングを用いる場合、注意しなければならない点がいくつかあるので実践的なやつをご紹介します。

  1. 同時アクセス(=並列処理、処理は早いが相手サーバーの負荷が高まる)
  2. 連続アクセス(サイトを開く・更新する等、通信を伴う処理は間にsleepを入れる)
  3. IPアドレスの秘匿(アクセスブロックを回避するためプロキシを刺す)

とりあえずこの3つさえ気を付ければ開発に不都合は無いと思いますんで、パチンコ・パチスロに関わらずデータマイニングの際には注意して下さい。

データマイニングは2つのライブラリで十分!

「python スクレイピング ライブラリ」で検索すると大体人気のライブラリは3-4個に絞られるようですが、僕のオススメは標準搭載のurllibと色々出来て便利なseleniumの2つです。それぞれの特徴を簡単にご紹介します。

使いやすくて比較的動作が早いurllib

urllibはpythonに標準搭載されていてすぐに使えるライブラリです、シンプルで動作が軽く分かりやすいと思います。論より証拠という事で簡単なスクレイピングのコードを動かしてみます。

動画の例ではbrightdataというサービスで提供されている認証付きプロキシを利用していますが、下記にプロキシを持っていない環境も含めた3パターンのサンプルコードを掲載しておきますんで、好きなやつで試してみて下さい。

サンプルコード(プロキシ刺さないver)

import urllib.request
import random

#収集先サイト
target_url = 'https://ipinfo.io/'
#target_url = 'https://yahoo.co.jp'
#target_url = 'https://www.amazon.co.jp/'

opener = urllib.request.build_opener()
scraping_model_list = opener.open(target_url).read().decode('utf-8').replace("&", "&")
print(scraping_model_list)

サンプルコード(プロキシ刺すver-brightdata)

import urllib.request
import random

#収集先サイト
target_url = 'https://ipinfo.io/'
#target_url = 'https://yahoo.co.jp'
#target_url = 'https://www.amazon.co.jp/'

#プロキシを刺す-brightdata用
username = 'ユーザー名'
password = 'パスワード'
port = 22225
session_id = random.random()
super_proxy_url = ('http://%s-country-jp-session-%s:%s@zproxy.lum-superproxy.io:%d' %
    (username, session_id, password, port))
proxy_handler = urllib.request.ProxyHandler({
    'http': super_proxy_url,
    'https': super_proxy_url,
})

opener = urllib.request.build_opener(proxy_handler)
scraping_model_list = opener.open(target_url).read().decode('utf-8').replace("&", "&")
print(scraping_model_list)

サンプルコード(プロキシ刺すver-認証なし)

import urllib.request
import random

#収集先サイト
target_url = 'https://ipinfo.io/'
#target_url = 'https://yahoo.co.jp'
#target_url = 'https://www.amazon.co.jp/'

#プロキシを刺す
proxy_handler = urllib.request.ProxyHandler({
    'http': 'IPアドレス:ポート',
    'https': 'IPアドレス:ポート',
})

opener = urllib.request.build_opener(proxy_handler)
scraping_model_list = opener.open(target_url).read().decode('utf-8').replace("&", "&")
print(scraping_model_list)

人間が手で行うブラウザ操作を再現できるselenium

seleniumはインストールが必要な外部ライブラリで、通信の条件やブラウザの種類・操作などを細かく指定する事ができます。urllibと同じようにまずは動いている所を下の動画で確認して下さい。

サンプルコード

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from webdriver_manager.chrome import ChromeDriverManager
from fake_useragent import UserAgent

#収集先サイト
target_url = 'https://ipinfo.io/ip'
#target_url = 'https://yahoo.co.jp'
#target_url = 'https://www.amazon.co.jp/'

#ドライバ設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument("--proxy-server=IPアドレス:ポート")
options.add_argument('user-agent='+UserAgent().random)
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptInsecureCerts'] = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options, desired_capabilities=capabilities)
driver.implicitly_wait(10)

driver.execute_script("window.open()") #タブ開く
driver.switch_to.window(driver.window_handles[1]) #2番目のタブに移動
driver.get(target_url)
print(driver.page_source)

seleniumのヘッドレスモードで認証付きプロキシを刺す方法

seleniumにはブラウザの実行をバックエンドで行うヘッドレスモードというオプションがあり、ブラウザが画面上に立ち上がらないので物理的にユーザーの入力を受け付ける事ができません。これはseleniumによる自動処理中にユーザーの入力を防いだり、ブラウザを表示しないので動作が早くなるなどのメリットがあります。

しかし、このヘッドレスモードはブラウザが立ち上がらないため、ポップアップで入力を求められる認証付きプロキシのユーザー名とパスワードを入力する事ができません。あちらを立てればこちらが立たず。

散々調べた結果、ヘッドレスモードで起動しているseleniumでは認証時のユーザー名・パスワードの入力を行わせる動作は不可能、という結論に至りました。では望む動作をさせるにはどうすればいいか。

おそらくbrightdata限定のやり方だと思いますが、seleniumを起動する前にプロキシマネージャーを起動し認証が通った状態を維持する事で、サイトにアクセスする際の認証ポップアップを回避する事ができました。具体的にはこんな感じです。

処理前にプロキシマネージャーを起動するという1手が増えてしまいましたが、ヘッドレスモードで認証付きプロキシを刺すという目的は達成する事ができました。

プロキシマネージャーの導入手順はこちらの記事にまとめています。

データサイトから台データを抜き出すコードの基本構成

スクレピングのコードは特に複雑というわけではなくある程度型が決まっていて、コピペするだけで誰でも動かす事も可能です。収集先サイトとマッチングパターンを変えるだけで欲しいデータを簡単に抜き出せます。

今回はデータサイトから「機種名・台番号・BIG・REG・ART・総回転数・現在のハマりゲーム数・差枚数」を取得するために必要なコードを書いてみたいと思います。データの保存まで考えると下記のような構成が一般的だと思います。

  1. 収集先データサイトを変数に格納
  2. マッチングパターンを変数に格納(xpath or 正規表現)
  3. URLを開いてhtmlコードを取得
  4. 取得したhtmlコードとマッチングパターンを付け合わせ
  5. 合致した値を変数に格納
  6. 差枚数グラフまで画面移動
  7. 差枚数グラフのスクショを画像で保存
  8. 保存したグラフ画像から差枚数を計算する
  9. DB開く
  10. DBに5で抜き出した値と8で計算した差枚数を保存
  11. DBを閉じる

これらを実行するとデータベースに以下のように保存されます。

まさにこのデータが欲しかった!って感じじゃないでしょうか。僕はこのコードが完成した時めちゃくちゃ感動しました笑

差枚グラフから出玉を機械的に計算する概要

コード構成の中でネット上に情報が少なく詰むポイントは6-8の差枚数計算の部分ではないでしょうか。これはスクレイピングでは取得できない値なので、画像処理にて差枚グラフの最終座標を計算して、枚数軸の最大枚数から座標の枚数を逆算する必要があります。

簡単に説明すると、こんなパチスロのスランプグラフがあったとします。

このスランプグラフを見て最終的な差枚数は何枚だと思いますか?大体+1,500枚くらいでしょうか、関係ないですが連チャンとハマりを繰り返しているので機種はAT・ART機っぽいかも、と僕なら考えると思います。

では今どうやって頭の中で差枚数を計算したか言葉で説明できますか?折れ線グラフの最終位置からずーっと左側の差枚軸まで移動して、1,000と2,000の間くらいにあるから大体+1,500枚くらい?と計算したんじゃないでしょうか、これと同じロジックをプログラムで再現するにはこんな工夫をします。

人間が判断する場合は何となく視線を移動する事で情報を把握できますが、プログラムで同じ事をさせるにはグラフ画像をマス目で区切って座標を明確にします。今回は35(x軸)×20(y軸)マスとなりました。

こうすると差枚グラフの最終座標は?と聞かれれば、グラフ開始の0地点からx軸方向に1,2,3…、y軸方向に1,2,3,…と数えていくと「35×17」と明確に答える事ができますね。

そして、y軸の座標位置が17マス目と分かれば後は差枚数の計算は簡単です。差枚軸(y軸)の最大値は20マスで最大差枚数は2,000枚と表示されているなら、1マス当たり100枚で表示されている事が分かります。後は最終座標の17マス目と100枚を掛けてやれば17×100で+1,700枚と差枚数が計算できますよね。

こんな計算をOpenCVやnumpyというライブラリを使って機械的に計算するわけですね。

データサイトから値を抜き出すコピペコード

下記で掲載しているサンプルコードはコピペで動きますが、IPアドレスをブロックされるリスクを回避するためbrightdataという有料のプロキシサービスを利用しています。安全にスクレイピングを行いたいという方は先に登録して、ゾーンを作成しプロキシマネージャーをダウンロードして下さい。

brightdataのアカウント登録からプロキシマネージャーのダウンロードまでは「【スクレイピングブロック対策】IPアドレスを分散・自動変更する方法まとめ」の記事で詳しく解説していますので、読んでみて下さい。

一方、「IPアドレスのブロックなど構わん、すぐに試したい!」という豪快な方もいるかもしれませんのでプロキシの準備なしで動くコードも用意しました。当然ですがこっちのコードはIPアドレスをブロックされてデータサイトにアクセス出来なくなる可能性があり、そうなった場合僕は責任取れませんのでリスクを理解した上で必要ならご利用下さい。

また、実際にスクレイピングを実行できてしまうソースコードを一般公開するのはリスクがあるので、以降は有料コンテンツとさせて頂きます。

コピペコードでは実際に存在するデータサイトを例に、1クリックで店舗内のすべてのパチンコ・パチスロデータを収集できるようになります。実行時の様子はこんな感じです。

興味がある方はぜひご購入下さい m(_ _)m

サンプルコード

----▽ ここから有料です ▽----

決済方法料金返金アカウント登録購入
note.com1,990円24時間以内不要¥1,990 – 購入する
paypal1,990円いつでも必要

当コンテンツは閲覧パスワードを購入された方限定で公開しております。必要な方は上記の購入ボタンより各サイトにてお支払い手続きをお願いしますm(_ _)m

【返金保証付き】記事の内容に不満があれば全額返金します!

記事の内容に満足頂けない場合はお支払い頂いた料金をすべてお返しします。

  • noteよりご購入された場合:note.comにてご確認下さい。
  • paypalよりご購入された場合:お問い合わせより「購入日」と「paypalの取引ID」をご連絡下さい。

有料記事に関するNG行為

  • パスワードを第三者に譲渡する行為
  • 不正に入手したパスワードで有料記事を閲覧する行為

上記のルールを違反した場合は筆者が怒りますので、お気を付けください(゚Д゚;)

 

コメント

  1. 内堀 利章 より:

    初めまして、Pythonも超初心者で申し訳ないのですが・・・
    上記コードをPythonにコピー&ペーストし、こちらで変更する箇所は
    プロキシ使うVERであれば、どこの列にURLを添付したら宜しいのでしょうか?
    また、コード内に日本語の記載が御座いますが、これはこのままで問題ないのでしょうか?
    初心者で申し訳ございませんが、何卒宜しくお願い致します。

    • DIYプログラミング管理人 より:

      DIYプログラミングのスマイルです(‘ω’)ノ

      >プロキシ使うVERであれば、どこの列にURLを添付したら宜しいのでしょうか?

      224行目の「target_url」を収集したいURLに書き換えて下さい。

      >また、コード内に日本語の記載が御座いますが、これはこのままで問題ないのでしょうか?

      pythonは#でコメントアウトなのでそのままで大丈夫ですよ。

      よろしくお願いしますm(_ _)m

  2. 内堀利章 より:

    返信有難う御座います!
    このコードをコピーして、urlの部分を使えば行けるのですね!
    試させていただきます!
    有難う御座いました!