JS是个神奇的语言,借助Node.js的后端环境,咱们能够进行相应的爬虫开发,如这篇 基于Node.js实现一个小小的爬虫javascript
但搭建后台环境始终略为麻烦,拿到一台新电脑,不用配环境,可不能够直接在浏览器客户端直接实现呢?html
能够能够,这里就简单地说一下在浏览器客户端实现的爬虫抓取页面数据java
爬虫,简单地说就是发一个请求,而后按必定逻辑解析获取到的数据。ajax
在Node环境下,能够用Request模块请求一个地址,获得返回信息,再用正则匹配数据,或者用Cheerio模块包装-方便定位相关的标签项后端
在浏览器环境下,也相似,能够用标签的src属性或Ajax请求一个地址,获得返回信息,再用正则匹配数据,或者用jQuery模块包装-方便定位相关的标签项浏览器
实现的本质都是打开浏览器的开发者工具,写一段JS代码注入到页面中,而后让相关代码自执行地址请求,再经过代码处理返回的数据app
打开Chrome浏览器的开发者工具,选择面板中的 sources 部分,选择二级菜单的 script snippets 部分,而后右键新建一个脚本,在右方输入想注入的代码异步
而后右键script snippets脚本运行(或者使用快捷键 Ctrl + Enter 运行)就能够开始注入,并能够在下方 console 部分看到相应的结果函数
注入JS代码的方式是使用一个script标签,定义src指向的脚本地址,或者在标签中直接定义JS代码工具
在浏览器端的爬虫实现,这里分为两个方面:一个是处理纯页面的请求,一个是处理Ajax的异步请求
要在当前页面直接请求一个纯页面,咱们能够用 iframe 标签辅助,好比我想获取博客园这个分类下的博文信息
找到这个页面的连接 http://www.cnblogs.com/cate/108703/,这个博文标题对应的class为 .post_item
打开Chrome,在某个页面中,打开开发者工具,在上述说的位置输入这段代码
var script = document.createElement('script'); script.type = 'text/javascript'; var iframe = document.createElement('iframe'); // 使用到了ES6的新字符串,方便看代码 var script_code = ` var doc = document.getElementById('my_iframe').contentWindow.document; console.log($(doc).find('.post_item').length); `; // 插入代码 function insertMyScript() { script.appendChild(document.createTextNode(script_code)); document.body.appendChild(script); } iframe.src = 'http://www.cnblogs.com/cate/108703/'; iframe.id = 'my_iframe'; iframe.onload = function() { insertMyScript(); }; document.body.appendChild(iframe);
代码很简单,直接先经过iframe的src加载须要的页面,iframe的内容加载成功再插入进行数据解析的逻辑
默认开发者工具是不支持jQuery的,但假如当前页面拥有jQuery,咱们就能够直接使用了,若是没有,能够先插入一段引用本地JQ库的代码
如此,已经能够解析到页面内容
Ajax的请求处理也相似
在分析页面数据的获取时,有时候会发现数据是经过Ajax的异步JSON来获取的,咱们相应的也使用这种异步方式
用原生的Ajax未免代码量太多,能够直接借助JQ的实现
好比这个页面http://www.ciweishixi.com/forum/ins-407,评论数太多,进行了分页。咱们想找到包含某些关键字的页,方便定位
这个页面的分页请求是异步请求,因此注入代码进行循环遍历请求,解析返回的JSON数据便可
var script = document.createElement('script'); script.type = 'text/javascript'; var script_code = ` var url = 'http://www.ciweishixi.com/forum/comm-407-', keyWords = '广州'; for (var i = 1; i < 200; ++i) { (function(_i) { $.ajax({ url: url + _i, type: 'post', success: function(re) { var str = 'Searching page ' + _i; if (re.indexOf(keyWords) !== -1) { str += ': found !'; } console.log(str); }, error: function(e) { console.log(e); } }); })(i); } `; script.appendChild(document.createTextNode(script_code)); document.body.appendChild(script);
至于这个错乱的顺序,是由于Ajax的异步特色,想要按顺序控制请求,能够加入一些Promise机制,或者用Generator生成器函数来实现一下便可
更多的用法自行去发掘吧