Selenium Webスクレイピング - 2024年に知っておくべきすべて

データ収集という言葉は、この10年で多用されるようになった。どの企業も、顧客の問題を解決するために最適な戦略を開発できるよう、顧客のことを十分に知りたいと考えている。通常、テクノロジーを基盤とする組織は、分析のためのデータを得るためにデータレイクを持っている。しかし、時にはデータをオンラインで収集しなければならないこともある。

データ収集という言葉は、この10年で多用されるようになった。どの企業も、顧客の問題を解決するために最適な戦略を開発できるよう、顧客のことを十分に知りたいと考えている。通常、テクノロジーを基盤とする組織は、分析のためのデータを得るためにデータレイクを持っている。しかし、センチメント分析、SEO分析、モニタリングなど、様々な分析のためにオンラインでデータを収集しなければならないこともある。Webスクレイピングは、対象となるソースからデータを抽出し、ローカルまたはクラウドストレージに保存するアプローチである。Pythonは、Webスクレイピングを実行するのに最適なプログラミング言語です。Pythonには、ウェブサイト、ブログ、その他のオンラインソースからデータをスクレイピングするのに役立つライブラリがたくさんある。最も有名なものはBeautifulSoupとSeleniumだ。この記事では、SeleniumによるWebスクレイピングの方法を紹介する。

ウェブスクレイピングとは何か?

ウェブスクレイピングとは、オンラインの様々なウェブページから大量のデータを抽出することである。現在、機械学習やAIの初心者は、ウェブスクレイピングの様々な方法を学ぶために多くの時間を投資している。ウェブスクレイピングは、クローラーとスクレーパーという2つの部分から構成されている。クローラーは、ターゲットとなるソースから必要なデータを見つけ、位置を特定する役割を担い、次にスクレーパーがソースからそのデータを抽出する手助けをする。

セレンとは何か?

SeleniumはフリーでオープンソースのPythonライブラリであり、主に様々なブラウザでウェブアプリケーションのテストと検証に使用される自動テストフレームワークである。C#、Java、そして私のお気に入りのPythonなど、どんなプログラミング言語でも使うことができます。Seleniumソフトウェアは、以下のツールで構成されています:

  • Selenium統合開発環境(IDE)。
  • セレニウム・リモコン。
  • ウェブドライバー
  • セレニウム・グリッド

Webスクレイピングプロセス全体を自動化するために、PythonとSeleniumを使用する方法を見てみましょう。

問題提起:

過去10年間のNBA選手の名前と年俸をスクレイピングし、そのデータをデータフレーム形式で保存することを目的としています。注:Seleniumウェブスクレイピングがどのように機能するかを学び、説明するために、hoopshypeのウェブサイトを使用します。

クロームドライバーのインストール

ウェブスクレイピングを開始する前に、お使いのコンピューターにChromeドライバーをインストールする必要があります。どのChromeドライバをインストールするかは、お使いのChromeブラウザのバージョンによって異なります。以下の手順で確認できます:

STEP 1: Chromeブラウザを開く-> ブラウザの右上にある「ハンバーガー」アイコンをクリックする。

ステップ2:「ハンバーガー」アイコンをクリックすると、「ヘルプ」というオプションが表示されます。ヘルプ "をクリックし、"クロームブラウザについて "を選択します。すると、バージョンページが表示されます。下の画像はGoogle Chromeのバージョンページです。

グーグルクロームバージョンウィンドウ

注意:アップデートがある場合は、クロームドライバーをインストールする前にアップデートをインストールすることをお勧めします。

バージョンがわかったら、 クロームドライバーのウェブサイトにアクセスし、お持ちのクロームのバージョンに応じたドライバーをダウンロードしてください。

Seleniumをインストールします:

seleniumパッケージをインストールする最も簡単な方法は、PIP(Package Installer Python)を使うことです。JuypterやGoogle Collabなどのノートブックを開き、以下のpythonコードを入力します:

pipinstallselenium

上記のコマンドは、Seleniumの依存パッケージをすべてダウンロードする。それでは、Seleniumを使ってWebスクレイピングを実装する方法を見てみましょう。

Seleniumでウェブスクレイピング:

より良い練習のために、仮想環境を作ってウェブ・スクレイピング・プロセスを実施することをお勧めします。この例では、Juypterノートブックを使ってWebスクレイピングを行ってみましょう。

