使用浏览器内核爬取OTA数据
2015-10-01 22:56
561 查看
因为业务需要,所以会有一些爬虫的设计需求。
目前这一部分的内容都是外包项目,领导说需要根据实际情况,研究一下自己研发的可能性。
但是绝大部分这些OTA网站都做了大量的异步加载,并且接口都做了加密处理。
也就是说,我们从控制台上面拦截下来的请求数据都是加密的数据,只有经过页面客户端解析后的数据,才能真正的渲染成我们想要的页面。
因此,为了能够正确地抓取到这些数据,我们必须使用浏览器内核来实现。
现在常用的浏览器内核工具有:
QtWebkit spynner
selenium 但是由于selenium需要开启本地浏览器支持,不适合大规模爬去。
phantomjs (webkit) http://my.oschina.net/dacoolbaby/blog/http://phantomjs.org
slimerjs (gecko) https://slimerjs.org
除了selenium以外,都做了测试,QtWebkit 和 slimerjs 可以成功地渲染页面。
而phantomjs则一直卡在异步加载无法完成的状态。
slimerjs的代码可以使用和phantomjs完全一样的代码,因为接口是完全兼容的。
目前这个是原生的phantomjs瞎支持的代码,通过等待一定时间,来完成页面的ajax资源加载。
接下来是基于casperjs 的解析方案
最后,仍然要解决的问题还有不少。
phantomjs这种引擎数据持久化的问题。
webkit内核无法生成页面的原因,甚至在测试携 程网的适合,直接就是请求失败。
目前而言,使用slimerjs 确实可以爬取到想要的数据内容。
补充:
经过研究可得,slimerjs不是完整的headless webkit内核,性能方面应该是没有phantomjs优秀。用的人也不多,估计暂时没有出现针对性反爬虫的处理。
另一方面,默认的phantomjs用来做爬虫的话,需要修改源码。因为有不少的javascript可以用过某种方式来检测webkit接口是否是headless webkit。
类似的方法如下(可能需要翻墙):
http://my.oschina.net/dacoolbaby/blog/http://engineering.shapesecurity.com/2015/01/detecting-phantomjs-based-visitors.html
目前这一部分的内容都是外包项目,领导说需要根据实际情况,研究一下自己研发的可能性。
但是绝大部分这些OTA网站都做了大量的异步加载,并且接口都做了加密处理。
也就是说,我们从控制台上面拦截下来的请求数据都是加密的数据,只有经过页面客户端解析后的数据,才能真正的渲染成我们想要的页面。
因此,为了能够正确地抓取到这些数据,我们必须使用浏览器内核来实现。
现在常用的浏览器内核工具有:
QtWebkit spynner
selenium 但是由于selenium需要开启本地浏览器支持,不适合大规模爬去。
phantomjs (webkit) http://my.oschina.net/dacoolbaby/blog/http://phantomjs.org
slimerjs (gecko) https://slimerjs.org
除了selenium以外,都做了测试,QtWebkit 和 slimerjs 可以成功地渲染页面。
而phantomjs则一直卡在异步加载无法完成的状态。
slimerjs的代码可以使用和phantomjs完全一样的代码,因为接口是完全兼容的。
function render(page){ page.render('qunar.png'); phantom.exit(); } var page = require('webpage').create(); var system = require('system'); page.onResourceRequested = function (request) { // 可以过滤一些不必要的请求 // system.stderr.writeLine('= onResourceRequested()'); // system.stderr.writeLine(' request: ' + JSON.stringify(request, undefined, 4)); }; page.open('*ar.com/city/guangzhou/#fromDate=2015-10-01&toDate=2015-10-02&fom=qunarindex', function(status) { var title = page.evaluate(function() { return document.title; }); console.log('Page title is ' + title); console.log("Status: " + status); //页面返回状态 if(status === "success") { // setTimeout(render,1000,page); console.log("I am ready!"); } }); var t = 3; var interval = setInterval(function(){ if ( t > 0 ) { console.log(t--); } else { var htmlContent = page.evaluate(function () { return document.documentElement.outerHTML; }); console.log(htmlContent); page.render("qunar.png"); phantom.exit(); } }, 1000);
目前这个是原生的phantomjs瞎支持的代码,通过等待一定时间,来完成页面的ajax资源加载。
接下来是基于casperjs 的解析方案
最后,仍然要解决的问题还有不少。
phantomjs这种引擎数据持久化的问题。
webkit内核无法生成页面的原因,甚至在测试携 程网的适合,直接就是请求失败。
var casper = require('casper').create({ verbose: true, ogLevel: 'debug', //~~添加debug参数~~ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36', }); //监听 requested 消息 casper.on('resource.requested', function(requestData, request){ // 通过正则过滤掉一些不必要的加载 if (requestData.url.match(/google|gstatic|doubleclick/)){ request.abort(); return; }else{ this.echo(requestData.url); } }); casper.start('*nar.com/city/taipei/', function() { this.echo("strat -2before"); // this.scrollToBottom(); //滚动到页面底部 this.waitForSelector('.hotel_price', function() { //等到'.tweet-row'选择器匹配的元素出现时再执行回调函数 this.captureSelector('qunar.png', 'html'); //成功时调用的函数,给整个页面截图 }, function() { this.capture('qunar.png'); this.die('Timeout reached. Fail whale?').exit(); //失败时调用的函数,输出一个消息,并退出 }, 5000); //超时时间,两秒钟后指定的选择器还没出现,就算失败 }); casper.run();
目前而言,使用slimerjs 确实可以爬取到想要的数据内容。
补充:
经过研究可得,slimerjs不是完整的headless webkit内核,性能方面应该是没有phantomjs优秀。用的人也不多,估计暂时没有出现针对性反爬虫的处理。
另一方面,默认的phantomjs用来做爬虫的话,需要修改源码。因为有不少的javascript可以用过某种方式来检测webkit接口是否是headless webkit。
类似的方法如下(可能需要翻墙):
http://my.oschina.net/dacoolbaby/blog/http://engineering.shapesecurity.com/2015/01/detecting-phantomjs-based-visitors.html
相关文章推荐
- Android学习笔记(二九):嵌入浏览器
- Python3写爬虫(四)多线程实现数据爬取
- Scrapy的架构介绍
- 爬虫笔记
- Apple宣布推出WebKit跟踪预防政策以保护用户隐私
- PHP实现简单爬虫的方法
- NodeJS制作爬虫全过程(续)
- 一个PHP实现的轻量级简单爬虫
- nodejs爬虫抓取数据乱码问题总结
- nodejs爬虫抓取数据之编码问题
- Webkit的跨域安全问题说明
- JAVA使用爬虫抓取网站网页内容的方法
- 零基础写Java知乎爬虫之抓取知乎答案
- 零基础写Java知乎爬虫之先拿百度首页练练手
- 零基础写Java知乎爬虫之获取知乎编辑推荐内容
- Python编写百度贴吧的简单爬虫
- 零基础写python爬虫之使用urllib2组件抓取网页内容
- 零基础写python爬虫之抓取百度贴吧代码分享
- 零基础写python爬虫之urllib2使用指南
- python利用beautifulSoup实现爬虫