以前にVPSでSeleniumを使ってブラウザの操作をしていたのですが、「そういえばMacでもPyhtonから操作出来るのかしら?」という興味でMacで動かしてみることにしました。
MacでSeleniumはJavaで昔に動かしたことがありましたがPythonからは初めての試みです。
pipでインストールします。
pip3 install selenium
特に問題なく関連パッケージもインストールされるようです。めちゃ簡単!
備忘録としてスクショ
Webドライバーへのパスを指定しないといけないようなので、Chromeブラウザのアドレスバーへ「chrome://version」と入力してバージョン情報を見ます。
「実行ファイルのパス」とあるのでこれをメモ。
最終ディレクトリ内「MacOS」に「chromedriver」と付けるそうです。(よく解っていませんが)
実際のコードがこちら(殆どChatGPTで生成しています)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# Chrome WebDriverのパスを指定してServiceオブジェクトを作成
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
service = Service(driver_path)
# Serviceを使用してWebDriverを起動
driver = webdriver.Chrome(service=service)
# Googleの検索ページを開く
driver.get('https://www.google.com')
# 検索ボックスにキーワードを入力
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('スクレイピング')
search_box.submit()
# 検索結果のタイトルとURLを取得
results = driver.find_elements(By.CSS_SELECTOR, 'div.g')
for result in results:
title = result.find_element(By.CSS_SELECTOR, 'h3').text
url = result.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')
print(f'Title: {title}')
print(f'URL: {url}')
print('---')
# WebDriverを終了
driver.quit()
ChatGPTで生成したままのコードでは
driver.find_element(By.NAME, 'q')
の部分が新しいバージョン(バージョン4以降)にうまく対応出来ておらず、
driver.find_element_by_name('q')
と書かれており、エラーが発生。
やや混乱しましたがそこだけ調べてクリアすればしっかり動いてくれました。
Pythonで動かすとJavaと違ってコンパイルが不要なので楽ですね。
また、最近のChomeではSeleniumでブラウザを起動させるとGoogleアカウントにはログイン出来ないという仕様になっているようです。
しかし、ログインしないと
↑↑こいつが邪魔でうまく操作できません。
調べた結果、profileを設定するとログイン出来るという情報を得たのでprofileを設定してみることにしました。
<参考>
Selenium経由でGoogleログオンしようとするとエラー | SyachikuLOG
SeleniumでGoogleにログインする方法 | KOSEN BLOG
先のバージョン情報からプロフィールパスを取得して
ディレクトリを見ると。。。。
Defaultの他にProfile 1〜Profile 10まであります。
これ中身見てもわからん!!Defaultじゃ駄目なん?
とりあえずProfile 1で指定して起動して、ログインできるか試してみることにしました。
先のコードにoptionを追加し、起動して5分以内に手動でログインする算段です。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
options = Options()
options.add_argument("--user-data-dir=/Users/[ユーザー名]/Library/Application Support/Google/Chrome/Profile 1")
options.add_argument("--profile-directory=Profile 1")
# Chrome WebDriverのパスを指定してServiceオブジェクトを作成
driver_path = '/Applications/Google Chrome.app/Contents/MacOS/chromedriver'
service = Service(driver_path)
# Serviceを使用してWebDriverを起動
#driver = webdriver.Chrome(service=service)
driver = webdriver.Chrome(options=options,service=service)
# Googleの検索ページを開く
driver.get('https://www.google.com')
#この間に手動でログインする
time.sleep(600)
# 検索ボックスにキーワードを入力
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('スクレイピング')
search_box.submit()
# 検索結果のタイトルとURLを取得
results = driver.find_elements(By.CSS_SELECTOR, 'div.g')
for result in results:
title = result.find_element(By.CSS_SELECTOR, 'h3').text
url = result.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')
print(f'Title: {title}')
print(f'URL: {url}')
print('---')
# WebDriverを終了
driver.quit()
結果、駄目でした^^;
えー!!?
残念ながら手持ちのアカウントでログイン出来ませんでした。
じゃあ、アカウント新規作成はどうなん?
できた!!
Selenium用のアカウントを作ることで対応出来ました。
先程の邪魔な案内も出ないのできちんと出力されます。
今回は以上です。
あー、また余計なアカウント作ってしまった。。。あれ?新規作成ならプロフィール設定もDefaultでよくね?(ま、いっか)