ステップ1:必要なライブラリをすべてインポートする。PandasとSelenium webdriverは、単純なウェブスクレイピングのための主要なライブラリです。必要なライブラリをインポートするためのpythonコードを以下に示します:

fromseleniumimportwebdriver
fromselenium.webdriver.common.keysimportkeys
pdとしてpandasをインポートする

ステップ2:ライブラリをインポートしたら、次はChromeドライバを起動します。ドライバを起動するためのPythonコードを以下に示します。

driver = webdriver.Chrome(r"˶Selenium Apachechromedriver.exe")

注:引数には、ローカルシステム上のChromeドライバの場所をフルパスで指定してください。

ステップ3:ドライバを起動すると、Chromeブラウザが新しいウィンドウで開くはずです。しかし、フィードURLがないので、ウィンドウは空でなければなりません。対象となるフィードURLのpythonコードを以下に示します:

seed_url ='https://hoopshype.com/salaries/players/'
ドライバー.get(seed_url)

STEP 4: フィードのURLを入力すると、新しいウィンドウにターゲットのウェブサイトが表示されます。次のプロセスは、すべてのNBA選手の名前を見つけることである。Seleniumでは、以下の方法でHTML要素を見つけることができます:

  • 身分証明書
  • CSSセレクタ
  • XPATHセレクタ
  • 名称
  • クラス名
  • タグ名

この例では、XPATHセレクタを使って要素を検出する方法を見てみよう。このデータから2つの詳細を抽出したい:

  • 選手名
  • 給与

注:検索フォームを使用してウェブ要素を検索することも可能です。検索フォームはInspectページの下部にあります。

STEP 5: ターゲットページに移動すると、シーズン(年)の選手と年俸のリストが表示されます。選手名のいずれかを選択し、右クリックします。いくつかのオプションが表示されます。これらのオプションの中から、"Inspect "をクリックします。下の画像はInspectページを表しています。

ターゲットSIteのページを見る

さて、前述の通り、目的は選手名を抽出することである。そのため、まずは単選手要素と全選手要素に共通する要素を探します。そこで、同じ手順で選手名を右クリックし、検査します。これで直接要素の場所に移動できるはずです。今回のシナリオでは、一人の選手の名前を取り上げるのではなく、すべての選手の名前を取り上げています。すべての選手に共通する要素は、"td class-'name'"です。つまり、この要素を使ってループさせれば、全選手の名前を得ることができます。選手の名前を抽出するpythonコードを以下に示す:

nba_players = driver.find_elements_by_xpath('//td[@class="name"]')
players_list =[].
for p in range(len(nba_players)):
    players_list.append(nba_players[p].text)
プリント(players_list)

説明上述したように、XPATHアプローチを使ってHTMLコード要素を検索しています。明らかに、複数の要素のXPATHパスが必要です。最も簡単な方法は、"td class-name "であるname要素を見つけることです。その要素を右クリックし、"コピー "を選択する。JSパスのコピーやXPATHのコピーなど、多くのオプションが表示されるはずだ。コピーXPATHを選択すると、要素のXPATHロケーションが自動的に取得されます。そのパスを find_elements_by_XPATH 引数に貼り付けます。パスを貼り付けると、Pythonはこれらの要素を識別し、実際の名前ではなくアドレスを取得し始めるはずです。選手の実際の名前を取得するために、関数をループし、結果を出力として空のリストに追加します。上記のコードスニペットを実行すると、下の画像のような出力が得られるはずです。

選手名抽出の出力

選手の名前がわかったところで、次のステップはそれぞれの年俸を知ることだ。名前を抽出する正確なプロセスは、給与の詳細を取得するために実行されます。

ステップ6:給与データは、以下のようにパイソンコードを使用して抽出されます:

players_salary=driver.find_elements_by_xpath('//td[@class="hh-salaries-sorted"]')
salary_list=[]
forsin range(len(players_salary)):
    salary_list.append(players_salary[s].text)
プリント(サラリーリスト)

説明する:プロセスは同じ。唯一の違いは選手間の共通要素です。ウェブ要素「td class-'hh-salaries-sorted'」が共通要素です。要素を見つけた後、関数全体をループするために空のリストを作成し、空のリストに給与の詳細を追加します。出力は以下の画像のようになるはずです:

選手の年俸を抽出するための出力

ステップ7:さて、ターゲットからデータをスクレイピングした。しかし、よく見ると、データは1シーズン分(今年)しかありません。問題文には、過去10年間のデータを抽出するようにと書かれている。ここでブラウザの自動化が登場する。心配する必要はない。ループ関数と同じコードをシーズンにも使えます。スクレイピングプロセスを自動化し、過去10年間のデータを取得するためのpythonコードを以下に示します:

