用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 ...
随机推荐
- PHP导入导出Excel方法
看到这篇文章的时候,很是惊讶原作者的耐心,虽然我们在平时用的也 有一些,但没有作者列出来的全,写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xm ...
- webx学习
webx框架学习指南 http://openwebx.org/docs/Webx3_Guide_Book.html webx学习(一)——初识webx webx学习(二)——Webx Framewor ...
- 一个简单的Java集合范围过滤的多个方式对比
在一个项目里面有这么一个技术需求: 1.集合中元素个数,10M 2.根据上限和下限从一个Set中过滤出满足要求的元素集合. 实际这个是个很典型的技术要求, 之前的项目也遇见过,但是因为当时的类库不多, ...
- Linux中的zero-copy技术
本文是对参考文章重要部分的摘录,同时进行简单地总结. 零拷贝技术的相关背景知识 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的 ...
- Js中Array数组学习总结
第一次写博客...有点方... 小白一枚(是真的小白),自学前端,下面来说说我在学习过程中总结的一些数组操作,如果说哪有错误,请各位大神多多指出,小的虚心接受. 引用类型分为Object类型(所谓的对 ...
- loadrunner Analysis :SLA(Service Level Agreement服务水平协议)
SLA是为负载场景定义的具体目标,用于与实际负载结果比较,确定系统是否达到性能目标. 1.1.1 设置SLA(以Transaction Response Time(Average)为例) 可以 ...
- python实现二分查找与冒泡排序
二分查找,代码如下: def binarySearch(l, t): low, high = 0, len(l) - 1 while low < high: 'print low, high' ...
- (二)Hololens Unity 开发入门 之 Hello HoloLens~
学习源于官方文档 微软官文~ 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要 ...
- webpack入门+react环境配置
小结放在前:这篇文章主要是为下一篇的react提前铺好路,webpack是一个前端资源模块化管理和打包工具,说白了就是方便我们管理自己的常用的一些代码,比如你开发中用到sass以及jade同时用到es ...
- 【LeetCode题解】数组Array
1. 数组 直观地看,数组(Array)为一个二元组<index, value>的集合--对于每一个index,都有一个value与之对应.C语言中,以"连续的存储单元" ...