【Selenium使用】超シンプルにreCHAPCHAを突破する方法

# はじめに
↓のような、**reCHAPCHAクリック** が求められるサイトをWebクローリング・スクレイピングする際の突破方法を記します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/890e1af3-7631-2a2f-06a5-1ca541e6921b.png" width="300">

今回は、[オークファン](https://aucfan.com) を例にします。

初めてWebクローリング・スクレイピングする方は、[事前準備](#事前準備)から、
慣れている方は、[いよいよ突破](#いよいよ突破)をご拝読ください。

また、**全体のコードのみ見たい方は、[全体のコード](#全体のコード)** から。

# 全体のコード
```python:全体のコード
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver_path = './chromedriver-win64/chromedriver.exe'
service = Service(driver_path)
driver = webdriver.Chrome(service=service)

driver.get('https://aucfan.com/member/myaucfan')

# ページが完全に読み込まれるまで待機
driver.implicitly_wait(10)
# `wait`を作成（最大10秒待機）
wait = WebDriverWait(driver, 10) 

# reCAPTCHA「私はロボットではありません」のチェックボックスをクリック
captcha_checkbox = wait.until(
    EC.element_to_be_clickable(
        (By.CLASS_NAME, 'recaptcha-checkbox-checkmark')
        )
    )
    
captcha_checkbox.click()
```

# 事前準備
必要ライブラリをインポートします。
今回は、Selenium（ブラウザを自動化するツール）と, ChromeDriver（Google Chromeブラウザを操作）を用います。

## `chromedriver.exe`のダウンロード
[chromedriver.exe](https://developer.chrome.com/docs/chromedriver/downloads?hl=ja)をダウンロードします。

この際、ChromeブラウザとChromeDriverのバージョンが一致していることを確認してください。
Chromeブラウザのバージョンは～で確認できます。

## 必要ライブラリのインポート
```python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
```
## `driver`オブジェクトの作成
`chromedriver.exe`の位置を`driver_path`を用いて、**相対パス** で指定します。
```python
driver_path = './chromedriver-win64/chromedriver.exe'
```
ChromeDriver（ブラウザを操作するための実行ファイル） のパスを`Service`クラスに指定します。
```python
service = Service(driver_path)
```
**Chromeブラウザを起動** し、これを操作するための`driver`オブジェクトを作成します。
```python
driver = webdriver.Chrome(service=service)
```


ここまで出来たら、事前準備の完成です。

# いよいよ突破
- **まずはアクセスしたいページを開きます。**
```python
driver.get('https://aucfan.com/member/myaucfan')
```
この際、しっかり検索ページが開かれるのを待つため↓コードを加えることを忘れないようにしましょう。（これをしないと、**対象Webサイトに多大な負担をかけてしまい大問題に発展しかねません。**)
```python
# ページが完全に読み込まれるまで待機
driver.implicitly_wait(10) 
```
すると、今回の例では、↓のような画面に遷移します。

では、いよいよ`reCAPTCHA`の突破です。

- **`reCHAPTCHA`部分の`HTML`構造を分析する**
`Fn`+`F12`or `F12` or `右クリック`→`検証`をクリックし、デベロッパーページを開きます。

reCHAPTCHAのチェックボックスは`class_name`が`recaptcha-checkbox-checkmark`の`<div>`タグで囲まれていることがわかります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/68ec32f7-2b05-52d3-0462-5ac5fa504f44.png" width="800">

よって↓のように記述します。
```python
# `wait`を作成（最大10秒待機）
wait = WebDriverWait(driver, 10) 

# reCAPTCHA「私はロボットではありません」のチェックボックスをクリック
captcha_checkbox = wait.until(
    EC.element_to_be_clickable(
        (By.CLASS_NAME, 'recaptcha-checkbox-checkmark')
        )
    )
```
ここでは、
クリック可能な`reCAPTCHA`のチェックボックス要素を取得し、変数 `captcha_checkbox` に格納します。

※コードの説明
**`wait.until`**
- reCAPTCHAのチェックボックスがクリック可能になるまで待機します。

**`(By.CLASS_NAME, 'recaptcha-checkbox-checkmark')`**:
- 要素をclass名で指定しています。
- By.CLASS_NAME は要素の検索方法で、指定されたクラス名 recaptcha-checkbox-checkmark に一致する要素を探します。


そして、チェックボックスをクリックします。
```python
captcha_checkbox.click()
```