最近为了写论文,要大批量收集慕课网的相关用户数据(因为用户个人主页是公开的),故而写了一个插件进行收集。需要在慕课网控制台输入。最后收集了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大批量收集网站数据的更多相关文章

  1. Libscore – 收集 JavaScript 库的使用数据

    Libscore 扫描网络上成千上万的网站,收集统计 JavaScript 库的使用数据.在搜索框中,输入关键词,例如 jQuery, Modernizr, $.ui 或者 $.fn.fancybox ...

  2. WebScraper for Mac(网站数据抓取软件) 4.10.2

    WebScraper Mac版是一款Mac平台上通过使用将数据导出为JSON或CSV的简约应用程序,WebScraper Mac版可以快速提取与某个网页(包括文本内容)相关的信息.WebScraper ...

  3. 使用Javascript监控前端相关数据

    项目开发完成外发后,没有一个监控系统,我们很难了解到发布出去的代码在用户机器上执行是否正确,所以需要建立前端代码性能相关的监控系统. 所以我们需要做以下的一些模块: 一.收集脚本执行错误 functi ...

  4. awbeci—一个帮助你快速处理日常工作的网址收集网站

    大家好,我是awbeci作者,awbeci网站是一个能够快速处理日常工作的网址收集网站,为什么这样说呢?下面我将为大家介绍这个网站的由来,以及设计它的初衷和如何使用以及对未来的展望和计划,以及bug反 ...

  5. [Python爬虫] 之一 : Selenium+Phantomjs动态获取网站数据信息

    本人刚才开始学习爬虫,从网上查询资料,写了一个利用Selenium+Phantomjs动态获取网站数据信息的例子,当然首先要安装Selenium+Phantomjs,具体的看 http://www.c ...

  6. 爬取表格类网站数据并保存为excel文件

    本文转载自以下网站:50 行代码爬取东方财富网上市公司 10 年近百万行财务报表数据 https://www.makcyun.top/web_scraping_withpython6.html 主要学 ...

  7. JavaScript如何检查网站是可以访问

    <html><head><title>JavaScript如何检查网站是可以访问</title> <script> //JavaScript ...

  8. 抓取网站数据不再是难事了,Fizzler(So Easy)全能搞定

    首先从标题说起,为啥说抓取网站数据不再难(其实抓取网站数据有一定难度),SO EASY!!!使用Fizzler全搞定,我相信大多数人或公司应该都有抓取别人网站数据的经历,比如说我们博客园每次发表完文章 ...

  9. DEDECMS网站数据备份还原教程

    备份织梦网站数据 dedecms备份教程 进入DedeCms后台 -> 系统 -> 数据库备份/还原 备份文件在\data\backupdata 下载数据库备份资料\data\backup ...

随机推荐

  1. Jenkins SSH timeout

    问题如下: Started by user carzone Building -test SSH: Connecting from host [jenkins232] SSH: Connecting ...

  2. YII 1.0 验证码

    public function actions(){ return array ( ‘captcha’=> array( ‘class’=> ‘CCatpchaAction’, ‘heig ...

  3. php 常用代码段

    1.写文件 $fp = fopen("jsapi_ticket.json", "w+"); fwrite($fp, $str); fclose($fp); 2. ...

  4. iOS 之 绘图简介

    iOS 实现图形编程主要有三种技术:UIKit.Core Graphics.OpenGL. 绘图需要在图形环境中进行,图形环境分为三种:屏幕图形环境.off screen 位图环境和PDF图形环境.在 ...

  5. 选择移动web开发框架研究——有mui、frozenui以及Sencha Touch等

    纯粹的总结一下移动web开发框架,移动 web开发框架有jQuery Mobile .Sencha Touch等等,他们都来源于web开发,是成熟的框架,jQuery Mobile出自于jQuery家 ...

  6. js原生继承之——类式继承实例(推荐使用)

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  7. ORA-39002 ORA-39070 ORA-29283 ORA-06512 ORA-29283

    记一次expdp导出失败,报错如下 ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-29283: in ...

  8. Canvas文本绘制

    文字绘制: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. 巧用css text-indent减小中文标点符号的占位大小

    由于设计需要,我们的页面中经常会有如下效果: 可是我们实现出来的效果确实这样的: 看起来两行文本没有对齐嘛,仔细检查后原来是[字符的原因,因为是中文标点符号占半个字的位置.不信?选中下汉字标点符号看一 ...

  10. HTTPS=HTTP + SSL / TLS

    以下的两个链接作为本次编辑的参考 https://www.bennythink.com/school-1.htmlhttps://www.bennythink.com/school-2.html 应一 ...