超初心者のGo言語/agouti - ブラウザ操作の基本の基本
これはやく記事にしなければならなかったのですが、面倒で後回しにしていました。ただ実際にGo言語/agoutiを使おうとするといちばん最初に必要なことなので簡略化した形で記事にします。画像や詳細な説明はこれから少しずつ追記していくつもりです。
操作したい場所を探す
ChromeでF12キーを押すとデベロッパーツールが開きますのでこれを使います。デベロッパーツール上でhtmlの上にマウスカーソルを置くとブラウザ画面の対応箇所がグレー表示されます。これで場所を追い込んで行ってもいいんですが、Ctrl+Shift+Cを押すと逆にブラウザ画面上にマウスカーソルを置くとそれに対応するhtmlがわかるようになっていますので、この機能を使った方が早いでしょう。
情報を得る
上の手順でブラウザに表示されている内容を取得する場所がわかり、例えば
<span id="event-next-point">24,693</span>
の“24,693”という数字がほしいとき(これはShowroomでイベントをやっているときに表示される「次の順位まであと 24,693 pt」の数字のところです)
evnet_next_point, _ := page.FindByID("event-next-point").Text()
FindByID() で場所を特定し、Text() で文字列を取り出します。ただいつでもおあつらえ向きにID があるわけじゃありません。確実なのはセレクターを使う方法です。セレクターもデベロッパーツールで知ることができます。該当するhtmlにマウスカーソルをおき右クリックして表示されるコンテクストメニューからCopy => Selector と進みます。ここでは“#event-next-point”でした。次の方法でデータを取得できます。
evnet_next_point, _ := page.Find("#event-next-point").Text()
Showroomで言えば/onliveや/follow のページのように配信者のルームが表になっているときはそれぞれの項目(配信者)の項目へのセレクターは
#list-ranking > li:nth-child(1) > div > div > div.listcardinfo-image > a
のような形をしています。ここで赤字の数字のところを1から順に2、3、...と変化させればそれぞれの項目を取得できます。
FmtURLSelector := "#list-ranking > li:nth-child(%d) > div > div > div.listcardinfo-image > a"
Selector := fmt.Sprintf(FmtURLSelector, i)
URL, _ := page.Find(Selector).Attribute("href")
ここでは上の例だとText() となっているところがAttribute() になっていますがこれは
<a href="/xxxxxxxx" class="room-url">.........<a>
というhtmlからhrefの値を取得しているためです。画像のファイル名を知りたいときもこの方法です。
それからこういう一覧表みたいなのにアクセスする場合はまず表の大きさ(配信者数)を知っておいた方が楽です。これにはCount()を使います。例えば
NoOfRoom, _ := page.AllByClass("js-follow-li").Count()
というようにします。
リンクをクリックする
これは上と同じように場所を特定できればClick()を使うだけです。
page.FindByClass("starButton").Click()
これはShowroom Toolbox の“一気投げ”のボタンを押しているところです。なおjavascript:void(0) が使われているところは当然のことながらクリックしてもムダですので念のため(これって何か対応方法あるんでしょうか?)
文字列を入力するこれはFill()を使うのですが、大問題があってGoogle Chrome Ver.65ではFill()が正常に機能しないようです。Ver.64では問題なく使えており、今はVer.64のChromeをインストールして使っています。(chromedriverを最新版(現時点でVer.2.40)にすることでChromeの最新バージョン(現時点で Ver.67)でもFill()が正しく機能するようになりました)
例1 Showroomのコメント欄の入力
page.Find("#js-chat-input-comment").Fill(message)
time.Sleep(1 * time.Second) // ウェイトは必要ないかも
page.Find("#js-chat-input-comment").Submit()
上の例2は例1でうまくいかなかったからClick()を使う方法にしたのだったと思います。
はっきりしなくてすみません。
----------
今のところ、ここに書いた範囲の知識でどうにかなっています (^^;;
最近のコメント