プログラミング初心者の勉強日記

情報科学専攻です. 機械学習と競技プログラミングについて日々勉強しています.

MENU

pythonでクローリングするならSeleniumがおすすめ

機械学習などで大量のデータが必要になることは多々あります.

Wikipediaなどではdumpファイルで一括ダウンロードできるので問題は起きませんが、必ずしも自分が使いたいデータが一括でダウンロードできるとは限りません.

そんな時におすすめなのがSeleniumです!

私自身、これまで研究でBeautifulSoupを用いてクローリング、スクレイピングを行いデータ収集を行ってきました. (BeautifulSoupもものすごく便利なのでいつか記事にしたいと考えています.)

最近新たに必要になったデータを収集しようとしたのですが、BeautifulSoupだけでは難しそうなのでSeleniumを使ってみました (BeautifulSoupだけでもできるかもしれませんが、私の技量では少し難しそうでした...). そしたら、これが便利すぎてビックリしました.

Seleniumは本来はwebアプリケーションの自動テスト用のツールだそうですが、使い方は無限大です.

今回はそんな超便利なSeleniumの紹介記事です.

最後に、Seleniumに慣れるために、自動でGoogle翻訳を開き、翻訳ボタンを押し、翻訳結果をターミナルに出力するプログラムを書きましたので、そのソースコードを載せておきます.

実行結果の節でもgif画像を貼っていますが、イメージが付きやすいようにここにも載せることにします.

f:id:linearml:20181024053558g:plain

1. インストール方法

今回は、pythonpipがすでに導入済みということを前提にして話を進めていきたいと思います. (まだ導入していないという方は、自分の使用しているos名とpipを検索クエリに入れググってみてください.)

sudo pip install selenium

これだけです.

また、seleniumを使うにはブラウザのドライバが必要になってきます. 今回はgoogle chromeを使うことを想定して話を進めていきます.

google chromeのdriverはこちらからインストールできます.

自分のosにあったdriverをインストールして適当なところに解凍してください.

2. seleniumでできること

1. ページを開く

urlを指定して、そのページを開く事ができます.

from selenium import webdriver
driver = webdriver.Chrome('./chromedriver') # インストールしたdriverのpathを指定してください. この場合カレントディレクトリにインストールしています.
url = 'https://www.google.com'
driver.get(url)

実行するとgoogleが開けると思います.

2. htmlの情報を取得

htmlの要素、要素のタグ名など様々な情報を取得する事ができます.

逆引きリファレンスがあるので自分がやりたい事に合わせて機能を追加していくといいと思います.

ここでは、その中のいくつかを紹介したいと思います.

1. id属性から要素を取得
<div id = "hoge">hoge</div>
<div id = "foo">foo</foo>

というhtmlがあったとします. この中のidがhogeのところだけを取得したい場合、

driver.find_element_by_id('hoge')

と書く事で、取得できます.

タグの中の文字列を取得したい場合は、

 driver.find_element_by_id('hoge').text

と書けばokです.

2. class属性から要素を取得
<div class = 'hoge'>hoge</hoge>
<div class = 'foo'>foo</foo>

というhtmlに対して、classがhogeのところだけを取得したい場合、

driver.find_element_by_class('hoge')

と書けばokです.

idの時と同様、タグの中の文字列は、

driver.find_element_by_class('hoge').text

で取得できます.

2. 文字を入力

テキストボックスを指定して、文字を入力する事ができます.

例えばgoogleのテキストボックスは

<input class='gsfi' id='lst-ib' ...>

となっています.

chromeの場合、F12を押すとデベロッパーツールを開く事ができ、左上の矢印を押すと、クリックしたところがhtmlのどこに相当するかがすぐにわかります. これを使って知りたいボタンやテキストボックスの属性などを調べると良いでしょう.

f:id:linearml:20181024045419g:plain

さて、今回はidを知る事ができたので、先ほどのように、テキストボックスの要素を取得します.

text_box = driver.find_element_by_id('lst-ib')

そのあとに、文字列を指定して、取得した要素に情報を送ってあげます.

text_box.send_keys('入力したい文字列')

3. ボタンをクリック

ページの好きなボタンをクリックする事ができます.

まずは、ボタンの要素を知る必要があります.

上の例のように、googleの検索ボタンの要素を調べると、

<input value="Google 検索" aria-label="Google 検索" name="btnK" ...>

となっています.

今回は、xpathを指定して要素を取得したいと思います.

xpathとは、XML中の要素や属性などを指定するための言語です.

詳しい説明はqiitaのページがとても参考になるのでこちらを読んでみてください.

さて、上のhtmlの場合、xpathは、

//input[@name='btnK']

となります. inputとその中に含まれる、属性nameについても指定してあげる事で、要素を一つに絞る事ができます.

このxpathを用いて、

button = driver.find_element_by_xpath("//input[@name='btnK']")

と書く事で、検索ボタンの要素を取得する事ができます.

このボタンをクリックするためには、

button.click()

と書けばokです.

4. ウインドウを閉じる

ウィンドウを一つ閉じたい場合は、

driver.close()

全て閉じたい場合は

driver.quit()

と書きます.

3. 実装例 : google翻訳を用いて翻訳してくれるスクリプトを作成

pythonの標準入力で英語を受け取り、seleniumを用いて、検索から翻訳結果の取得までを行うスクリプトを作成しました.

今回はリアルタイム翻訳ではなく、「翻訳」ボタンを押す事で、翻訳するようにしたいので、まず、リアルタイム翻訳を無効にします.

その後で、テキストボックスに英語を入力し、翻訳結果を取得し、ターミナルに出力しています.

1. ソースプログラム
#coding : utf-8
from selenium impot webdriver
import time

word = raw_input() # 標準入力で英語を受け取る
url = 'https://translate.google.co.jp/?hl=ja#en/ja/'

driver = webdriver.Chrome('./chromedriver')
driver.get(url)

time.sleep(3)

unvalid = driver.find_element_by_id('gt-otf-switch') # リアルタイム翻訳を無効にする
unvalid.click()

time.sleep(3)

text_box = driver.find_element_by_id('source')
text_box.send_keys(word) # テキストボックスに入力

time.sleep(3)

button = driver.find_element_by_xpath("//input[@id='gt-submit']")
button.click()  # 翻訳ボタンをクリック

time.sleep(3)

result = driver.find_element_by_id('result_box') # 翻訳結果を取得
print result.text

driver.quit() # ブラウザを閉じる

実行結果がわかりやすくなるように適宜処理を一時停止しています.

2. 実行結果

f:id:linearml:20181024053558g:plain

4. まとめ

今回は、Seleniumの紹介をしました.

Seleniumを使う事で、クローリングやwebアプリケーションの自動テストなど様々な事ができますので、これを機にマスターしてみようと思います.