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

6 篇文章 0 订阅
1 篇文章 0 订阅

在工作当中需要抓取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);
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值