0.初めに
Google Analyticsがデータをとれているか検証する必要がある、というときにページを一つ一つ手動で辿って条件を付加して…というのは大変な手間であると思います。もちろん定期的に数値をとりたいだけであればメール等で定期的に配信されるようにすればよいのですが、一回きりの検証でもページ数が1000を超える場合には人力で行うのは気が遠くなるような作業になります。
そのようなときにpython+seleniumでページを選ぶ切り替えさせてスクリーンショットや数値をとってくることが可能です。
1.python+selenium環境
windows10 (Microsoft Windows [Version 10.0.17134.471])
Anaconda 4.6.7
selenium 3.141.0
chromedriver 74 (http://chromedriver.chromium.org/downloads よりダウンロード)
環境設定の方法は適宜別サイトを参考にしてください。
2.userの設定
GAにログインするためにはIDとpasswordを入力する必要があります。他サイトであればページに直接送るようにスクリプトを書いてもよいのですが、GAでは二段階認証が設定されていることも多いのでChromeユーザープロファイルに設定をするようにします。この際に既存のプロファイルを使う方法と新規のものを作成する方法の二通り考えられますが、できる限り認証は使い捨てにしてタスクが終了したら消すようにしておきたいので今回は新規で作成します。作業ディレクトリに”UserData”等の名前でディレクトリを作っておきます。
import selenium options = webdriver.ChromeOptions() #プロファイルの設定 options.add_argument('--user-data-dir=' + userdata_dir) driver = webdriver.Chrome(options=options) #ページ遷移 driver.get("https://analytics.google.com/web/")
まで実行し、一度ID・passを入力して二段階認証をしましょう。終わったら
driver.quit()
でドライバーを閉じましょう。
3.その他importしておくライブラリ
time等で指定秒待機するのは使い勝手が悪いですし、無駄に時間がかかったり動作が不安定になったりするので具体的な条件で指定できるようにします。
また、条件などを指定するときにEnterを押したほうが楽な場合もあるのでKeysもimportしておきます。
import time import selenium from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoAlertPresentException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait #条件によってドライバーを待機させるため from selenium.webdriver.support import expected_conditions as EC #待機条件を指定するため from selenium.webdriver.common.keys import Keys #key入力をするため
4.実際の動作
さて、実際の操作においては当然検証ごとに動きが異なるので必要に応じてスクリプトを組む必要があります。
今回は「サイトコンテンツ>行動>全てのページ」において「プロパティ・ビューを切り替えてセカンドディメンションにブラウザを指定し、ブラウザーの種類ごとにPV数を取得・グラフのスクリーンショットを撮る」という仮想課題を考えてスクリプトを組みます。
4-1.ドライバーの立ち上げ~スタートページ立ち上げ
strat_page="https://analytics.google.com/analytics/web/#/report/content-pages/********/_u.date00=20190101&_u.date01=20190131" driver = webdriver.Chrome(options=options,executable_path=r'C:/Users/exture1/Desktop/chromedriver.exe') driver.maximize_window() driver.get(start_page) # driver.execute_script("document.body.style.zoom='90%'") #ズームを90%にしてページ全体を表示するようにする。
レポートのコンテンツを変えたり、日付の期間を変えるのはするのはやや面倒なのでスタートページに含ませてやります。(入ってしまえばビューの遷移をしても切り替わりしない)
4-2.iframeの取り扱い
GAのページはiframe タグによってhtmlの中にhtmlが埋まっている入れ子の構造になっています。このページに対してはフレームを切り替えてあげないとDOMを指定することができません。
iframe=driver.find_element_by_xpath("/html/body/iframe[2]") #要素を取得 driver.switch_to.frame(iframe) #フレームの切り替え driver.switch_to.default_content() #フレームを最上位にする
4-3.待機
先ほども申しあげた通り、秒数指定で待機をさせると余計に時間がかかったり待機が十分でなかった場合にエラーが起きたりするのでできる限り条件で指定してあげます。
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#ID-explorer-table-tableControl > div > div.C_TABLECONTROL_TOP._GAHd > ul > li:nth-child(4) > div"))) driver.find_element_by_css_selector("#ID-explorer-table-tableControl > div > div.C_TABLECONTROL_TOP._GAHd > ul > li:nth-child(4) > div").click()
のように特定の要素がクリック可能かどうか等で判定してあげます。ロードの際にする処理はほぼ同じなのでメソッドにしてしまいます。
#iframe内での待機 def GA_loading_wait_iframe(): while (driver.find_element_by_css_selector("#ID-reportLoading").get_attribute("style")!='display: none;'): time.sleep(1) #最上位フレームでの待機 def GA_loading_wait_default(): driver.switch_to.default_content() WebDriverWait(driver, 10).until_not(EC.text_to_be_present_in_element((By.CSS_SELECTOR,loading_css_selector),"aria-hidden"))
BYの使い方はこちら
4-4.実践
それでは実際にやってみましょう。なお、一部セレクターがうまいこと使えなかったのでxpathで指定していて、可読性が低いので適当に変数を導入しています。
#ブラウザを切り替えるためのメソッド def browser_change(browser): filename=browser+".png" WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH,advance_xpath))) driver.find_element_by_css_selector("#ID-explorer-table-tableControl > div > div.C_TABLECONTROL_TOP._GAHd > ul > li._GAbo._GAeg._GAdGb > span > ul > li.ACTION-apply.TARGETーfilter._GAy._GApg > span").click() time.sleep(1) driver.find_element_by_xpath(browser_name_input_xpath).clear() driver.find_element_by_xpath(browser_name_input_xpath).send_keys(browser) driver.execute_script(down_scroll_script) driver.find_element_by_xpath(filter_apply_xpath).click() GA_loading_wait_iframe() driver.save_screenshot(filename) driver = webdriver.Chrome(options=options,executable_path=r'C:/Users/exture1/Desktop/chromedriver.exe') driver.maximize_window() driver.get(start_page) driver.execute_script("document.body.style.zoom='90%'") #driverをiframeに入れる WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "/html/body/iframe[2]"))) iframe=driver.find_element_by_xpath("/html/body/iframe[2]") driver.switch_to.frame(iframe) #セカンダリディメンションの追加 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#ID-explorer-table-tableControl > div > div.C_TABLECONTROL_TOP._GAHd > ul > li:nth-child(4) > div"))) driver.find_element_by_css_selector("#ID-explorer-table-tableControl > div > div.C_TABLECONTROL_TOP._GAHd > ul > li:nth-child(4) > div").click() WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH,second_dimension_input))) driver.find_element_by_xpath(second_dimension_input).send_keys("ブラウザ") WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH,"second_dimension_apply"))) driver.find_elementt_by_xpath(second_dimension_apply).click() #スクショを撮る GA_loading_wait_iframe() driver.save_screenshot("PV.png") #PV取得 print(driverPV_xpathement_by_xpath("PV_xpath").text)
この記事へのコメントはありません。