最近为了写论文,要大批量收集慕课网的相关用户数据(因为用户个人主页是公开的),故而写了一个插件进行收集。需要在慕课网控制台输入。最后收集了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. Java读取其他jar包里的配置文件

    最近要做个东西,需要自己控制数据库的事物,项目封装的框架,实在是提不起去阅读的兴趣, 就想直接去读框架的底层实现里面的数据连接的配置文件(如:Url,port,username,password等), ...

  2. PHP分页类,支持自定义样式,中间5页

    <?php //namespace Component; /** * 2016-3-27 * @author ankang */ class Page { private $ShowPage; ...

  3. jQuery 获取和设置type为hidden的input的值

    HTML代码 <input type="hidden" name="type" id="type" value="1&quo ...

  4. 批量转换引擎为innodb

    [root@HE1 ~]# catconvert_Storage_Engine.sh #/bin/bash #FileName:Convert_Storage_Engine.sh #Desc:Conv ...

  5. 一步一步Asp.Net MVC系列_权限管理设计

    http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html

  6. 如何使用Ninja快速编译LLVM和Clang

    在使用Make工具编译LLVM是非常耗时的.往往需要三四个小时.但是使用goolge开源的ninja编译LLVM只需要10到20分钟. 本文以llvm3.3为例,演示在linux上编译和安装过程. 第 ...

  7. AutoItLibrary安装报错(robotframework)解决

    官网下载地址:http://www.softpedia.com/get/Programming/Components-Libraries/AutoItLibrary.shtml Csdn下载地址:ht ...

  8. [笔记]A Practical Guide to Support Vector Classi cation

    <A Practical Guide to Support Vector Classication>是一篇libSVM使用入门教程以及一些实用技巧. 1. Basic Kernels: ( ...

  9. http-server 使用介绍

    做一个项目的时候需要服务环境,又不想使用apache,php,于是找到一款比较简单的易用的webserver 就是http-server 首先介绍一个怎么使用吧,http-server 是基于node ...

  10. jQuery 监听元素内容变化的方法

    我们可以用onchange事件来完成元素值发生改变触发的监听.但是 onchange 比较适用于<input>.<textarea> 以及 <select> 元素. ...