原生javascript爬取网页内所有的js文件并且排序
2016-10-24 12:52
363 查看
在工作当中需要抓取70000多个网页的内容,并统计出现次数最多的js文件,刚开始的时候觉得可以搞定,但是有几个问题我不得不理清思路,如果你要用原生js写爬虫爬虫抓取别人的网页,首先要做几件事:
1.把每个url地址放在一个文件中;
2.用js读取每个url地址;
3.根据每个url地址获取该网页的内容;
4.根据内容正则匹配出所有的
5.把得到的文件入栈到数组,统计每个元素出现的次数;
6.排序!
这个是大神给我说的方法,你们可能不知道这个程序怎么执行:
进入cmd命令界面,切换到该js文件目录,输入cscipt,这个程序就可以跑起来了,不过首先你要在合适的目录存放我们爬取的url地址,将他们按照每一行进行排列,写错了可不能请求出正确的内容啊!
首先:是读url文件的函数:
然后根据里面的get请求,抓取网页所有的数据。
然后统计数组中每个元素(就是每个网页中所有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);
相关文章推荐
- 原生javascript添加引用js文件
- iOS 基于JavaScriptCore 不等webView加载完毕就交互,网页获取原生内容。 webView的高级用法之JS交互,js与oc的相互调用
- 原生js如何获取当前所加载网页的文件路径和名称
- javascript/js 原生动态引入外部css文件及动态插入css代码片段
- 用JavaScript获取网页中的js、css、Flash等文件
- 用JavaScript获取网页中的js、css、Flash等文件
- 通过a4j:jsFunction 调用原生的javascript方法,并且共享和传递后台bean里面的变量
- JS与Objective-C交互(网页与原生交互---使用JavaScriptCore)
- JavaScript的执行原理,很多人都理解错了:在js被加载后,其实就将js代码执行了一遍,在内存中创建了所有js文件中的变量。而不是激发了某个js方法后,再去相应的js文件中去执行,是去内存中执行
- C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断
- javascript/js 原生动态引入外部css文件及动态插入css代码片段
- javascript/js 原生动态引入外部css文件及动态插入css代码片段
- javascript/js 原生动态插入外部js文件及动态插入js代码片段,兼容ie
- 原生JavaScript按需加载JS文件
- [转]在网页中加入声音文件,并且用JavaScript对其进行播放控制
- 一个JS文件与一条Java_script语句搞掂网站所有网页的繁简转换[转贴]
- 用javascript按需加载.js和.css文件
- 网页中动态加载js文件
- 用js一招破解所有网页的加密源代码的方法
- JavaScript基础之引用外部JS文件