こんにちは、おぎーです。
今回はPythonでブラウザ操作を自動化しようの3回目ということで、web上の情報を自分の欲しい情報としてゲットしてくる方法の具体例を紹介します。
それでは学習を進めていきましょう。
今回やること
前回までは、楽天のページを開き、リアルタイムランキングのページまで自動で動かしてみました。
具体的には、このページの1位から80位までの商品の名前とそのURLをまとめたものをエクセルファイルに保存します。
今回のコードの活用先
リアルタイムの情報を即座に表にして、自分の研究やビジネスに使用してみたいと思う方がいれば、
今回のコードの学習をきっかけに、自分の欲しい情報のあるサイトに合った形に落とし込めば、さぞ生産性が高まるでしょう。
上記に当てはまらない方でも、Pythonを使用したプログラミングのパワーを感じていただけるのではないかと考えております。
今回のコード
今回紹介するコードはこちらになります。
自分のchromedriverの入ったファイルパスをダブルクォーテーションで囲んで一度出力してみてください。
1位から80位までの商品名とURLをまとめたファイルがでてくると思います。
#必要なライブラリのインポート
from selenium import webdriver
import time
import pandas as pd
import numpy as np
#ファイルパスの指定
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")
#リスト作成(商品名)
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_table = pd.DataFrame(ranking_list, index=None, columns = ["商品名"])
ranking_table.index = np.arange(1, len(ranking_table)+1)
#商品の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の列を追加
ranking_table["URL"] = np.array(ranking_url)
#作成した表をエクセルファイルへ保存
ranking_table.to_excel("rakuten_realtimeranking.xlsx",encoding="shift-jis")
print("save_success")
みでっとの直近の記事と比較したら短くかわいいコードですが、
これまで紹介してきたコードの中では長い部類かもしれません。
次回詳細なコードの解説を行っていきたいと思っております。
しくじりの足跡
今回のコードを作成するのにあたって、もっと早く知っておいた方がよかったと思う考え方やポイントを解説していこうと思います。
原因不明のエラーが出てしまい、
ぐっと考え込んでしまうよりは、
先人が同じようなミスをしてその解決策をブログに落とし込んでいれば、
その解決策を参考にするのが便利です。
今回の記事で述べることもぜひ参考にしてみてください。
リアルタイム性のあるサイトからの情報収集は注意
今回おぎーは、リアルタイムで更新されるページから情報収集することを試みました。
これまで用語として触れていませんでしたが、web上から情報収集することをwebスクレイピングといいます。今後はスクレイピングという用語を使用して説明していきますので、把握しておいてもらえると嬉しいです。
スクレイピングを行うにあたって、使用されるライブラリは主にBeautifulSoup、Requests、pandas、seleniumなどが主流です。
実は今回の記事で紹介しているコードは、最初BeautifulSoupとRequestsを使用してコーディングしようと思っていました。
しかし、何度やってもうまくいかないので困っていました。
そこで、代表のみでっとという神様に相談したところ、seleniumでやってみようと言われ、ほぼコーディングの核となる部分の指導をしてもらいました(感謝)。
その甲斐あって、今回のコーディングが完成したわけです。
seleniumで情報を獲得すると、おそらくリアルタイムなHTMLの情報が獲得できるため、問題なく出力できるのだと思います。
BeautifulSoupとRequestsでの情報取得では、HTMLの情報とリアルタイムで変化する情報の間にラグが生じるのではないかと考えられます。
みなさんがリアルタイムで刻々と変化する情報を取得する際は、
ぜひseleniumを使用してスクレイピングしてください。
HTMLの構造を見抜く力の必要性
プログラミングに精通している人は、
あれ、80位までのスクレイピングなのに、forループで82まで数値の範囲を指定しているってどういうこと?
となるかもしれません。
今回の楽天のリアルタイムランキングのサイトでは、
1位から80位全ての情報を順番に取得していくようにしたら、
20位までの情報取得でストップしてしまいました。
おかしいなと思い、20位と21位の間のHTMLの構造(XPath)を確認したところ、やはり異なっていました。
1位から80位にかけて、XPathの内容は該当するランキングの数字のみが1ずつ増加していくのだろうと思っていましたが、21位のところはXPathの数字が22になっていたのです。
ここに気が付くか気が付かないかはコーディングをする上で大変重要じゃないかと思っております。
予想と異なるエラーが生じたときにどのように修正するのかがプログラミングの力量と比例するのではないかと思いました。
ここに気が付かなければ泥沼にはまり、時間を浪費してしまいます。
おぎーはみなさんにそんな時間の使い方をしてほしくないです。
詳しい解説は次回します。
今回使用したコードはGitHubの方へアップロードしておきますので、
ご自由にお使いください。
GitHubの使用法が分からなければ以下の記事を参考にしてください。
それではまた次回会いましょう。
おぎー