SHOWROOMのイベント参加者のリストを取得する(GO, スクレイピング)
これまでSHOWROOM関連のプログラムをGO言語でいろいろ書いてきたのですが、すべてブラウザを開きそれを操作するか、というようなやり方をしていました。つまりGO/agouti で書いたものです。
ベースに星集め、種集め、星投げ、種投げを自動化しようというのがあるので、そうしていたわけですが、(いまさらですが)よくよく考えるとものによっては単にリクエストを投げ戻って来たHTMLを解析するだけで済む話でした。
イベントに参加している配信者さんの順位や獲得ポイントを取得する、イベントに参加した配信者さんのリストを取得する、現在配信中の配信者さんのリストを取得する、などの操作がこれにあたります。
今回は、まずはじめに、イベントに参加している配信者さんのリストを取得する、というのを紹介します。
ブラウザに関するおまじない的なものはないのでその分は簡単になりますが、やってることはそんなにかわりません。ただパフォーマンスは圧倒的にいいです。
/*
SHOWROOMのイベントの配信者の一覧を作ります。
使い方
イベントページのURLが
https://www.showroom-live.com/event/event_id
のとき
EventRoomList.exe event_id
実行するとイベント参加者のアカウント、ID(5~6桁の数字)、ルーム名が
参加者の数だけ出力されます。
(ただしデータが得られる参加者数には上限があったはず)
*/
package main
import (
"fmt"
"os"
"strings"
"net/url"
"github.com/PuerkitoBio/goquery"
)
func GetEventRoomList(EventName string) (NoRoom int, AccountList, IdList, NameList []string) {
// AccountList アカウントのリスト、アカウントは配信のURLの最後の部分の英数字です。
// IdList IDのリスト、IDはプロフィールのURLの最後の部分で5~6桁の数字です。
// NameList ルーム名のリスト
// 以下の部分は次を参考にしました。
// はじめてのGo言語:Golangでスクレイピングをしてみた
// https://qiita.com/ryo_naka/items/a08d70f003fac7fb0808
_url := "https://www.showroom-live.com/event/" + EventName
doc, err := goquery.NewDocument(_url)
if err != nil {
panic(err)
}
u := url.URL{}
u.Scheme = doc.Url.Scheme
u.Host = doc.Url.Host
// イベントに参加しているルームの数を求めます。
// セレクターはブラウザの開発ツールを使って確認します。
SNoRoom := doc.Find("p.ta-r").Text()
fmt.Sscanf(SNoRoom, "%d", &NoRoom)
// 確か30ルームを越える参加者がいる場合は初期表示されるのは30ルームだったはず
if NoRoom > 30 {
NoRoom = 30
}
// 各参加者の情報を取得します。
for i := 1; i < NoRoom+1; i++ {
// セレクターはブラウザの開発ツールを使って確認します。
selector_account := fmt.Sprintf("li.js-follow-li:nth-child(%d) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > a:nth-child(2)", i)
selector_id := fmt.Sprintf("li.js-follow-li:nth-child(%d) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > ul:nth-child(1) > li:nth-child(2) > a:nth-child(1)", i)
selector_name := fmt.Sprintf("li.js-follow-li:nth-child(%d) > div:nth-child(1) > div:nth-child(2) > div:nth-child(2) > h4:nth-child(1)", i)
account, _ := doc.Find(selector_account).Attr("href")
account = strings.Replace(account, "/", "", -1)
id, _ := doc.Find(selector_id).Attr("href")
id = strings.Replace(id, "/room/profile?room_id=", "", -1)
name := doc.Find(selector_name).Text()
AccountList = append(AccountList, account)
IdList = append(IdList, id)
NameList = append(NameList, name)
}
return
}
func main() {
if len(os.Args) == 1 {
fmt.Println("Usage: ", os.Args[0], " EventName")
return
}
EventName := os.Args[1]
NoRoom, AccountList, IdList, NameList := GetEventRoomList(EventName)
fmt.Printf("0\t0\t0\r\n")
for i := 0; i < NoRoom; i++ {
fmt.Printf("%s\t%s\t%s\t%s\tfalse\t1\t2\r\n", NameList[i], AccountList[i], EventName, IdList[i])
}
}
-------------------------
参考
「Showroom - 自動星集め・星投げ・カウントツール)」 (使用法とソースつき)
「Showroom - 自動三周ツール(もう一つの自動星集め・星投げ・カウントツール)」
「Showroom - イベントの獲得ポイント数を取得して記録するツール」
「SHOWROOMのイベント参加者のリストを取得する(GO, スクレイピング)」
「Showroom - 福引するプログラムとその結果 (1)」
「Showroomの複数アカウント(複アカ、複垢)について考えてみた(1)」
「Showroom - 複数アカウント(複垢)問題の真実 - 実験計画」
「Showroomの重複アカウント(複垢)減算はこうして起きる」
「Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間
「Showroom ラスカルイベの最後の5分間」
「Showroomでの自動星集めの試み (1)」
「Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る」
「Showroomでの自動星集めの試み (4) 星集めツール」
「Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/Agouti)」
「超初心者のGo言語/agouti - ブラウザ操作の基本の基本」
「超初心者のGo言語 - 複数の戻り値をもつ関数」
「超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)」
---------------------
「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 使い方まとめ」
« Showroomの重複アカウント(複垢)減算はこうして起きる | トップページ | SHOWROOM - イベント結果データ (2) »
「パソコン・インターネット」カテゴリの記事
- さくらインターネットのレンタルサーバーでGOで書いたCGIを動かした(苦労)話(2021.04.19)
- SHOWROOMのAPI - 「ライブ情報」の取得(GO言語のソースつき)(2019.10.26)
- SHOWROOM 星集め・星投げツール スケジュールの詳細化 BreakDownSchedule() (三周のやり方を例に)(2019.09.25)
- SHOWROOM 新・自動三周ツール -- GO言語によるブラウザ制御 (1) main()(2019.09.17)
この記事へのコメントは終了しました。
コメント