pythonのseleniumでjavascript(ajax)、iframeが使われたページのスクレイピング方法

情報収集には、「スクレイピング」を使うと楽ですが、javascript(ajax)、iframeが使われたサイトだとうまく取得できないことが多いです。
今回は、javascriptによる非同期読み込み、iframeが使われたサイトに対応した、「スクレイピング」方法をseleniumを使った例で解説します。

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア

 

概要

スクレイピングを使うと、自動でWEBサイトのデータをダウンロードできるので、情報を取り出すのが楽になります。

しかし、Javascript(ajax)など非同期に読み込まれるサイトではうまくデータが取れないこともあります。

 

seleniumを使うと、Javascript(ajaxによる非同期処理)による後からデータが読み込まれるタイプのサイト、iframe処理が施されたサイトでもスクレイピングが可能になります。

 

今回は、seleniumを使い、javascriptによる非同期読み込み、iframe対策が必要になるサイトのスクレイピング方法を紹介します。

 

前提条件

今回は、以下が終わっていること前提で解説します。

seleniumをダウンロード、インストールしていること

pythonのソースコードが書けること

webdriverはChromeを使用する

chromedriverは、事前にダウンロードしているものとする

 

seleniumを使ったログインの実例

シンプルなログイン

まずは、比較的簡単にログインできるサイトで、webdriver起動からログインまでのプロセスを解説します。

 

  1. chromedriverを起動する
  2. ログインページに移動する
  3. input要素にログインID、パスワードを記載する
  4. ボタンをクリックする
  5. ログインできたことを確認(実際は、ログイン後の処理としてデータ収集)
  6. driverの終了

 

次に実装例を記載します。

 

 

10行ほどのコードで実装できることが確認できるかと思います。

実装は、jupyter notebookを使っていて、

スクレイピングの状況を確認しながら進める(headlessモードをOFFにすること)ことができます。

 

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア

 

本題!javascript,iframeの対応が必要なサイトのログイン

次は、seleniumを使って、javascript,iframeが施されたサイトのログインを試みます。

■大前提

・ログインページは、アクセスしたらajax処理が走り、非同期で読み込まれる。

・非同期のため、完全に読み込まれるのを待つ必要がある。

・ログインページのID、PASSを入力するところには、iframeにて別ページ扱いになっている。

 

処理の流れとしては、以下の通りになります。

 

 

  1. chromedriverを起動する
  2. ログインページに移動する(このとき、リダイレクトが発生している)
  3. ログインがajaxで読み込み発生
  4. 読み込みが終わるまで待つ
  5. iframeの切り替えをする
  6. input要素にログインID、パスワードを書き込む
  7. ログインのためのボタンをクリックする
  8. ログインできたことを確認(実際は、ログイン後の処理としてデータ収集)
  9. driverの終了

 

主に使う関数は以下の通り。

実際に使う例は、このあとのコードを参照してください!

 


#ヘッドレスモードで起動するためオプション設定
webdriver.ChromeOptions()

#webドライバーの起動
webdriver.Chrome

#iframeの切り替え
iframe = driver.find_element_by_css_selector('iframe#aid-auth-widget-iFrame')
driver.switch_to_frame(iframe)

#idを指定してinput要素に任意の文字を入力する
driver.find_element_by_id('account_name_text_field').send_keys

#ボタンをクリックする
driver.find_element_by_id('sign-in').click()

#要素が読み込まれるまで待つ(以下の例では、最大30秒待つ)
wait = WebDriverWait(driver, 30)
element = wait.until(expected_conditions.visibility_of_element_located((By.ID, "password_text_field")))

 

読み込み待ちの注意点

要素の読み込み待ちでは、WebDriverWaitを使います。

待ちならばsleep関数を使う方法もありますが、chromedriverの処理をそのものを止めてしまうようで、読み込み待ちに適さないようです。

 

 

スクレイピングする際の注意点

スクレイピングとは、他者(他社)のサーバーにアクセスしてデータを収集します。

いくつか注意点があるので記載します。

 

あまりにもアクセスが多いとbanされる可能性があること

サーバー管理者はスクレイピングによるアクセスを嫌うものです。

あまりにもアクセスが多いと、banされる可能性があるため注意が必要です。

 

 

負荷対策をすること

データ収集をする際、1秒間に何度もアクセスすると相手のサーバに負荷をかけてしまいます。

適宜、sleepで待ちを作るなどの配慮が必要になります。

 

 

reCAPTCHAには対処できない

reCAPTCHAは、bot対策に作られたものです。

ログインページなどによくある「消化器がある画像を選んでください」のようなものです。

これらは、人間ならばすぐに判断できますが、機械にとっては難しいものです。

 

よって、現時点では、reCAPTCHAを突破するのは難しいと言えます。

 

まとめ

 

以上、javascriptによる非同期読み込み、iframeが施されたWEBサイトのスクレイピング方法でした。

最新情報をチェックしよう!