SeleniumでiTunesconnectにログインする

selenium_web_driver.001

どうも最近iTunesconnectがアプリのDL数等の集計データをCSVエクスポートするリンクをはずしたような気がするんですけど、どうなんでしょうか。
いずれにせよ、自分の好きなように抽出したかったのでSeleniumを使ってログインし、集計データ画面までいってスクレイピングする事にしました。
その際、ログイン処理でくっそハマってMCハマー1時間くらいキメたので、ポストしておきます。

もちろんrubyです。
gemの selenium-webdriverを使用していますが、当初下記のようにかけばログインフォームにID/PWを入力できると思っていました。

require 'selenium-webdriver'

d = Selenium::WebDriver.for :firefox

d.get 'https://itunesconnect.apple.com/itc/static/login'

d.find_element(:id, "appleId").send_keys("kame")
d.find_element(:id, "pwd").send_keys("hoge")

しかしこれだと、
Unable to locate element: {“method”:”id”,”selector”:”appleId”}) (Selenium::WebDriver::Error::TimeOutError)
が頻発して、Inputフォームが見つからずに苦戦しまくったのでした。

そこで、フォームのElementが表示されるまでWaitすればいいのか?と思った。
(なんか画面描画されるのも非同期っぽいし・・)

というわけで、各メソッドのTimeoutを10secondsに変更してみるテスト

wait = Selenium::WebDriver::Wait.new(timeout: 10)
wait.until{ d.find_element(:id, "appleId").send_keys("kame") }

と、いったような感じでかいた。
けど、それでも
Unable to locate element: {“method”:”id”,”selector”:”appleId”}) (Selenium::WebDriver::Error::TimeOutError)

id指定が動かぬ原因なのかと疑い出す(そんなバカな話が・・と思いつつもハマったらなんでも試さないと前進がない病にかかっている)
と、いってXpathにしてもうごかなかった。

画面のレンダリングそのものを待とう  という事で、getのあとにsleep(10)をなにげに入れてみる。 けどダメ。

そんな時、ふと思った。

iTunesconnectにSeleniumでログインしようとしてる人って世界にいっぱいいるんじゃないか?

検索してみた。

本当にいた。

さすが、天下のApple様のサイトですね。
みんな同じような事を考えているそうです。 ていうか、これだけ需要あるんだから、CSVデータ出力用のAPIとかもっと用意してくれてもバチ当たらないと思うんですけども・・
Using selenium on Itunes web site

によると、、

The element which you are trying to look for is within an iframe. Try this:

というわけで、iFrameの中は指定しないと一生Findできないようでした。
逆に、ログインフォーム部分がiFrameでレンダリングされている事も初めて気付きました。

driver.switch_to.frame(‘framename’)
を使って、Frameを切り替えてからFindするそうですよ。

けど、iFrameのレンダリングに少しだけ時間食うので、sleepかけてみた。(あとでこのエントリ書いてる最中おもったけど、デフォルトのWait時間で間に合う説ある?)

なお、最後のパース処理は圧倒的にNokogiriに慣れているのでそっちにおまかせする事にした。
というわけで、これで無事動いた。

iTunesconnectで全部のアプリの集計データを全期間分とってくるソース

require 'selenium-webdriver'
require 'nokogiri'

a_id = ENV['APPLE_ID']
a_pw = ENV['APPLE_PW']

d = Selenium::WebDriver.for :firefox
wait = Selenium::WebDriver::Wait.new(timeout: 10)

d.get 'https://itunesconnect.apple.com/itc/static/login'

sleep(5)
d.switch_to.frame('authFrame')

d.find_element(:id, "appleId").send_keys(a_id)
d.find_element(:id, "pwd").send_keys(a_pw)
d.find_element(:id, "sign-in").click

sleep(5)  # ログインに時間かかるから入れてみたんだけど、これもsleepなしにできるのかな・・
today = Time.now.strftime("%Y-%m-%d")
report_url = 'https://reportingitc2.apple.com/?interval=week&startDate=2003-04-07&endDate=' + today

d.get report_url
sleep(13)
d.find_element(:class, 'view-more').click
sleep(2)

html = d.page_source
doc = Nokogiri::HTML(html)
# 以下Nokogiriさんで処理

d.quit

おわり

 

2016-05-05 | Posted in 技術的なポエムNo Comments » 


関連記事

Comment





Comment



*