情報収集には、「スクレイピング」を使うと楽ですが、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起動からログインまでのプロセスを解説します。
- chromedriverを起動する
- ログインページに移動する
- input要素にログインID、パスワードを記載する
- ボタンをクリックする
- ログインできたことを確認(実際は、ログイン後の処理としてデータ収集)
- 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にて別ページ扱いになっている。
処理の流れとしては、以下の通りになります。
- chromedriverを起動する
- ログインページに移動する(このとき、リダイレクトが発生している)
- ログインがajaxで読み込み発生
- 読み込みが終わるまで待つ
- iframeの切り替えをする
- input要素にログインID、パスワードを書き込む
- ログインのためのボタンをクリックする
- ログインできたことを確認(実際は、ログイン後の処理としてデータ収集)
- 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サイトのスクレイピング方法でした。