はじめに
↓のような、reCHAPCHAクリック が求められるサイトをWebクローリング・スクレイピングする際の突破方法を記します。
今回は、オークファン を例にします。
初めてWebクローリング・スクレイピングする方は、事前準備から、
慣れている方は、いよいよ突破をご拝読ください。
また、全体のコードのみ見たい方は、全体のコード から。
全体のコード
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をダウンロードします。
この際、ChromeブラウザとChromeDriverのバージョンが一致していることを確認してください。
Chromeブラウザのバージョンは~で確認できます。
必要ライブラリのインポート
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
を用いて、相対パス で指定します。
driver_path = './chromedriver-win64/chromedriver.exe'
ChromeDriver(ブラウザを操作するための実行ファイル) のパスをService
クラスに指定します。
service = Service(driver_path)
Chromeブラウザを起動 し、これを操作するためのdriver
オブジェクトを作成します。
driver = webdriver.Chrome(service=service)
ここまで出来たら、事前準備の完成です。
いよいよ突破
- まずはアクセスしたいページを開きます。
driver.get('https://aucfan.com/member/myaucfan')
この際、しっかり検索ページが開かれるのを待つため↓コードを加えることを忘れないようにしましょう。(これをしないと、対象Webサイトに多大な負担をかけてしまい大問題に発展しかねません。)
# ページが完全に読み込まれるまで待機
driver.implicitly_wait(10)
すると、今回の例では、↓のような画面に遷移します。
では、いよいよreCAPTCHA
の突破です。
-
reCHAPTCHA
部分のHTML
構造を分析する
Fn
+F12
orF12
or右クリック
→検証
をクリックし、デベロッパーページを開きます。
reCHAPTCHAのチェックボックスはclass_name
がrecaptcha-checkbox-checkmark
の<div>
タグで囲まれていることがわかります。
よって↓のように記述します。
# `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 に一致する要素を探します。
そして、チェックボックスをクリックします。
captcha_checkbox.click()