超初心者の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()を使う方法にしたのだったと思います。
はっきりしなくてすみません。
----------
今のところ、ここに書いた範囲の知識でどうにかなっています (^^;;
----------
参考
「超初心者のGo言語/agouti - ブラウザ操作の基本の基本」
「超初心者のGo言語 - 複数の戻り値をもつ関数」
「超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)」
「Showroom - 自動星集め・星投げ・カウントツール)」 (使用法とソースつき)
「Showroom - 福引するプログラムとその結果 (1)」
「Showroom - イベント結果データ」
「Showroomの複数アカウント(複アカ、複垢)について考えてみた(1)」
「Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間
「Showroom ラスカルイベの最後の5分間」
「Showroomでの自動星集めの試み (1)」
「Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る」
「Showroomでの自動星集めの試み (4) 星集めツール」
「Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/Agouti)」
---------------------
「GoDoc - package agouti」
「Qiita @0829 - Goではじめてみたブラウザの自動操作」
「Qiita @tenten0213 - agoutiというWebDriverクライアントを使って面倒な作業を自動化する」
「Qiita @masaru_b_cl - Windows上でGo言語初心者向け学習環境を作る」
「はじめてのGo言語」
「天才まくまくノート - まくまく Hugo/Go ノート - 関数を定義する (func)」
「Qiita @TakaakiFuruse - Golang Goの並列処理を学ぶ(goroutine, channel)」
「Qiita @To_BB - Rubyエンジニアがゴルーチン(Go言語)を学んでみた【初心者向け】」
「Qiita @fukumone - goroutine 使い方まとめ」
« 超初心者のGo言語 - 複数の戻り値をもつ関数 | トップページ | Showroomの複数アカウント(複アカ、複垢)について考えてみた(1) »
「Go言語/agouti」カテゴリの記事
- 超初心者のGo言語/agouti - ブラウザ操作の基本の基本(2018.01.20)
- 超初心者のGo言語 - 複数の戻り値をもつ関数(2018.01.13)
- 超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)(2018.01.09)
この記事へのコメントは終了しました。
« 超初心者のGo言語 - 複数の戻り値をもつ関数 | トップページ | Showroomの複数アカウント(複アカ、複垢)について考えてみた(1) »
コメント