seleniumで簡単なwebスクレイピング
イントロダクション
APIが提供されていないサービスはたくさんあり、それらのデータを利用したいときにスクレイピングが使われます。
本記事では、Pythonでスクレイピングするときに活躍するseleniumの紹介をします。
目次
概要
wikipediaによると、
ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。
つまり、webページに入り、データを収集する技術です。
注意事項
スクレイピングを行う際は、著作権やサイトの規約、robots.txt等の制限には注意しないといけません。
これらが守られないと、相手のサーバーに大きな負荷がかかり、非常に迷惑がかかります。
(犯罪となることも...)
関連する記事のリンクを以下に貼っておきます。
Webスクレイピングする際のルールとPythonによる規約の読み込み
Webスクレイピングの注意事項一覧
岡崎市立中央図書館事件
なお、プログラムの実行は自己責任でお願いします。
Selenium
SeleniumはウェブアプリのUIテスト自動化などに使用されているものです。
( 例 : WebのUIテスト自動化 - Seleniumを使ってみる )
Seleniumを選んだ理由は、実際にウェブページを開きながら動作するため、わかりやすいと感じたからです。
インストール
pip install selenium
動作確認
Chromeを開いてページを表示させた後、2秒待機しブラウザを閉じるプログラム
import time from selenium import webdriver driver = webdriver.Chrome() # ブラウザを起動 get_url = 'https://snova301.hatenablog.com/' driver.get(get_url) # webページを開く time.sleep(2) driver.close() # webページを閉じる driver.quit() # ブラウザを閉じる
簡単なチートシート
こちらのサイトを参考しました。
値を取得
HTMLの属性によって、コマンドが違います。
属性 | コマンド |
---|---|
id | driver.find_element_by_id('ID') |
class | driver.find_element_by_class_name('CLASS_NAME') |
name | driver.find_element_by_name('NAME') |
リンクのテキスト(hrefなど) | driver.find_elements_by_link_text('LINK_TEXT') |
path を指定 | driver.find_elements_by_xpath(".//a") |
- リンクテキストの一部を検索したいなら、
driver.find_element_by_partial_link_text('LINK_TEXT')
- 検索結果が複数必要な場合は、
element
をelements
にする。
ex. )driver.find_elements_by_name('ID')
アクション
アクション名 | コマンド |
---|---|
ボタンをクリック | driver.find_element_by_id('BTN').click() |
フォームに'text'と入力 | driver.find_element_by_name('FORM').send_keys('text') |
ID : 'BTN'内で'class'の要素を探す | driver.find_element_by_id('BTN').get_attribute('class') |
selenium.webdriver.common.keys
ライブラリ
例えばshiftキーを押しながらの入力や検索フォームの文字を一文字削除するときなどに使用する。
【Python】send_keys・・・キーボード入力をする(特殊キー)
アクション名 | コマンド |
---|---|
ALTキー(通常キーと組み合わせ、例はalt + f ) |
element.send_keys(Keys.ALT, 'f') |
Ctrlキー(通常キーと組み合わせ、例はctrl + a ) |
element.send_keys(Keys.CONTROL,'a') |
シフトキー(通常キーと組み合わせ、例はshift + abc ) |
element.send_keys(Keys.SHIFT,'abc')) |
COMMANDキー(mac) | element.send_keys(Keys.COMMAND) |
スペースキー | element.send_keys(Keys.SPACE) |
Enterキー | element.send_keys(Keys.ENTER) |
リターンキー | element.send_keys(Keys.RETURN) |
タブキー | element.send_keys(Keys.TAB) |
Deleteキー | element.send_keys(Keys.DELETE) |
HOMEキー | element.send_keys(Keys.HOME) |
ENDキー | element.send_keys(Keys.END) |
ESCAPEキー | element.send_keys(Keys.ESCAPE) |
イコール(=)入力 | element.send_keys(Keys.EQUALS) |
F1キー | element.send_keys(Keys.F1) |
←キー | element.send_keys(Keys.LEFT) |
↑キー | element.send_keys(Keys.UP) |
ページダウンキー | element.send_keys(Keys.PAGE_DOWN) |
ページアップキー | element.send_keys(Keys.PAGE_UP) |
簡単なテスト
内容は以下の通り
はてなの公式サイトに入る
→検索フォームに"snova301"と入力し、検索
→一番上の結果をクリックし、webページを開く
HTMLの要素はソースコードを見ながら、記録しています。
(Chromeを使っているなら、F12キーでデベロッパーツールを表示できます)
また、time.sleep()
を使って、負荷を減らすようにしています。
# -*- coding: utf-8 -*- # import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains search_url = 'http://www.hatena.ne.jp/' sleep_time = 1 # 1 sec class SearchClass: def __init__(self): self.driver = webdriver.Chrome() # ドライバーの呼び出し def search_func(self, find_elem, search_word): find_elem.send_keys(search_word) # 検索ワードの入力 find_elem.send_keys(Keys.RETURN) # returnキーを押す time.sleep(sleep_time) def click_func(self, find_elem): find_elem.click() # クリック def main(self): self.driver.get(search_url) # webページの読み込み time.sleep(sleep_time) search_word = 'snova301' # 検索する単語 find_qname = self.driver.find_element_by_name('q') # self.search_func(find_qname, search_word) find_class = self.driver.find_elements_by_class_name('gs-title') self.click_func(find_class[1]) time.sleep(sleep_time) self.driver.close() self.driver.quit() if __name__ == '__main__': SearchClass().main()
まとめ
seleniumを使うことで簡単にスクレイピングが実践できます。
スクレイピングするときはルールを守って、利用してください。