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

昨日までのはこちら

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

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

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

## Seleniumの操作方法

### Seleniumを読み込みする

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

```python
from selenium import webdriver

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

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

<img width="747" alt="スクリーンショット 2020-06-03 18.04.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/34e29eed-4da2-d0af-e739-f8fa37e164ba.png">

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

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

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

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

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

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

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

```python
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)`

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

```python
driver.get(URL)
```

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

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

<img width="744" alt="スクリーンショット 2020-06-03 18.20.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/5477706d-c554-d099-81ad-d58952657df1.png">

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);`を指定すると一番下までスクロールさせられます。

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

```python
# 少しだけスクロール
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`ライブラリを読み込みしておきます。

```python

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`

```python
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