最近为了写论文,要大批量收集慕课网的相关用户数据(因为用户个人主页是公开的),故而写了一个插件进行收集。需要在慕课网控制台输入。最后收集了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. iOS 之 设置横竖屏及ViewWillAppear及视图与导航控制器嵌套时的不同反应

    设置横竖屏不成功,可能跟所在导航控制器有关 视图没有导航控制器时,又有可能不调用ViewWillAppear,这是我遇到的问题.

  2. Swift分割字符串

    var str_componets = "I Like Swift " str_componets.componentsSeparatedByString(" " ...

  3. js原生之一个面向对象的应用

    function IElectricalEquipment() { }        IElectricalEquipment.prototype = {            poweron: fu ...

  4. jQuery插件Flot实战Demo

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

  5. js如何准确获取当前页面url网址信息

    1.window.location.href(设置或获取整个 URL 为字符串) var test = window.location.href;alert(test);返回:http://i.cnb ...

  6. ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...

  7. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍   我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...

  8. overflow:hidden 你所不知道的事

    overflow:hidden 你所不知道的事 overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. ...

  9. Mac系统安装Aircrack-ng破解附近wifi密码(1)

    第一步, 安装macport, 安装Xcode 安装macport macport 是一个工具 管理软件包的一个工具, 我们也可以通过别的方式安装Aircrack-ng, 但是通过macport安装A ...

  10. Accessibility辅助功能--一念天堂,一念地狱

    0x00什么是Accessibility(辅助功能) 考虑到部分用户不能很好地使用Android设备,比如由于视力.身体.年龄方面的限制,造成阅读内容.触控操作.声音信息等方面的获取困难,Androi ...