「高く評価した動画」の一覧リストを取得するWSHバッチ


自分が高く評価した動画の一覧を取得するバッチ。

ソースコード

ie_jq.js

// 自分が「高く評価した動画」のリストのURL
var yt_url = "https://www.youtube.com/playlist?list=〜〜〜〜";



// ------------------ jQueryでスクレイピング ------------------



// 現在のページ内でjQueryを有効化する(スクレイピングしやすいように)
function ie_inject_jquery( ie ){

	// 既に$があるか
	//if( ie.document.$ ) return;

	// script要素を新規作成
	var elem_head = ie.document.getElementsByTagName('head')[0];
	var elem_script = ie.document.createElement('script');
	elem_script.src =  "https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js";
		// https://developers.google.com/speed/libraries/devguide#jquery
	
	// ロード完了時のイベントを定義
	var load_complete = false;
	elem_script.onload = function(){
		load_complete = true;
	};
	
	// HEADにscriptタグを追加
	elem_head.appendChild( elem_script );
	
	// scriptのロード完了まで待つ
	while( load_complete ){
		WScript.Sleep( 500 );
	}
	
	// $を評価可能になるまで待つ
	while( ! ie.document.parentWindow.$ ){
		WScript.Sleep( 500 );
	}

	// グローバルで参照を定義
	$ = ie.document.parentWindow.$;

	//log("IEにjQuery注入完了");
	
	return;
}


// IE上でjQueryを使う
/*function $( s ){
	return ie.document.parentWindow.$( s, ie.document );
}
*/



// 遷移先の全ページ内でjQueryを有効化する
always_enable_JQuery = false;
function ie_enableJQuery(){
	always_enable_JQuery = true;
}



// ------------------ IEの基本操作 ------------------



// IE起動
function getIE()
{
	var ie = WScript.CreateObject("InternetExplorer.Application")
	ie.Visible = true;
	ie_goto_url( ie, "http://www.google.co.jp/" );
		//log("ブラウザでのアクセスを開始します。");
	
	return ie;
}


// IEがビジー状態の間待ちます
function ie_wait_while_busy( ie, _url )
{   
	var timeout_ms      = 45 * 1000;
	var step_ms         = 100;
	var total_waited_ms = 0;
	
	while( ( ie.Busy ) || ( ie.readystate != 4 ) )
	{
		WScript.Sleep( step_ms );
		
		// タイムアウトか?
		total_waited_ms += step_ms;
		if( total_waited_ms >= timeout_ms )
		{
			/*log(
				"警告:タイムアウトのため,リロードします。("
				+ ie.LocationURL
					// http://blog.livedoor.jp/programlog/archives/298228.html
				+ ")"
			);*/
			
			// どこかに移動中なら,そこへの移動を再試行
			if( _url )
			{
				//log( _url + "への遷移を再試行");
				ie_goto_url( ie, _url );
			}
			else
			{
				log( "リロード中");
				
				// 移動先が明示されていなければリロード
				ie.document.location.reload( true );
				ie_wait_while_busy( ie );
			}
			
			break;
		}
	}

	WScript.Sleep( 1000 )
}
	// http://d.hatena.ne.jp/language_and_engineering/20100310/p1
	// http://d.hatena.ne.jp/language_and_engineering/20100403/p1


// ページを移動
function ie_goto_url( ie, url ){
	//log("アクセスします:" + url);
	ie.Navigate( url );
	ie_wait_while_busy( ie, url );
	//log("ページを開きました。");
	
	// IEで常にjQueryを使うか
	if( always_enable_JQuery ){
		ie_inject_jquery( ie );
	}
}


// デバッグ用
function log(s){
	WScript.Echo(s);
}



// ------------------メイン処理 ------------------



// IE起動
var ie = getIE();

// 今後の遷移先の全ページ内でjQueryによるスクレイピングを有効化
ie_enableJQuery();

// 遷移
ie_goto_url( ie, yt_url );


// 何ページまで読み込むか
var pages_max = 50;//100;

// 読み込みボタンが現れるまで何秒待つか
var wait_for_next_ms = 20 * 1000;

// ページを読み込み続ける
var page_cnt = 1;
var keep_loading_next_page_flag = true;
while( 
	keep_loading_next_page_flag
	&&
	( page_cnt < pages_max )
){
	
	// 待機時間
	var waited_ms = 0;
	
	// ボタンが現れるまで待つ
	var next_button;
	var keep_waiting_flag = true;
	while( 
		keep_waiting_flag 
		&& 
		( waited_ms <= wait_for_next_ms )
	){
		// もっと読み込みボタン
		next_button = $("button.browse-items-load-more-button");
		
		// ボタンがあるか
		if( next_button.size() > 0 ){
			keep_waiting_flag = false;
		}else{
			waited_ms += 1000;
			WScript.Sleep(1000);
		}
	}
	
	// ボタンがあれば
	if( next_button.size() > 0 ){
		// もっと読み込む
		WScript.Sleep(5000);
		log("読み込みます・・・(" + (page_cnt+1) + "ページ目)<br>" );
		next_button.get(0).click();
		WScript.Sleep(5000);
		
		page_cnt++;
		
	}else{
		// ボタンが出なくなればそこまで
		keep_loading_next_page_flag = false;
	}
	
}

log("ページの追加読み込みを終了");



// スクレイピング実行
var links = $("tbody#pl-load-more-destination tr.pl-video td.pl-video-title a.pl-video-title-link");
	log("個数:" + links.length);



var trs = links.map(function(){ 
		return ( "<tr><td>"
			+ $.trim( $(this).text() ) 
				// HTMLエスケープ済み
				// http://semooh.jp/jquery/api/attributes/text/val/
			
			+ "</td><td>"
			+ $(this).attr("href")
			+ "</td></tr>"
		); 
	})
.get().join("\n")
;



log(
	"<table border=1><tbody>"
		+ trs
		+ "</tbody></table>"
);

起動用のバッチ


YT.bat

@echo off

cscript ie_jq.js > out.html

pause

参考資料

jQueryを使ったサクサクWebスクレイピングのサンプルコード (WSH/JScriptバッチでIEを自動操作する時の $ セレクタが柔軟すぎる!)
http://d.hatena.ne.jp/language_and_engineering/20150711/WebScrapingByWshJscriptWithJquerySelectors