« Showroomの重複アカウント(複垢)減算はこうして起きる | トップページ | SHOWROOM - イベント結果データ (2) »

2019年4月 3日 (水)

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) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« Showroomの重複アカウント(複垢)減算はこうして起きる | トップページ | SHOWROOM - イベント結果データ (2) »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