用Javascript大批量收集网站数据
最近为了写论文,要大批量收集慕课网的相关用户数据(因为用户个人主页是公开的),故而写了一个插件进行收集。需要在慕课网控制台输入。最后收集了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大批量收集网站数据的更多相关文章
- Libscore – 收集 JavaScript 库的使用数据
Libscore 扫描网络上成千上万的网站,收集统计 JavaScript 库的使用数据.在搜索框中,输入关键词,例如 jQuery, Modernizr, $.ui 或者 $.fn.fancybox ...
- WebScraper for Mac(网站数据抓取软件) 4.10.2
WebScraper Mac版是一款Mac平台上通过使用将数据导出为JSON或CSV的简约应用程序,WebScraper Mac版可以快速提取与某个网页(包括文本内容)相关的信息.WebScraper ...
- 使用Javascript监控前端相关数据
项目开发完成外发后,没有一个监控系统,我们很难了解到发布出去的代码在用户机器上执行是否正确,所以需要建立前端代码性能相关的监控系统. 所以我们需要做以下的一些模块: 一.收集脚本执行错误 functi ...
- awbeci—一个帮助你快速处理日常工作的网址收集网站
大家好,我是awbeci作者,awbeci网站是一个能够快速处理日常工作的网址收集网站,为什么这样说呢?下面我将为大家介绍这个网站的由来,以及设计它的初衷和如何使用以及对未来的展望和计划,以及bug反 ...
- [Python爬虫] 之一 : Selenium+Phantomjs动态获取网站数据信息
本人刚才开始学习爬虫,从网上查询资料,写了一个利用Selenium+Phantomjs动态获取网站数据信息的例子,当然首先要安装Selenium+Phantomjs,具体的看 http://www.c ...
- 爬取表格类网站数据并保存为excel文件
本文转载自以下网站:50 行代码爬取东方财富网上市公司 10 年近百万行财务报表数据 https://www.makcyun.top/web_scraping_withpython6.html 主要学 ...
- JavaScript如何检查网站是可以访问
<html><head><title>JavaScript如何检查网站是可以访问</title> <script> //JavaScript ...
- 抓取网站数据不再是难事了,Fizzler(So Easy)全能搞定
首先从标题说起,为啥说抓取网站数据不再难(其实抓取网站数据有一定难度),SO EASY!!!使用Fizzler全搞定,我相信大多数人或公司应该都有抓取别人网站数据的经历,比如说我们博客园每次发表完文章 ...
- DEDECMS网站数据备份还原教程
备份织梦网站数据 dedecms备份教程 进入DedeCms后台 -> 系统 -> 数据库备份/还原 备份文件在\data\backupdata 下载数据库备份资料\data\backup ...
随机推荐
- @pathvariable 注解
1.4. @PathVariable 注解 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义 通过 @PathVar ...
- 详解JavaScript中的事件处理
在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后 ...
- delphi edit编辑框使用
Delphi编辑框Edit的用法 http://wenku.baidu.com/link?url=oKKm0VFBXexqiWt9ZNB8WxFGzwjJqRBM3ohrAy6GSMmOmwIzSWP ...
- Pomelo的监控模块
对服务器的监控和管理有三个主体:master,monitor,client:master负责收集所有服务器的信息,下发对服务器的操作指令.monitor负责上报服务器状态,并对master的命令作出反 ...
- Linux下添加shell脚本使得nginx日志每天定时切割压缩
Linux下添加shell脚本使得nginx日志每天定时切割压缩一 简介 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常 ...
- MIPS 跳转指令BAL vs JAL
今天调试程序,发现在windows和Linux下,diab编译的结果不一样,一个能跑一个不能跑.最后定位到了函数跳转上. 程序代码里的函数跳转写的是BAL,在windows下编译结果正常,在Linux ...
- CSS 文件的4种引入方式
(1)链接式 : 在网页的<head></head>标签对中使用<link>标记来引入外部样式表文件,使用html规则引入外部css (用得比较多) : < ...
- windows服务用脚本无法启动
1.创建windows服务工程 工程名:ServiceDemo 2.添加加载启动及卸载服务脚本 加载及启动批处理: @echo off if exist "%SystemRoot%/Micr ...
- TCP&UDP
TCP(传输控制协议) 建立连接,形成传输数据的通道 在连接中进行大数据传输(数据大小不受限制) 通过三次握手完成连接,是可靠协议,安全送达(三次握手向服务器发送请求,响应请求回复,发送数据) 必须建 ...
- nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战
前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏.因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64 ...