Python で Webスクレイピングする

## Selenium を使ってPython で WEBスクレイピングしてみる
### 1. 環境

| 内容 | バージョン |
|:-|:-|
| OS  | Windows 10 Pro (64bit)  |
| Chrome  | 92.0.4515.159  |
| ChromeDriver  | 92.0.4515.107  |
| Python  | 3.9.0  |
| selenium  | 3.141.0  |

+ Visual Studio Code

| アイテム | バージョン |
|:-|:-|
| バージョン  | 1.59.1 (user setup)  |
| コミット  | 3866c3553be8b268c8a7f8c0482c0c0177aa8bfa  |
| 日付  | 2021-08-19T11:56:46.957Z  |
| Electron  | 13.1.7  |
| Chrome  | 91.0.4472.124  |
| Node.js  | 14.16.0  |
| V8  | 9.1.269.36-electron.0  |
| OS  | Windows_NT x64 10.0.19042  |
| Python | 3.9.0 64bit  |

### 2. 初期設定
Seleniumは、PythonのコードからWEBブラウザを操作する。
操作するためには、WebDriverが必要。

#### 2-1. インストール
#### 2-1-1. Selenium インストール
`pip install selenium`

#### 2-1-2. ChromeDriver のインストール
一度、以下のコマンドでインストールしましたが、
`pip install chromedriver-binary`
Chrome と Chromedriver のバージョンが一致しない問題で動かなかったので、

1. Chrome のバージョンチェック > *92.0.4515.159*
1. [Chrome Driver のサイト](https://chromedriver.chromium.org/downloads) で Chrome と近いバージョンのものをダウンロード > *ChromeDriver 92.0.4515.107*
1. Zip を解凍、中身の **chromedriver.exe** をプログラムのあるディレクトリに置いてダブルクリック。

以上でバージョンを揃えて動かすことが可能に。

以下参考サイト。

https://qiita.com/memakura/items/20a02161fa7e18d8a693

https://qiita.com/motoki1990/items/a59a09c5966ce52128be

https://zenn.dev/shalo/articles/37d6709fb99c1713d11b

### 3. サンプルコードから内容について確認
```Python:sample.py
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

#Chromeを操作
driver = webdriver.Chrome()
driver.get('https://www.google.com/')
time.sleep(5)
search_box = driver.find_element_by_name("q")
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5)
driver.quit()
```

##### 以下、内容について。

```Python
from selenium.webdriver.common.keys import Keys
```
+ Keys クラスで、RETURN、F1、ALTなどのキーボードのキーを提供

```Python
driver = webdriver.Chrome()
```
+ Chrome WebDriver のインスタンスを作成。<br>
Chrome が立ち上がる。

```Python
driver.get('https://www.google.com/')
```
+ **driver.get** メソッドは、URLによって指定されたページに移動。<br>
WebDriverは、テストまたはスクリプトが実行する前に、ページが完全にロードされる（つまり、「onload」イベントが発生する）まで待機。<br>
※ページがロード時にたくさんのAJAXを使用すると、WebDriverは完全にロードされたかどうかわからないということに注意する必要あり。

```Python
search_box = driver.find_element_by_name("q")
```
+ WebDriverでは、find_element_by_* メソッドのひとつを使って要素を見つけることができる。<br>
今回の入力テキスト要素は、find_element_by_name メソッドを使用して name 属性で検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/a2c17439-6567-4e1f-0661-fb7f1669cdb1.png)

| コード | 機能 |
|:-|:-|
| by_id(id)  | id属性がidである要素  |
| by_class_name(name)  | クラス名がnameの要素  |
| by_name(name)  | タグ内のname属性が一致する要素  |
| by_tag_name(name)  | タグ名が一致する要素  |
| by_link_text(text)  | テキストに完全一致する要素  |
| by_partial_link_text(text)  | テキストに部分一致する要素  |
| by_xpath(path)  | xpathが一致する要素  |

```Python
search_box.send_keys('ChromeDriver')
```
+ キーを送信。これはキーボードを使用してキーを入力するのと同じ。<br>
特殊キーは、 selenium.webdriver.common.keys からインポートした Keys クラスを使用して送信。<br>
安全のため、あらかじめ入力フィールド（例：「検索」）に入力したテキストをクリアする。<br>
そうすれば、検索結果には影響を及ぼさない。<br>
今回で言えば、***ChromeDriver*** という文字列でGoogle検索開始。

```Python
search_box.submit()
```

~~**なくても動きました。**~~
~~よくわかりませんでしたが、フォームを送信するときに利用する？~~
→ これがないと、記入内容を送信してくれないとのことでした。
　たまたま動いただけだったようです。(2021/09/04追記)

```Python
driver.quit()
```

すべてのウィンドウを閉じる。

### 4. 要素の取得の仕方
1. Chrome の場合、`Ctrl` + `Shift` + `I
`
2. 検証コンソール左上の選択矢印クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/8a05c1a0-cff9-02e3-3e72-44678b3b0218.png)
3. 知りたい要素クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/b7afb046-dbd4-1f64-aa9a-85c31ff9de4d.png)

### 参考にさせて頂いたサイト

https://kurozumi.github.io/selenium-python/

https://qiita.com/VA_nakatsu/items/0095755dc48ad7e86e2f

https://www.seleniumqref.com/api/python/element_get/Python_find_element_by_name.html

https://valmore.work/how-to-use-selenium-webdriver/

http://blog.livedoor.jp/kmiwa_project/archives/1065433670.html

https://www.seleniumqref.com/api/python/window_set/Python_quit.html

https://techacademy.jp/magazine/28392

https://tomowarkar.com/python3-webdriver/

https://qiita.com/motoki1990/items/a59a09c5966ce52128be

https://qiita.com/memakura/items/20a02161fa7e18d8a693

https://qiita.com/uguisuheiankyo/items/cec03891a86dfda12c9a

https://qiita.com/Taro56/items/7cb048f5e8e8bae192e0