snovaのブログ

主にプログラミングやデジタルコンテンツについて書きます。最近はPython, Flutter, VRに興味があります。

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')
  • 検索結果が複数必要な場合は、elementelementsにする。
    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を使うことで簡単にスクレイピングが実践できます。
スクレイピングするときはルールを守って、利用してください。

参考サイト

Google Play and the Google Play logo are trademarks of Google LLC.