ごごちと申します。
Debankで仮想通貨のログを自動取得する
Pythonスクレイピングプログラムを作成しました。
【仮想通貨】DebankのPythonスクレイピング結果のグラフ化!分散型取引所(DEX)の成績を比較しやすくしました!
また、Windowsタスクスケジューラを使った
定期実行も紹介しました。
スリープ中でもPythonスクレイピングプログラムを定期実行する方法【タスクスケジューラ】【Windows10】
今回は筆者が用いた環境の構築方法を説明します。
OSはWindows10です。
以下の順番で説明します。
- Anacondaのインストール
- VScodeのインストールと設定
- Google Chromeを用いたスクレイピング
1. Anacondaのインストールと仮想環境作成
Anacondaのインストール
①Anacondaの公式ページから
ダウンロード>インストールします
Pythonのバージョンは
最新のもので問題ありません。
この記事を書いた時点では Python 3.10です。
インストールする際の設定は
特に変更する必要はありません。
すべてデフォルトの設定でインストーラを進めます。
conda仮想環境の作成
②Windowsメニューから
Anaconda > Anaconda Prompt
を開きます。
③以下のコマンドを実行して「py_test」という名前の仮想環境を構築します。
conda create --name py_test python=3.10 numpy=1.23 pandas openpyxl selenium matplotlib
仮想環境の構築と同時に、
以前紹介したプログラムが動作するように
必要となるライブラリのインストールも
同時に行います。
④インストールが完了したら、
以下のコマンドを実行して
作成した仮想環境を確認できます。
「-e」 は environments の略です。
conda info -e
⑤次のコマンドを入力して
仮想環境をactivateします。
conda activate py_test
上記の④までがうまくいっていたら
(base)環境から(py_test)環境に
移動していることかと思います。
⑥(py_test)環境下で以下のコマンドを実行し
seleniumライブラリを最新のものにします。
pip install -U seleniumu
⑦(py_test)環境下で以下のコマンドを実行し
numpyのバージョンが1.23.X
であるのを確認しておきます。
conda list
⑧確認出来たら以下のコマンドで
(py_test)環境を終了します
conda deactivate
⑨(base)環境で以下のコマンドを実行します。
conda init powershell
Windows PowerShellから
Anaconda PowerShellを
利用できるようにする設定です。
以上でAnaconda PowerShell側での設定は終了です。
2. VScodeのインストールと設定
VScodeのインストール
⑩公式サイトからVScodeを
ダウンロード > インストール
します。
Pythonのインストール
⑪左側のアイコンを選択し
検索欄に「Python」と入力。
「Python」の「Install」ボタンを押します。
これでVScode側でPythonに関する
設定ができるようになります。
AnacondaへのPath設定
⑫ 左下の歯車マーク >
「Settings」を押します。
⑬検索欄に「Python Default」と入力します。
Python : Default Interpreter Path
の欄に、
Anacondaのbase環境のPathを設定します。
Pathを確認するには
Anaconda PowerShellを開き、
以下のコードを実行します
conda info -e
上図の例では、
C : \Users\(xxxxx)\anaconda3
をPython Default Interpreter Pathに入力します。
(xxxxx)には各自のユーザ名が入ります。
バックスラッシュ(\)または(¥マーク)は
スラッシュ(/)に変えてください。
Windows PowerShellからAnaconda PowerShellを使う設定
VScodeのデフォルトのターミナルは
Windows PowerShellなので、
Windows PowerShellから
Anaconda PowerShellを使えるようにします。
⑭ Windowsスタートメニューの検索欄に
「powershell」と入力
⑮ Windows PowerShellを
右クリック > 管理者として実行
⑯ 以下のコードを実行します。
Set-ExecutionPolicy RemoteSigned
そのあと実行ポリシーの変更を
「y」
と入力してEnterを押します。
これでWindows PowerShellを
Anaconda PowerShellから利用
できるようになりました。
VScodeでAnaconda PowerShellの確認
⑰ VScodeの
「File」タブ >
「New Window」を選択
⑱ 新しいウインドウの下の方の
青線の部分でマウスカーソルが
矢印に変わったら上方向にドラッグして
ターミナルを確認する
⑲設定が成功していればターミナルで
Anaconda PowerShellが起動しているのが
確認できます。
3. Google Chromeを用いたスクレイピング
ここからは、
上記までで作成した「py_test」仮想環境で
Google Chromeを用いたスクレイピングプログラム
「scraping.py」を作成したいと思います。
⑳作業フォルダを作成します。
画像の例では、
デスクトップに「py_scraping」という
作業フォルダを作りました。
作業フォルダはどこに作成しても問題ありません。
Google Chromeに対応するchromedriver.exeのダウンロード
Google Chromeを使って
スクレイピングするためには、
以下の準備をします。
1. Google Chromeのバージョンを確認
㉑ Google Chromeを起動し、
右上の三点マーク
> ヘルプ > Google Chromeについて
を押します。
㉒ Chromeのバージョンを確認します。
画像の例では、バージョン 113.x.xxxx.xx
であることがわかります。
2. Chromeのバージョンに対応したドライバの設置
次にChromeのバージョンに対応したドライバ
「chromedriver.exe」をダウンロードして、
作業フォルダ「py_scraping」に設置します。
㉓こちらのページから「chromedriver.exe」
をダウンロードします。
画像の例では、バージョン113に対応する
windows用のドライバをダウンロードします。
㉔ ダウンロードしたzipファイルを
作業フォルダ「py_scraping」に設置し、
右クリック > 「すべて展開」
をして、「py_scraping」の中に展開します。
chromedriver.exeを使ったスクレイピングのテスト
テストとして、
仮想通貨の時価総額をまとめたサイト
CoinMarketCapの情報取得を
行いたいと思います。
ここでは、
各トークンの価格を取得したいと思います。
VScodeのエディタでscraping.pyを
作成したいと思います。
㉕ VScodeの
「File」タブ > 「Open Folder」を選択
「py_scraping」作業フォルダを選択します。
これによって、ターミナルのカレントディレクトリが
「py_scraping」作業フォルダに移動します。
㉖ 新規ドキュメント作成アイコンを押し、
「scraping.py」という名前を付けます。
㉗以下のコードをコピー&ペーストして
Ctrl+Sで保存します。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
#chromeでアクセス
options = webdriver.ChromeOptions()
###########################################################################################################################################
# chromedriver.exeの絶対パスを指定
service = webdriver.chrome.service.Service(executable_path = 'C:\\Users\\xxxxx\\Desktop\\py_scraping\\chromedriver.exe')
###########################################################################################################################################
driver = webdriver.Chrome(service=service, options=options)
# ページ全体の要素を取得
driver.get('https://coinmarketcap.com/ja/')
time.sleep(5)
# テーブル全体の要素を取得
# Copy Xpathの結果
# //*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[4]/table
main_container = driver.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[4]/table')
# 各トークンの価格をまとめたリストを取得
# Copy elementの結果
# <div class="sc-cadad039-0 clgqXO"><a href="/ja/currencies/bitcoin/markets/" class="cmc-link"><span>¥3,947,999.24</span></a></div>
all_Token_elements = main_container.find_elements(By.XPATH, './/*[contains(@class,"sc-cadad039-0 clgqXO")]')
# 各トークンの価格をテキスト表示
for Token_element in all_Token_elements:
print(Token_element.text)
㉘ターミナルで仮想環境をactivateして
scraping.pyを実行します。
conda activate py_test
python scraping.py
㉙上記のコマンドを実行すると、
Google Chromeが立ち上がり、
CoinMarketCapのページが表示されます。
ページ読み込みのため5秒待機した後、ターミナルに
各トークンの数値情報が表示されます。
実行時にUSBデバイスに関する
エラーが出ても問題はありません。
スクレイピングプログラムの解説
executable_path という引数には、
chromedriver.exe の絶対パスを入力します。
chromedriver.exeの上でShiftキーを押しながら
右クリック > パスをコピー
で取得できるものをペーストします。
# chromedriver.exeの絶対パスを指定
service = webdriver.chrome.service.Service(executable_path = 'C:\\Users\\xxxxx\\Desktop\\py_scraping\\chromedriver.exe')
まず以下のコードで
ページ全体の要素を読み込みます。
# ページ全体の要素を取得
driver.get('https://coinmarketcap.com/ja/')
次に以下のコードで
テーブル全体の要素を取得します。
# テーブル全体の要素を取得
# Copy Xpathの結果
# //*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[4]/table
main_container = driver.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[4]/table')
driverというオブジェクトには
「find_element」というメソッドがあります。
「find_element」の引数に
XPathを渡してテーブル全体の要素を取得して
main_containerというオブジェクトに渡します。
ここで、XPathはHTML中における
要素の位置を示すものです。
XPathを取得するために、
CoinMarketCapのページで
「Ctrl + Shift + C」で
Chromeのインスペクター機能を起動します。
まずテーブル全体の要素が何かを調べるために、
class = “sc-xxxxxxxx_cmc-table”にあたる要素が
テーブル全体を指し示すことがわかります。
実際、このクラスの上にマウスを置くと
テーブル部分が青くハイライトされます。
そこで、このクラスの上で
右クリック > Copy > Copy XPath
をクリックしてください。
そして、By .XPathの後のstr引数にCtrl + Vでペーストします。
# Copy Xpathの結果
# //*[@id="__next"]/div/div[1]/div[2]/div/div[1]/div[4]/table
テーブル全体の要素のXPathは、
//*[@id=”__next”]/div/div[1]/div[2]’
であることがわかります。
この情報を「find_element」メソッドの
By.XPathに続く引数に渡します。
次にテーブルから
各トークンの価格をまとめたリストを取得します。
# 各トークンの価格をまとめたリストを取得
# Copy elementの結果
# <div class="sc-cadad039-0 clgqXO"><a href="/ja/currencies/bitcoin/markets/" class="cmc-link"><span>¥3,947,999.24</span></a></div>
all_Token_elements = main_container.find_elements(By.XPATH, './/*[contains(@class,"sc-cadad039-0 clgqXO")]')
main_containerというオブジェクトは、
driverオブジェクトと同じく、
「find_elements」というメソッドを持っています。
複数形のsがついていますので注意。
これは第2引数に「contains」を含めることで、
class名に指定した文字列を含む要素を複数抽出し
「all_Token_elements」という
リスト型変数に格納します。
抽出したい各トークンの価格情報の
クラス名の確認方法は以下の通りです。
先ほどの”cmc-table”の配下には、
<tr>…</tr>と書かれた行が
いくつもあるのがわかります。
そしてこれら1行1行が各トークンの
行に対応していることが確認できました。
これらを「find_elements」メソッドの
「contains」によりclass名のパターン抽出で
まとめて取得します。
Bitcoinの行の値段に
カーソルを置きクリックすると、
「div.sc-cadad039-0.clgqXO」
とクラス名が表示され、
右側のHTMLも対応する要素がハイライトされます。
Ethereum等の他の行も
同様のクラス名になっているのが
確認できました。
よって、各トークンの値段を指し示すclass名は、
「sc-cadad039-0.clgqXO」
であることがわかりました。
XPathと同様、クラス名をコピーします。
HTML要素の上で
「右クリック > Copy > Copy Element」を押し、
VScodeの適当な場所にCtrl + Vでペーストします。
ペーストした行の先頭には # をつけて
コメントアウトします。
# Copy elementの結果
# <div class="sc-cadad039-0 clgqXO"><a href="/ja/currencies/bitcoin/markets/" class="cmc-link"><span>¥3,947,999.24</span></a></div>
このようにして確認したclass名を、
find_elementsのcontains()の
()の中にペーストします。
以上により、「all_Token_elements」という、
各トークンの値段の要素をもつ
リスト型変数を作成しました。
次に各トークンの価格をテキスト表示します。
# 各トークンの価格をテキスト表示
for Token_element in all_Token_elements:
print(Token_element.text)
Pythonではリストの中身を一つずつ取り出して
処理をするためにはfor文をつかいます。
「Token_element」というループ変数には、
「all_Token_elements」リストの
要素が一つずつ渡されます。
「Token_element」は「selenium」ライブラリの
「WebElement」というオブジェクトであり、
「.text」を指定することで
中身を確認することができます。
この実行結果が以下の様になります。
各トークンの価格を取得出来ています。
他の要素もこのような要領で取得できますので、
ページ内の様々な情報を取得してみてください。
活用して頂けたら嬉しいです
スクレイピングを使えるようになると、
ログ取得等の定期作業を自動化したり、
Webページの情報を整理して取得できたりして
データ分析の幅が広がります。
ぜひ活用して頂けたら嬉しいです。
「やってみたけど動かなかった」
「内容が間違っている」
等でも良いので、
コメントがあればぜひお願いします!