標籤:網站社交 ast 沒有 name 控制台 經驗值 getc pre code
最近為了寫論文,要大批量收集慕課網的相關使用者資料(因為使用者個人首頁是公開的),故而寫了一個外掛程式進行收集。需要在慕課網控制台輸入。最後收集了3000多份資料。
/*
收集項 |
收集標準 |
使用者編號 |
慕課網使用者編號是七位元遞增的,範圍在5000000以內。故而本次收集將在1000000至5000000內分區段進行資料的隨機收集。 |
學習時間長度 |
慕課有記錄使用者的總共學習時間長度,如110時34分。為方便後期統計,將該資料轉化為以分鐘為單位的資料。 |
積分 |
積分反映的是使用者參與網站社交的程度。 |
經驗 |
相比學習時間長度,經驗更能直接反映課程完成程度。 |
學習課程數 |
為避免使用者參加課程而沒有進行學習,課程學習數以學習進度超過5%的課程為準入標準。 |
平均完成度 |
指學生課程的平均完成度。 |
完成課程數 |
為課程完成度80%及以上的課程。 |
參加路徑數 |
慕課網的學習路徑的參與數目。 |
路徑完成度 |
學習路徑的完成程度。 |
*/var userInfo = function(user,link,i){ var user = user; var link = link; this.name = i; var _this_ = this; this.getBasicInfo(user); this.getCourseNum(user); this.getRoute(user,link); setTimeout(function(){ console.log(_this_.name+"\t"+_this_.learnTime+"\t"+_this_.credit+"\t"+_this_.mp+"\t"+_this_.CourseNum+"\t"+_this_.learnAve+"\t"+_this_.finish+"\t"+_this_.routeNum+"\t"+_this_.routeAve); user.close(); },10000);};userInfo.prototype ={//便捷存取子;getElem : function(user,className,tag) { var infor =user.document.getElementsByClassName(className)[0].getElementsByTagName(tag)[0].innerHTML; return infor; },//擷取基本資料:名字、學習時間長度、積分、經驗值。getBasicInfo:function(d){ var user = d; //get time; var time =this.getElem(user,"u-info-learn","em"); var cutHour = /\d+(?=\W{2})/g; var hour = parseInt(time.match(cutHour))*60; var cutMinute = /\d+(?!\W{2})/g; var minute = parseInt(time.match(cutMinute)); if(isNaN(hour)){ var learnTime = minute; }else{ var learnTime = hour+minute; } this.learnTime = learnTime; //get credit; var credit = parseFloat(this.getElem(user,"u-info-credit","em")); this.credit = credit; //get mp; var mp = parseFloat(this.getElem(user,"u-info-mp","em")); this.mp = mp; },//獲得課程數量和課程完成度getCourseNum:function(d){ var self = this; var user = d; var CourseNum = 0, learnSum = 0, finish = 0; //獲得一個頁面的課程數量和完成度 function getOnepage(obj){ if(obj.document.getElementsByClassName("course-one").length > 0){ var course = obj.document.getElementsByClassName("course-one"); for(i = 0;i<course.length;i++){ var hasLearn = course[i].getElementsByClassName("i-left")[0].innerHTML, cutWord = /\W\W/g; var hasLearn =parseFloat(hasLearn.replace(cutWord,"")); if(hasLearn > 5){ CourseNum = CourseNum + 1; learnSum = learnSum + hasLearn; if(hasLearn > 80){ finish = finish + 1; } }; }; self.CourseNum = CourseNum; if(CourseNum !== 0){ self.learnAve = (learnSum/CourseNum).toFixed(2); } self.finish = finish; } }; //擷取當前頁面 getOnepage(user); //擷取其他頁面 if(user.document.getElementsByClassName("text-page-tag").length > 0){ var pages = user.document.getElementsByClassName("text-page-tag"); if(pages.length > 1){ for(i=1;i<pages.length;i++){ !function(i){ var page = window.open(pages[i].getAttribute("href")); setTimeout(function get(){ if(page.document.getElementsByClassName("course-one").length > 0){ getOnepage(page); page.close(); self.CourseNum = CourseNum; self.learnAve = (learnSum/CourseNum).toFixed(2); self.finish = finish; }else{ console.log("page" + i +"didn‘t load!"); } },5000);//要若有些頁面沒有在4S內開啟,導致無法取值怎麼辦? }(i); }; }; } //擷取其他頁面列表 if(user.document.getElementsByClassName("page").length > 0){ var lastPage =user.document.getElementsByClassName("page")[0].lastChild.getAttribute("href"); var allPage = parseInt(lastPage.match(/\d$/)); if(allPage>7){ var otherLink = lastPage.match(/^.*=(?=\d)/g); for(i=8;i <= allPage;i++){ !function(i){ var page = window.open(otherLink+i); setTimeout(function get(){ if(page.document.getElementsByClassName("course-one").length > 0){ getOnepage(page); page.close(); self.CourseNum = CourseNum; self.learnAve = (learnSum/CourseNum).toFixed(2); self.finish = finish; }else{ console.log("page" + i +"didn‘t load!"); } },4000);//記得找個好的網路,防止有些頁面沒有在4S內開啟,導致無法取值。 }(i); }; }; } },//擷取參加路徑數getRoute : function(d,link){ var user = d; var self = this; var currPage = link; var openPage = window.open(currPage.replace("courses","plans")) setTimeout(function(){ if(openPage.document.getElementsByClassName("plans-item").length > 0){ var route = openPage.document.getElementsByClassName("plans-item"); var routeNum = route.length; var routeLearn = openPage.document.getElementsByClassName("plans-list-progress"); var routeSum = 0,learnSum = 0; for(i=0;i<routeNum;i++){ var hasLearn = parseFloat(routeLearn[i].innerHTML.replace(/\W+/,"")); if(hasLearn>2){ routeSum = routeSum + hasLearn; learnSum +=1; }; }; if(learnSum > 0 ){ routeAve = routeSum/learnSum; self.routeAve = routeAve; } self.routeNum =routeNum; }; openPage.close(); },5000) }};
//開啟頁面var n = Math.round(Math.random()*1000000+4000000);//取3000000-4000000之間的隨機數var min = n;function openLink(){ if(n< min+1000){ //取1000份資料 var link = "http://www.imooc.com/u/"+ n +"/courses"; var user = window.open(link); setTimeout(function(){ if(user.document.getElementsByClassName("user-name").length > 0){ new userInfo(user,link,n); }else{ console.log(n+" page didn‘t exit!") }; },4000); setTimeout(function(){n = n+1;openLink();},4000) }};openLink();
用Javascript大批量收集網站資料