Pythonでブラウザ操作を自動化しよう③(コード解説)

こんにちは。

おぎーです。

今回は前回の記事で紹介したコードの解説を行っていきますよ。

前回の記事はこちらです。

Pythonでブラウザ操作を自動化しよう③

それでは行きましょう。

コード解説

必要なライブラリのインポート

#必要なライブラリのインポート
from selenium import webdriver
import time
import pandas as pd
import numpy as np

まずは、プログラムを動かすのに必要なライブラリをインポートします。

今回インポートするものは4つです。

それぞれの行の構文をまるごと覚えてしまってください。

numpyってなじみがないかもしれないので説明します。

numpyは、数値の計算をするときに効率的な働きをしてくれるライブラリです。

今回のコードでどのように有効活用されているかは後述します。

ファイルパスの指定およびページにenter

#ファイルパスの指定
chrome = webdriver.Chrome("chromedriverのパス")
#ページにenter
url = "https://ranking.rakuten.co.jp/realtime/?l-id=top_normal_rk_hashist_realtime"
chrome.get(url)
time.sleep(2)
print("done")

ファイルパスの指定

インポートをするコードの次は、

ファイルパスを指定します。

何のファイルパスかというと、chromedriverのファイルパスです。

chromedriverの存在をそもそも知らない方は、

ブラウザ操作を自動化しようの①②を見てください。

chromedriverのパスは、chromedriver.exeまできちんと入力してくださいね。

ページにenter

続いて、自分の表示したいページへアクセスします。

今回は楽天のリアルタイムランキングのページのURLをurlという変数に入れて、

chrome.getでURLのサイトへアクセスしました。

次に、2秒間の時間を設けるわけですが、これは読み込みに時間を要するので入力したコードです。何秒まで短くできるのかはよくわかっていませんから、大体人間がクリックしてから読み込む時間を適当に計算しています。

最後に、ここまでの処理が無事に終わったという記録の目的で、

doneと出力しました。

リストの作成(商品名)

#リストの作成(商品名)
ranking_list = []
for i in range(1,21):
    product_name_1_21 = chrome.find_element_by_xpath("//*[@id='rnkRankingMain']/div["+str(i)+"]/div[3]/div[1]/div/div/div/div[1]/a").text
    ranking_list.append(product_name_1_21)
for i in range(22, 82):
    product_name_22_82 = chrome.find_element_by_xpath("//*[@id='rnkRankingMain']/div["+str(i)+"]/div[3]/div[1]/div/div/div/div[1]/a").text
    ranking_list.append(product_name_22_82)

続いて、商品名のリストを作成します。

リストを作成する理由は、最終的にエクセルファイルにまとめるからです。

商品名を全てranking_listというリストの中へ入れていきましょう。

今回はxpathで商品名の情報を取得するようにしました。

大体ランキング系のxpathには、ランキング順に従ったxpathとなっていることが多いので、その規則性を見つけ出してforループを使います。

大体xpath内の数字の部分がランキングとともに変化しているので、自分でカスタマイズする際はそのあたりを注目してみましょう。

しかし、すべて規則正しく並んでいるかというと決してそうではありません。

コードをご覧になって分かるように、1位から80位までの商品名の情報を取得するのに、1-21、22-82といったようになんで82まで情報を取得するようにしてあるのか疑問に思う方がいると思います。

しかし、実際に出力してみると、ある順位以降が出力されなかったりするので、その際はxpathの不規則性を疑い、実際に該当する箇所のxpathを目視で確認してみましょう。

リストの値から表を作成

#リストの値から表を作成ranking_table = pd.DataFrame(ranking_list, index=None, columns = ["商品名"])
ranking_table.index = np.arange(1, len(ranking_table)+1)

リストの作成が終えたら、次は表にまとめていきましょう。

1行目でほとんど表を完成させています。

しかし、1行目で作成した表のみでは、1位の商品が0となってしまい、各商品が1位ずつずれてしまう現象が起こります。

そこで、2行目の構文を用いて、順位を対応させます。

ここまでで、1位から80位までの商品名を列挙することができました。

Numpyはこのタイミングで用いました。

np.arrangeがどのような役割を果たしてくれるのかを調べてみましょう。

商品のURLのリスト作成

#商品のURLのリスト作成
ranking_url = []

for i in range(1,21):
    get_url_1_21 = chrome.find_element_by_xpath("//*[@id='rnkRankingMain']/div["+str(i)+"]/div[3]/div[1]/div/div/div/div[1]/a").get_attribute("href")
    ranking_url.append(get_url_1_21)
for i in range(22,82):
    get_url_22_82 = chrome.find_element_by_xpath("//*[@id='rnkRankingMain']/div["+str(i)+"]/div[3]/div[1]/div/div/div/div[1]/a").get_attribute("href")
    ranking_url.append(get_url_22_82)

続いて、商品名のリストを作成した要領で、商品のURLのリストを作成します。

さて、商品名を取得したときと、商品のURLを取得したときとで、

何が異なるか理解できるでしょうか。

どちらもxpathから情報を取得しているといった点では共通しています。

ヒントは、.textと.get_attributeの違いにあります。

ぜひご自身で調べながら、その違いを理解してみてください。

URLの列を追加

#URLの列を追加
ranking_table["URL"] = np.array(ranking_url)

続いて、各商品の詳細ページに飛べるように、

URLの列を商品名の右側に追加します。

この構文を覚えれば自由に列を追加することができるので覚えておくと得です。

作成した表をエクセルファイルへ保存

#作成した表をエクセルファイルへ保存
ranking_table.to_excel("rakuten_realtimeranking.xlsx",encoding="shift-jis")
print("save_success")

ここまで作成した表をエクセルファイルに保存しましょう。

構文は至ってシンプルです。

自分の目的に合わせてカスタマイズしてもらえれば良いと思います。

エンコーディングはshift-jisを用いましたが、これは日本語を含む文字列で動作するようにしたいから選びました。

おわりに

今回でseleniumを用いたブラウザ操作の自動化については終わりです。

今回のコーディングには、

様々なコーディングで使用される要素が詰まっていると考えられます。

すなわち、今後も様々な目的でプログラムを実装していくにあたって、

使用する機会が多いのではないかということです。

ぜひみなさんのお役に立てればと思い今回記事を書かせていただきました。

もし分からないことがあれば、問い合わせお待ちしております。

それではまた次回お会いしましょう。

おぎー

 

 

コメントを残す

メールアドレスが公開されることはありません。