for i in range(2010,2021):
    page_number =str(i) +'-'+str(i+1) +'/'
    feed_url ='https://hoopshype.com/salaries/players/'+ page_number
    ドライバー.get(feed_url)
    
    players = driver.find_elements_by_xpath('//td[@class="name"]')
    salaries = driver.find_elements_by_xpath('//td[@class="hh-salaries-sorted"]') 
    
    プレーヤー =[].
   forjin range(len(players)):
        player.append(players[j].text)
    
    salary =[](サラリー)
   forkin range(len(salaries)):
        salary.append(salaries[k].text)

説明前述したように、私たちは過去10年間のデータを取得することを目的としています。そのためにはページネーションを実装しなければならない。ページネーションとは、ページの順序を識別するために、連続した番号(通常はページ番号)を追加する処理である。季節はYYYY/MM形式で表されます。それを認識するために、連結のテクニックを使っています。その後、ループ内で同じ処理と同じコードを使用します。

ステップ8:最後のステップは、センチメント分析や競合分析など、様々な分析のためにデータをデータフレームに保存することです。データフレームにデータを保存するためのpythonコードは以下の通りです:

df = pd.DataFrame(columns=['Player','Salary','Year'])
data =list(zip(player[1:],salary[1:])) 
df1 = pd.DataFrame(data,columns=['Player','Salary']) 
df1['Year']=i
df = df.append(df1)

注:コードの2行目で、スライスを行ったことがわかる。その理由は、選手名と年俸の両方の出力を見ると、最初のインデックス、つまりインデックス0は、"PLAYER "と "DATE "だった。これらの項目は表にあまり重要性をもたらしません。そこで、これらの項目を削除することができます。

説明Player"、"Salary"、"Year "を列として空のフレームを作成しました。Zip関数ですべてのデータを1つのリストに蓄積し、データフレームにリストを追加します。データがデータ・フレームに追加されたら、自動化を終了してドライバを閉じます。必要であれば、データフレームをCSVファイルに保存してデータリポジトリに置くことができます。

以上です!SeleniumとPythonを使って自動化とWebスクレイピングに成功しました。

よくある質問

1.SeleniumはWebスクレイピングに適していますか?
そう、JavaScriptを使った動的なウェブページをスクレイピングしようとしているのなら。しかし、Pythonにとっても良い選択肢だ。SeleniumはWebスクレイピングに興味がある初心者にとって良い出発点です。
2.BeautifulSoupとSeleniumはどちらが良いですか?
この答えは、対象となるウェブページの種類とプロジェクトの規模に基づいている。小さくてよく構造化された静的ページをスクレイピングしたいのであれば、BeautifulSoupの方がよいでしょう。あなたのプロジェクトが複雑な構造の動的なWebページを含む場合、selenium Webスクレイピングが最良の選択肢かもしれません。
3.ウェブスクレイピングに最適なツールは?
Pythonはウェブスクレイピングを行うのに最も適したツールである。BeautifulSoup、Selenium、RequestなどのPythonライブラリや、Scrapyなどの他のツールは、ウェブスクレイピングに最適なツールです。

結論

この記事では、小規模なウェブスクレイピング処理を自動化するために、Chromeドライバをローカルシステムにインストールする方法を紹介する。リアルタイムで大量のデータ(MB、GB、時にはTBといったサイズ)を扱うには、複雑な手順が必要になる。Seleniumは、データ収集、スクリーンスクレイピングプロセス、データサイエンス全般に興味のある初心者にとって良いスタートとなる。前述のように、複雑なウェブスクレイピングプロセスは、データを収集するために多くの時間を必要とする。ほとんどのウェブサイトは、長時間のウェブスクレイピングを許可していません。その閾値に達すると、ウェブサイトはおそらくあなたのIPアドレスをブロックし、ウェブスクレイピングプロセスを停止します。このような困難を避けるために、プロキシを使用することをお勧めします。 ProxyScrapeウェブスクレイピングのような需要の高いタスクに最適な優れた住宅用プロキシを提供しています。

免責事項:この記事は厳密に学習目的のみのものです。適切なガイドラインに従わずにウェブスクレイピングを行うことは違法となる可能性があります。この記事は、いかなる形であれ、違法なウェブ・スクレイピングを支持するものではありません。