自分が高く評価した動画の一覧を取得するバッチ。
ソースコード
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