YuliverseのNFT情報をマーケット(Element)から取得してYuliのステータスをseleniumでスクレイピングしてみた
はじめに
こんにちは、toppemaです。
普段は仮想通貨botterの情報を追ったり、気が向いたときにbotを作成したりしています。(儲かってるとはいってない)
今回初めてYuliverseというNFTゲームに参加して、日々経験値とARGトークンを細々と貯めています。
Yuliverseのゲーム性に関してはほぼポケモンGOなんですけど、私が説明するよりもすでに細かくプレイの仕方まで説明されている方がいますので、そちらを参考にしてください。
ちなみにまだ、トークン等は上場していないため、稼げるようになるのかも不明です。
結構公式のDiscordとかも盛り上がっていますので、個人的には期待しています。
最近、ARTというARGよりも入手しにくいトークンをゲットしている人もでてきているのでこれからまだ伸びていくと思っています。
このYuliverse、おそらく今後改善されるとは思うんですが、アプリにストアがありません。
なので現状、ElementやTofuなどからNFTを購入するしかないのですが、NFTのステータスがマーケットには反映されていないため、毎回購入時や市場の価格選定の際、公式のNFT検索でステータスを確認しなければなりません。
このステータスを見ないで購入すると、最悪ゲームの進行が詰まることもあります。(詳しくはrinrinさんの記事に書いてあります。)
その確認が少々面倒だったので、今回一気にマーケットの情報を取得して、検索をするプログラムを書いてみました。
その際に、seleniumでmetamaskを繋げたり、動的サイトのスクレイピング(Elementの情報取得)をするときに少々躓きましたので、noteを書いてみた次第です。
今回書くnoteはYuliverseをプレイしている人、もしくは始めようかなとか思ってる人向けですが、ほかのNFTゲームでもmetamask接続の知見とかは使えるかなとも思っていますので、興味のある方はぜひ読んでみてください。
pythonのサンプルコードのみXpathを探すのがだるかったので有料にしていますが、流れはあらかた記述しようと思っていますので、基本時間があって自分でスクレイピングできる人なら問題なく作成できると思います。その辺が面倒だったり、作成してみたけどわからなかったという方だけのご購入をお勧めします。
注意事項
動作環境
サンプルコードの動作環境は以下となります。
恐らく、動作環境の違いによってサンプルコードが動かなくなる場合があります。修正等ご要望は承りません。あくまでサンプルとしてお使いください。
また、環境構築や導入方法に関してのサポートは行いませんので、あらかじめご了承ください。
データの取得方法に関して
Element、Yuliverse共に、ブラウザで行うスクレイピングです。なので多少なりともサーバーに負荷がかかってると思われます。それに関してサーバーから何かしらの処罰があっても責任は負いかねます。ご了承ください。
Yuliのステータス確認時の注意
Yuli(YuliverseのNFT)のステータスを確認するには、Yuliverse公式サイトにmetamaskを接続しなければ検索ができません。なので、今回ステータスを取得するためにプログラムで自動的にmetamaskを接続します。
必ず、新しいmetamaskアカウントを用意して接続するようにしてください。なにかここで問題が発生しても一切の責任は負いません。もし他のNFTゲームに応用するにあたって既存のアカウントを接続しなければならないのであれば完全に自己責任でよろしくお願い致します。
サンプルコードに関して
スクレイピングにはXpathを使用しています。これはサイトの構成が変更されると使用できなくなる可能性があります。相談程度なら乗りますが、基本的にその際は、自身での修正をお願いいたします。
seleniumを用いてのコードになります。その際にロードを待つ時間がありますので、一瞬で取得とはなりません。
また、プログラマーでもない自分が書いた殴り書きのようなプログラムです。コードの質とか気にする方はおそらく憤怒すると思いますので、そっとこのタブを閉じてください。
Yuliのステータス取得までの流れ
以下が手動でYuliのステータスと価格を取得するまでの大雑把な流れです。
マーケット(今回はElement)から欲しいYuliの名前と価格を取得
Yulivers公式サイトにウォレットを接続
プロフィール欄にあるQuery Yuli InfoにYuliの名前の数字を入れる
ステータスを確認
すでにほしいYuliが決まっている場合は手動でもなんら問題はありませんが、市場調査やミスプライスを探すとなると、一括で情報をスクレイピングした方が早いです。スクレイピングする際の流れは以下になります。
マーケット(今回はElement)からYuliの名前と価格を全取得。
seleniumで起動するブラウザにmetamaskの拡張機能を入れ、有効化
メタマスクのウォレットをインポート
BSCを接続
Yuliverseの公式サイトを開く
ウォレットを接続
プロフィール欄のQuery Yuli InfoにYuliの名前を入れる
ステータスを取得
検索画面に戻り、次の名前を入れる
8,9をループ
取得した名前の最後まで検索を終えたら、見やすいようにデータフレーム化してcsvで出力
ElementのNFTスクレイピングに関して
Elementのサイトは下にスクロールをしていかないと、新しいNFTがローディングされていきません。
なので、単純にclassだけで取得を行おうとしても取得できないです。
動的なサイトなのでseleniumを使用して、データを取得後、スクロールを行い、再度取得を繰り返して一番下まで行っていきます。
どうしても、何度もスクロールをしていくため、時間がかかりますがこれが一番確実な方法だと思われます。
スクロールに使う関数は以下です
driver.execute_script("window.scrollTo(0, {});".format(height))
Elementのサイトに検索件数が表示されているので、それの値を取得し、スクレイピングで取得できた数が同じであれば、データの取得に問題がなかったということになります。
徐々にデータを取得して、リストに突っ込み、最後に重複しているところを削除することで、すべてのデータを取得することができます。
seleniumで動かすブラウザにmetamaskを導入
metamaskの導入に関しては、まずmetamaskのcrxファイルを取得してきます。
以下のサイトを参考にしました。
そして保存した、crxファイルをseleniumのOptionに読み込ませます。
EXTENSION_PATH = "file\metamask.crx"
options.add_extension(EXTENSION_PATH)
こうすることで、コードを実行したときに拡張機能が追加されてmetamaskの拡張機能が使えるようになります。
その上でmetamaskをインポートするurlをdriverのgetで呼び出します。
metamaskのインポートをする際には、seedキーとパスワードの変更が求められます。パスワードの変更に関しては、前のものと同じ文字列でも問題がなかったため、起動の際に毎回パスワードが変更されているようなイメージです。
あとは、ひたすらXpathを取得していって、そこに文字を入力したりクリックしたりすることで、metamaskを導入することができます。
Xpathの取得方法は以下のサイトが参考になります。
BSCの接続もmetamaskのネットワークを追加からXpathを取得しクリックしていくことでできます。
metamaskでBSCを導入する際や、この後に出てくるYuliverseにウォレットを接続するときに別タグが開かれる際はswich_to.windowを使用してあげると自動操作しているタブを変更できるので、操作できるようになります。
driver.switch_to.window(driver.window_handles[])
ここまでで、metamaskの導入を終えることができました。
Yuliverse公式にウォレットを接続、データを取得
metamaskを導入することができれば、あとは別タグでYuliverse公式サイトを開いて、ウォレットを接続し、検索までのXpathをクリックしてあげて取得してきたYuliの名前を検索ボックスに入れ、データを取得してくるだけです。
Yuliの名前は"YOG1#100003006"のようになっているため、数字の部分のみ取り出します。上の場合だと"100003006"のようなイメージです。
shieldやbreed回数などは画像で表示されているので、その個数を数えることで数値に直すことができます。
サンプルコードでは以下のようにファイルを生成しています。
csvにしているのは、Excelで開いてフィルターをかけたりして見やすくすることができるかなと思っています。
ここまでで、説明を終わります。そんなに難しいことはしていないと思います。
これをうまくやると、ミスプライスとかが出た瞬間に購入とかできるのかなーとかも思ったりしますが、サーバー代が怖いので、もし誰かいいアイデアあったら教えてください。オネガイシマス。
あくまで、有料のコードはサンプルです。自分で環境構築ができて調べることができる方のみのご購入をお願いします。
また、コードを公開するということなので返金は受け付けません。ご了承ください。
ここから先は
¥ 1,000
この記事が気に入ったらチップで応援してみませんか?