您的位置:首页 > Web前端 > JavaScript

原生javascript爬取网页内所有的js文件并且排序

2016-10-24 12:52 363 查看
在工作当中需要抓取70000多个网页的内容,并统计出现次数最多的js文件,刚开始的时候觉得可以搞定,但是有几个问题我不得不理清思路,如果你要用原生js写爬虫爬虫抓取别人的网页,首先要做几件事:

1.把每个url地址放在一个文件中;

2.用js读取每个url地址;

3.根据每个url地址获取该网页的内容;

4.根据内容正则匹配出所有的
<script src=""><script>
中的js的文件

5.把得到的文件入栈到数组,统计每个元素出现的次数;

6.排序!

这个是大神给我说的方法,你们可能不知道这个程序怎么执行:

进入cmd命令界面,切换到该js文件目录,输入cscipt,这个程序就可以跑起来了,不过首先你要在合适的目录存放我们爬取的url地址,将他们按照每一行进行排列,写错了可不能请求出正确的内容啊!

首先:是读url文件的函数:

function readfile(url) {
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.opentextfile(url, 1, true);
var lineNum = 0;
var urlArr = [];
while (!f.AtEndOfStream) {
lineNum++;
var line = f.Readline();
var data = get("http://www." + line); //首页的文档
WScript.echo(lineNum + " =======> " + line);
WScript.echo('urlArr.length=====>:'+ urlArr.length);
if (data != null) {
var matchs = data.match(/<iframe[^>]+src="([^"]+)"/gi);
var srcReg = /[\'\"]([^\'\"]*)[\'\"]?/i; //取出src里面的内容
if (matchs != null) {
for (var i = 0; i < matchs.length; i++) {
var urlStr = matchs[i].match(srcReg)[0];
urlStr = urlStr.replace(/[\'\"']/g, '');
if (-1 != urlStr.indexOf('//')) { //如果字符串中//,拼上http://
WScript.echo("http:" + urlStr);
data += get("http:" + urlStr);
}
}
}
var url = data.match(/[\'\"]?([^\'\"]*)\.js[\'\"]?/gi);
WScript.echo(url)
if (isNaN(url) != 0 && url.length > 0) {
for (var i = 0; i < url.length; i++) {
urlArr.push(url[i])
}
}
}
}
f.close();
return urlArr;
}


然后根据里面的get请求,抓取网页所有的数据。

var req = new ActiveXObject("Msxml2.ServerXMLHTTP");
function get(url) {
try {
req.setTimeouts(10000, 10000, 10000, 30000);
req.open("GET", url, false);
req.send(null);
// return bytes2BSTR(req.responseBody);    //req.responseBody;
return req.responseText;
} catch (e) {
WScript.echo("[-] " + url + " with error code: " + e.number + ", " + e.message);
}
return "";
}


然后统计数组中每个元素(就是每个网页中所有js)出现的次数,这可是一个好几万行的数组;

//数组中每个元素出现的次数
function arrCheck(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
var temp = arr[i];
var count = 0;
for (var j = 0; j < arr.length; j++) {
if (arr[j] == temp) {
count++;
arr[j] = -1;
}
}
if (temp != -1) {
var arr2 = [];
arr2.push(count)
arr2.push(temp)
newArr.push(arr2)
}
}
return newArr;      //返回数组形如
}


最后按照二维数组的第二个键降序排列,并且通过管道命令输出到本地文档上:

var urlArr = readfile("E:\\1url.txt");
// 根据二维数组的第二个键降序排列
urlArr = arrCheck(urlArr);
urlArr.sort(function(x, y) {
return y[0] - x[0];
})
WScript.echo('====================================================');
for (var i=0; i<urlArr.length; i++) {
WScript.echo(urlArr[i]);
}
WScript.echo(urlArr.length);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