「SeleniumでWebスクレイピングがしたい。」
「WebスクレイピングはSeleniumとBeautiful Soupのどちらを使えばいいの?」
上記の疑問にお答えします。
手作業で行っているデータ収集や分析は、Webスクレイピングという技術を使えば、効率よくできるようになります。
PythonでWebスクレイピングを行うツールとして、SeleniumとBeautiful Soupなどがありますが、それぞれ特徴が異なります。
本記事では、PythonとSeleniumを使ったWebスクレイピングの基本的な流れやコード例を紹介しつつ、SeleniumとBeautifulsouの違いについても解説します。
具体的に次のことを解説します。
- Seleniumとは
- SeleniumとBeautifulsouの違い【Seleniumの使いどころ】
- Seleniumのインストール&環境構築
- SeleniumによるWebスクレイピングの基本
「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し紹介させてください。
たいらーのプロフィール
- 文系四大出身。ソフトウェア開発の経験はなしですが、IT業界に身を置いています。
- 開発者やユーザーとのパイプ役など、業務にプログラミングスキルを活かす。
- Pythonは独学で習得。スクレイピングや作業の自動化などに勤しんでいます。
この記事は、PythonでWebスクレイピングを始めたい方や、ツールの選択に悩む方にとって有益な情報を提供できることを目指します。
プログラミング未経験の方にも分かりやすくお伝えできるよう心掛けたので、この記事を参考にWebスクレイピングに挑戦してみてください。
1.Seleniumとは
Seleniumは、Webアプリケーションを自動化するためのオープンソースのツールです。
Webブラウザを制御するためにWebDriverと呼ばれるAPIを使用し、Webブラウザを直接制御します。
WebDriverは、Webブラウザを開いたり、Webページをロードしたり、要素を検索したり、要素に対してアクションを実行したりすることができます。
要素とは、例えば次のようなWebページの構成物です。
Webページの構成物 | 説明 |
---|---|
ページ要素 | ページ要素は、Webページ上の各要素を表します。例えば、HTMLページのテキスト、画像、リンク、ボタン、テキストフィールド、チェックボックス、ラジオボタンなどがあります。 |
フレーム | Webページ内にフレームが含まれている場合、Seleniumはそれらのフレームを識別できます。これにより、フレーム内の要素にアクセスすることができます。 |
ウィンドウ | ウィンドウは、Webページ内の別のブラウザウィンドウを表します。Seleniumは、現在のウィンドウから別のウィンドウに切り替えたり、新しいウィンドウを開いたりすることができます。 |
アラート | アラートは、Webページ上の警告メッセージを表します。Seleniumは、アラートを取得したり、アラート内のテキストを取得したり、アラートを閉じたりすることができます。 |
Cookie | Cookieは、Webブラウザに保存される小さなデータファイルであり、Webアプリケーションによって使用されます。Seleniumは、Cookieを設定したり、Cookieを取得したりすることができます。 |
Seleniumを使って、これらの要素を操作することにより、Webアプリケーションの動作やUIの振る舞いを自動化することができます。
2.SeleniumとBeautiful Soupの違い【Seleniumの使いどころ】
Webスクレイピングの方法はいくつかありますが、SeleniumとBeautiful Soupは共によく使われるツールです。
以下では、SeleniumとBeautiful Soupの違い、Seleniumの使いどころについて解説します。
・Beautiful Soup
Beautiful Soupは、HTMLやXMLなどのマークアップ言語から情報を抽出するためのライブラリです。
特に、静的なWebページから情報を取得する際に有効であり、HTMLの構造を解析して、要素や属性にアクセスすることができます。
Beautiful Soupは、HTMLを解析することに特化しているため、HTMLの解析に関する多くの機能を提供しています。
また、スクレイピングに必要な情報を取得することにフォーカスしているため、高速かつ軽量であり、基本的なスクレイピングには十分な機能を提供しています。
・Selenium
Seleniumは、先ほど述べたとおり、Webブラウザを自動化するためのツールです。
JavaScriptを含む動的なWebページから情報を取得することができます。
Seleniumは、JavaScriptが実行された後のWebページの状態をスクレイピングすることができます。
このため、動的なWebページから情報を取得する際に有効であり、JavaScriptによって生成された情報をスクレイピングすることができます。
Seleniumは、Webブラウザを自動化するための機能を提供しているため、スクレイピングの制御が柔軟であり、複雑な操作も可能です。
・Seleniumの使いどころ
Seleniumの主な使いどころは、次のような場合です。
・動的なWebページのスクレイピング
静的なWebページはHTMLが生成された時点で情報が決まりますが、動的なWebページはJavaScriptによって情報が生成されるため、スクレイピングが難しくなります。
Seleniumを使えば、JavaScriptによって生成された情報をスクレイピングすることができます。
・ログインが必要なWebページのスクレイピング
Webページにログインしないとスクレイピングができない場合、Seleniumを使って自動ログインすることができます。
・ページ遷移が必要なWebページのスクレイピング
複数のページに分かれているWebページをスクレイピングする場合、ページ遷移が必要です。
Seleniumを使えば、Webブラウザを操作してページ遷移することができ、スクレイピングするページを自動で切り替えることができます。
・ボタンクリックやフォーム入力が必要なWebページのスクレイピング
ボタンクリックやフォーム入力が必要なWebページをスクレイピングする場合、Seleniumを使ってこれらの操作を自動化することができます。
例えば、特定のボタンをクリックすると、その下に新しい情報が表示されるWebページをスクレイピングする場合、Seleniumを使ってボタンクリックを自動化することができます。
以上のように、Seleniumは、JavaScriptによって生成された動的なWebページをスクレイピングすることができるため、静的なWebページだけでなく、様々なWebページのスクレイピングに使われます。
しかし、Seleniumはブラウザを自動化するための機能を提供しているため、Beautiful Soupに比べて重たく、スクレイピングの速度が遅くなる場合があります。
また、Webページのロード時間やJavaScriptの処理時間によって、スクレイピングに失敗することがあるため、そのような場合はBeautiful Soupのような静的なWebページをスクレイピングするためのツールを使うことが望ましいです。
Selenium とBeautiful Soupの違いを把握しつつ、Webスクレイピングする対象のサイト構造を理解したうえで適切なライブラリを選ぶようにしましょう。
個人的には、メインはBeautiful Soupを使いつつ、動的なページはSeleniumのお世話になるといった使い分けをしています。
改めて違いをまとめておくと次のようになります。
Beautiful Soupの特徴
- 静的なWebページをスクレイピングすることができる。
- ページのHTML構造を解析して、データを抽出することができる。
- JavaScriptによって動的に生成されるコンテンツを取得することができない。
- スクレイピング速度が速く、軽量である。
Seleniumの特徴
- 動的なWebページをスクレイピングすることができる。
- ブラウザを自動化することができるため、JavaScriptによって動的に生成されるコンテンツを取得することができる。
- ボタンクリックやフォーム入力が必要なWebページのスクレイピングを自動化することができる。
- スクレイピング速度が遅く、重い。
3.Seleniumのインストール&環境構築
座学はここまでにして、実際にSeleniumを使ってWebスクレイピングをしてみましょう。
PythonでSeleniumを利用する場合、いくつかステップを踏む必要があります。
Pythonはインストール済みであることを前提に説明しますので、Pythonの準備がまだの方は、『Python3のインストール方法【導入は10分で完了!】』を参考に準備しましょう。
・Seleniumのインストール
Seleniumをインストールします。
Seleniumには、Selenium3、Selenium4といったバージョンがあり、バージョンの違いにより、コードの書き方が一部異なります。
Selenium3は、今も現役で使われていますが、Selenium4で機能やパフォーマンスが向上したということで、後学のためにも今回は最新のSelenium4を使用します。
インストールするには、コマンドプロンプト等で次のコマンドを入力してください。
pip install selenium
インストールが完了したら、念のためにインストール状況を確認しましょう。
次のコマンドを入力したら、「Selenium」を探してみてください。
pip list
Seleniumとともに、「4.x.x」のようにバージョンが表示されればインストールは成功です。
・WebDriverの準備
Seleniumでは、ブラウザを直接制御するためにWebDriverが必要です。
WebDriverの準備の流れは次のようになります。
- 現在使用中と同じバージョンのWebDriverをダウンロードする
- WebDriverを適切な場所に置く
1. 現在使用中と同じバージョンのWebDriverをダウンロードする
まず、Seleniumで操作予定のブラウザのバージョンを確認しましょう。
同じバージョンのWebDriverを以下のサイトからダウンロードしてください。
2. WebDriverを適切な場所に置く
WebDriverがダウンロードできたら解凍してください。
解凍したフォルダ一式は、適切な場所に置きましょう。
この時、できるだけ分かりやすい場所に置いておくとWebDriverの読み込みのときに便利です。
例えば、「C:¥WebDriver\chrome」など
・Pythonのコード上で読み込む
SeleniumとWebDriverの準備ができたら、Pythonのコード上で読み込みます。
まず、Seleniumをインポートしwebdriverを次のコマンドで読み込みます。
from selenium import webdriver
次に先ほど配置したWebDriverのディレクトリを指定し、ブラウザのWebDriverを読み込みます。
例としてChromeのWebDriverを「C:¥WebDriver\chrome」に配置したときの記述は、次の通りです。
driver = webdriver.Chrome('C:¥WebDriver\chrome\chromedriver.exe') #driver = webdriver.Chrome('WebDriverの実行ファイルのパス')
以上で環境構築は終了です。
4.SeleniumによるWebスクレイピングの基本
Seleniumを使う準備ができたので、練習として、本サイトの出馬表サンプルをWebスクレイピングしてみます。
今回やることは、出馬表に記載されている競走馬のURLを取得します。
まずコードの全文はこちらです。
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome('C:\Python\chrome\chromedriver.exe') #出走表サンプルを開く driver.implicitly_wait(10) driver.get('https://umano-ie.com/racesample/') #競走馬のリンクからURLを抽出 house_link = driver.find_element(By.CSS_SELECTOR, '#post-2583 > div > div.scrollable-table.scroll-hint > table > tbody > tr:nth-child(2) > td:nth-child(3) > a') url = house_link.get_attribute("href") time.sleep(3) print(url) #Selenium終了 driver.quit()
次に解説です。
from selenium import webdriver from selenium.webdriver.common.by import By import time
ここではWebDriverやtimeモジュールのの読み込みを行っています。
Timeモジュールの使用するのは、ブラウザの動作よりプログラム処理が早くなるとエラーになるので、待機時間を設定するために使います。
今回は動作が分かりやすいように待機時間を入れています。
「from selenium.webdriver.common.by import By」は要素指定で使用します。
driver.implicitly_wait(10) driver.get('https://umano-ie.com/racesample/')
ここでは出生表サンプルを開いています。
driver.implicitly_wait(10)はページ読み込み時に10秒待機させています。
house_link = driver.find_element(By.CSS_SELECTOR, '#post-2583 > div > div.scrollable-table.scroll-hint > table > tbody > tr:nth-child(2) > td:nth-child(3) > a')
CSSセレクタを指定し要素を取得したものを変数「house_link」に格納しています
url = house_link.get_attribute("href")
変数「house_link」は、‘a’要素を指定しているので、get_attribute()メソッドを使用して、href属性の値を取得しています。
print(‘url’)
コンソールに「https://umano-ie.com/horsedata-sample01/」が表示されていれば、Webスクレイピングは成功です。
driver.quit()
Seleniumを終了します。
5.まとめ
以上、「PythonとSeleniumを使ったWebスクレイピング」について解説しました。
Seleniumは、動的なWebページでも柔軟にWebスクレイピングできる一方で、スクレイピング速度が遅く、Webページの処理速度などの影響で失敗することがあります。
なので、実際にWebスクレイピングする際は、SeleniumとBeautiful Soupをうまく使い分けて実行するのが賢い選択かと思います。
この記事をきっかけにWebスクレイピングに興味を持たれた方は、次の『スクレイピングのやり方&学習方法教えます【プログラミング未経験からできる】』が参考になると思いますので、是非ご覧ください。
ご清聴ありがとうございました。