PythonでSeleniumを使ってスクレイピング (基礎)

スクレイピングを勉強しようと思い立って、Selenium を使ってでブラウザを操作してみたので、軽くまとめておこうと思います。

#使用したもの
* [Selenium](http://selenium-python.readthedocs.io/api.html)
    * 自動でブラウザを操作する為のライブラリ
* Chrome
    * ブラウザ

#ブラウザに合わせたドライバーを用意する
ブラウザを操作するには、各ブラウザに合わせてドライバーを用意する必要があります。
今回は Chrome を使用するので [公式サイト] (http://www.seleniumhq.org/projects/webdriver/)から ChromeDriver をダウンロードします。

#Selenium をインストール
pip で selenium を インストール

``` pip install selenium ``` 

#webページを開いてみる
ブラウザを開く
```webdriver.Chrome(driver_path)```

webページを開く
```driver.get(URL)```

webページを閉じる
```driver.close()```

ブラウザを終了 (全てのウィンドウを閉じる)
```driver.quit()```

``` python
from selenium import webdriver
driver = webdriver.Chrome(driver_path)
driver.get(URL)
driver.close()
driver.quit()
```

#要素にアクセスしてみる
HTMLの要素にアクセスする為に id、class、name 等から要素を指定して取得する事ができます。


[参考資料](http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
)


id で取得
``` driver.find_element_by_id('ID') ```

class で取得
```driver.find_element_by_class_name('CLASS_NAME')```

name で取得
```driver.find_element_by_name('NAME')```

link textで取得
```driver.find_elements_by_link_text('LINK_TEXT')```

ネストされた要素は path を指定して取得
```driver.find_elements_by_xpath(".//a")```

#アクション
取得した要素に対して、アクションを起こす事でwebページを操作します。

[参考資料](http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
)

ボタンをクリックする
``` driver.find_element_by_id('Btn').click()```

Form に文字を入力する
``` driver.find_element_by_name('From').send_keys("text") ```

#待機する
よくあるのが、画面のロードが完了する前に、処理が走ってしまいエラーになる。
これに対処する為に必要な要素が準備できるまで、数秒待機する事ができます。

```py
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

WebDriverWait(driver, WAIT_SECOND).until(EC.presence_of_element_located((By.CLASS_NAME, 'Btn')))
```

#ブラウザの操作
では上記をふまえて軽く操作してみます。

###ボタンをクリックしてみる
例えば、某サイトの購入ボタンを押したい場合

<画面>
<img width="298" alt="スクリーンショット_2016-11-21_13_22_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/2f28c4ed-b0c1-3512-deee-132d8177c4df.png">

<ソース>
<img width="538" alt="スクリーンショット_2016-11-21_13_27_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/d5166cca-dbde-4019-b485-e878a05d0a88.png">

```python
from selenium import webdriver
driver = webdriver.Chrome(driver_path)
driver.get(URL)
driver.find_element_by_class_name('new_addToCart').click()
driver.quit()
```

こんな感じで find_element_by_class_name() で要素を取得して click() でクリックアクションを起こします。

###テキスト入力してみる

検索ボックスに検索キーワードを入力して、検索ボタンを押してみます。

<画面>
<img width="1115" alt="スクリーンショット_2016-11-21_13_49_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/83d82bad-9834-9837-43e4-1f1fe59c4c34.png">

<ソース>
<img width="1127" alt="スクリーンショット_2016-11-21_13_48_53.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/b44da9b0-0b2e-3848-d2c1-31d25b0d1230.png">

```python
from selenium import webdriver
driver = webdriver.Chrome(driver_path)
driver.get(URL)
driver.find_element_by_id('searchWords').send_keys("search text")
driver.find_element_by_id('searchBtn').click()	
```

これで検索ボックスに自動で "search text" が入力され検索されます。

#まとめ
ボタンを押したり、テキスト入力をしたりの基本動作を覚えると、だいたいの操作が簡単に出来る印象です。
やはり、ブラウザ操作をプログラムで行う事で、並列処理が出来る事の恩恵は大きいですね。
ただ、ブラウザをたくさん立ち上げると PC がめちゃくちゃ重くなるので、そこは気をつけないといけませんね。