初級スクレイピングの基本、大人気seleniumさん。
一般的なことならほとんどできそうです。
requestsとseleniumの違い
requestsにしてもseleniumにしても、「狙ったhtmlを取ってきてほしい情報を自動で集める」という意味合いなら、変わりません。
requestsは静的なサイトから取得することができる
seleniumは動的なサイトからも取得することができる
ブラウザー側でjavaとかを動かした後に表示される内容を得たい場合は、seleniumが基本になります。
そしてseleniumは
・どこかのフォームにインプットする
・どこかをクリックする
といった、フォームへのアクションを行えることが特徴です。
改めてやってみればそんなに難しい内容ではないので是非チャレンジしてみると良いことがありそうです。
使うための準備
1.seleniumのインストール
普通にコマンドラインから
pip install selenium
jupyterlabo上で認識していない・動かない場合等、こちらのページで対処法を記しました。
ModuleNotFoundError: No module named ‘selenium’に困ったときの対処方法
2.ブラウザーエンジンの準備
ChromeDriver等、ブラウザーに合ったドライバーを準備します。
同じくこちらの投稿にサラッと書いていますが。
ModuleNotFoundError: No module named ‘selenium’に困ったときの対処方法
driver = webdriver.Chrome("C:\mydrive\chromedriver.exe")
どこかに保存して、pythonプログラム上から.exeまで指定してあげれば認識します。
基本の考え方と注意事項
相手のサーバーに負荷をかけてはいけません。time.sleep(3)等を入れて、連続で送りすぎないようにしましょう。
自分のPC内だけではなくて、java等を動かして反応した結果を取得することが多いので、「レスポンスを待つ」必要があると考えることが大切です。
早すぎると空のデータだけが返ってくることもあります。
主な要素の指定方法
主にこちらにある
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
のいずれかを使うことになります。
要素の探し方
requestsと同じく、スクレイピングしたいサイトで、F12を押しましょう
shift+ctrl+cを押して、サイト上で欲しい要素にマウスを合わせます。
その要素がIDで指定できるか、nameか、class_nameか・・と、ソースとにらめっこして、色々と試してみます。
使用例(自動ログイン)
driver.get('ログインページ')
time.sleep(3)
# ID/PASSを入力
id = driver.find_element_by_name("identification")
id.send_keys("入力するID")
password = driver.find_element_by_name("password")
password.send_keys("入力するパスワード")
time.sleep(3)
# ログインボタンをクリック
login_button = driver.find_element_by_class_name("ログインでクリックする要素")
login_button.click()
使いたいサイトに応じて、element_by_nameのnameをidにしたりclass_nameにしたりxpathにしたりと試してみてください。
上記は私が個人的に使った某ネット卸さんのログイン画面の要素でした。
使用例(スクレイピング)
ここはもう様々なやり方がありますので調べて頂くとして、requestsから一歩進んだ方への一番簡単な方法を提示
driver.get(loadurl)
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, '得られるのを待つ要素')))
time.sleep(2)
response = driver.page_source
loadurlは、読みたい先です。
サーバーからの返答を待って、得られた内容をresponseに入れています。
elementは多分trueとかから何か分岐とか処理するときに使うみたいです。
この後はrequestからbs4で抽出している場合と変わりません。
コメント