100日後にエンジニアになるキミ - 75日目 - プログラミング - スクレイピングについて6


昨日までのはこちら

100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて

100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について

100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1

100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて

100日後にエンジニアになるキミ - 53日目 - Git - Gitについて

100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて

100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて

100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1

100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1

100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1

100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1

今回もスクレイピングの続きです。

Seleniumのインストールなどが終わっていたらその続きに入ります。

Seleniumの操作方法

Seleniumを読み込みする

ライブラリを読み込みします。
Google Chromeを動かすことを想定して・・

from selenium import webdriver

# ドライバー設定
chromedriver = "ドライバーのフルパス"
driver = webdriver.Chrome(executable_path=chromedriver)

WEBドライバーの保存先は人それぞれ違うと思うので書き換えてください。
これでGoogle Chromeが立ち上がるハズです。

なおエラーメッセージが出る場合、WEBドライバーとChromeのバージョンなども合わせないとダメです。またWEBドライバーを実行できるように権限設定することも必要場合があるので、エラー内容を見て適宜対処しましょう。

ここまで来たらブラウザを操作できる状態なのでいろいろ操作をしていきます。

一旦ブラウザを開くと、閉じる操作をするまで開きっぱなしになります。
大量に開くとリソースを消費するので、落とすのを忘れないようにしましょう。

またセレニウムを用いる際にヘッダーレスモードで開くこともできます。
ヘッダーレスモードはブラウザを目に見えるように立ち上げることをせずに裏側で動かすような仕組みです。

リソースの消費を防ぎ、LinuxサーバーなどでもSeleniumを使えるようになるので非常に便利なモードです。

書き方はブラウザのオプション設定を追加する変数を作って
ヘッダーレス設定を追加しWEBドライバーの呼び出しメソッドの引数に追加します。

オプション変数 = webdriver.ChromeOptions()
オプション変数.add_argument('--headless')
ドライバー変数 = webdriver.Chrome(options=オプション変数)

from selenium import webdriver

# ドライバー設定
chromedriver = "ドライバーのフルパス"

# オプション設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
# ドライバーの呼び出し
driver = webdriver.Chrome(executable_path=chromedriver,
options=options)

SeleniumでWEBサイトにアクセスする

seleniumを呼び出した際の変数を用いて操作を行っていきます。
先ほどはdriverと言う変数名で呼び出しているのでここからはそれをドライバー変数とします。

WEBサイトにアクセスするには

ドライバー変数.get(URL)

と打ち込んで実行します。

driver.get(URL)

試しに私のHPに行ってみましょう。

driver.get('http://www.otupy.net')

URLを打ち込んで、実行するたびにそのサイトにアクセスすることができます。
WEBサイトが全て表示されるまでは少し時間がかかるので、その後の操作をするのは少し待った方が良いでしょう。

サイト内でスクロールする

Javascriptを実行することによってサイト内でスクロールさせることができます。execute_scriptにてスクリプトを打ち込むことができます。

ドライバー変数.execute_script(Javascript)

Javascript部分としてはスクリプトを文字として打ち込み
window.scrollBy(0, Y)window.scrollTo(0, Y)
でスクロール位置を決めます。

window.scrollBy(0, window.innerHeight);で1ページ分

window.scrollTo(0, document.body.scrollHeight);を指定すると一番下までスクロールさせられます。

スクロールさせてみましょう。

# 少しだけスクロール
driver.execute_script("window.scrollBy(0, window.innerHeight);")

# 一番下までスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

これで、ちょろちょろとブラウザをスクロールさせることができます。

要素を探す

サイトの操作を行うには、どこを操作するのか要素を探す必要があります。
入力蘭などのサイト上の要素を探すことができます。

要素を探す方法は多岐に渡り
ドライバー変数.find_element_by_XXXX
というメソッドで各属性の値で探すことができるようになっています。

要素が見つかった場合はWebElementというデータ型として抽出される形になります。

id属性で検索

ドライバー変数.find_element_by_id(id属性の値)

name属性で検索

ドライバー変数.find_element_by_name(name属性の値)

class名で検索

ドライバー変数.find_element_by_class_name(class名)

tag名

ドライバー変数.find_element_by_tag_name(tag名)

link_textで検索

ドライバー変数.find_element_by_link_text(link_textの値)

CSS_Selector

ドライバー変数.find_element_by_css_selector(css_selectorの値)

xpath

ドライバー変数.find_element_by_xpath(xpathの値)

要素を操作する

要素を操作するには先に要素を見つけておかないといけません。
上記の方法で要素が見つかったら要素変数に代入しておくと下記のような操作が行えます。

要素変数.find_element_by_XXXX()
要素変数.操作メソッド

要素をクリックする

要素変数.click()

要素に文字を入力する

要素変数.send_keys(文字)

要素でキー入力を行う

先にKeysライブラリを読み込みしておきます。


from selenium.webdriver.common.keys import Keys

その後要素を見つけてsend_keysを用いてキー入力を行います。

要素変数.send_keys(Keys.特殊キー)

扱えるキーは以下の通りです。

キー Keys
Enterキー Keys.ENTER
ALTキー(通常キーと組み合わせ) Keys.ALT,"キー"
←キー Keys.LEFT
→キー Keys.RIGHT
↑キー Keys.UP
↓キー Keys.DOWN
Ctrlキー(通常キーと組み合わせ) Keys.CONTROL,"キー"
Deleteキー Keys.DELETE
HOMEキー Keys.HOME
ENDキー Keys.END
ESCAPEキー Keys.ESCAPE
イコール Keys.EQUALS
COMMANDキー Keys.COMMAND
F1キー Keys.F1
シフトキー(通常キーと組み合わせ) Keys.SHIFT,"キー"
ページダウンキー Keys.PAGE_DOWN
ページアップキー Keys.PAGE_UP
スペースキー Keys.SPACE
リターンキー Keys.RETURN
タブキー Keys.TAB

ページのソースコードを抽出する

文字列としてページのソースコードを取得できます。

ドライバー変数.page_source

driver.page_source

取得後はBeautifulSoupなどのライブラリを用いて解析を行うことができます。

まとめ

seleniumを使うと通常のスクレピング手法では
取得できない情報も簡単に取得できるようになるので便利です。

データが取得できなくて困っている方はseleniumを試してみましょう。
これができるようになると、圧倒的にデータを取得できます。

君がエンジニアになるまであと25日

作者の情報

乙pyのHP:
http://www.otupy.net/

Youtube:
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter:
https://twitter.com/otupython