YouTubeの高く評価した動画(Liked videos)のデータをCSVにするJavaScriptスクリプトを書きましたので少し紹介します。
機能:
高く評価した動画のページの動画リストを、タイトル,URLの形式でCSVにして保存する。
不具合:
途中の動画からURLが取れなくなる。これはyoutubeの仕様みたいなのでどうしようもない。
順番がバラバラ。
使い方:
高く評価した動画のページに行って、chromeデベロッパーツールを開いて以下ソースコードをコピペ。
追記:やっぱり最後のconsole.save(csv,'result.csv')
だけ数秒時間おいてから実行しなきゃダメでした。
function getElementsByXPath(xpath, parent)
{
let results = [];
let query = document.evaluate(xpath,
parent || document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i=0, length=query.snapshotLength; i<length; ++i) {
results.push(query.snapshotItem(i));
}
return results;
}
(function(console){
console.save = function(data, filename){
if(!data) {
console.error('Console.save: No data')
return;
}
if(!filename) filename = 'console.json'
if(typeof data === "object"){
data = JSON.stringify(data, undefined, 4)
}
var blob = new Blob([data], {type: 'text/json'}),
e = document.createEvent('MouseEvents'),
a = document.createElement('a')
a.download = filename
a.href = window.URL.createObjectURL(blob)
a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
a.dispatchEvent(e)
}
})(console)
var absolutePath = function(href) {
var link = document.createElement("a");
link.href = href;
return link.href;
}
var xpath = '//*[@id="video-title"]' ;
var csv ;
for (i = 1; getElementsByXPath(xpath).length; i++) {
text = getElementsByXPath(xpath)[i].getAttribute("title");
text = text.replace(/,/g, "、");
text = '"' + text + '"'
csv += text
csv += ','
// csv += "\n" ;
text = getElementsByXPath(xpath)[i].getAttribute("href")
text = absolutePath(text) ;
text = text.replace(/,/g, "、");
text = '"' + text + '"'
csv += text
// csv += ','
csv += "\n" ;
}
console.save(csv,'result.csv')
おまけ:Liked videosをクリックするスクリプト(書いたけど使わなかった)
for (i=0; i < document.querySelectorAll("#endpoint").length ; i++ ){
// console.log(i) ;
// console.log(document.querySelectorAll("#endpoint")[i].getAttribute('title')) ;
if (document.querySelectorAll("#endpoint")[i].getAttribute('title').match(/Liked videos/) == null){
} else {
// console.log(i) ;
document.querySelectorAll("#endpoint")[i].click()
}
}