PhantomJS初探
最近想写一个程序爬网页接口的数据,由于本人是前端开发者,对于后端的一些爬虫工具不甚了解。首先所爬接口需要动态的在url加query参数,爬取数据。其次为了防止接口被封我初步设想希望能后定时爬取接口,比如间隔500ms爬取一条数据,而且每天爬取一次。开始我是开发一个网页,每天打开里面的js脚本自动执行请求接口,然后将请求的接口数据保存到后台mysql数据库中。这种方法需要人工每天打开网页进行爬取。于是翻阅资料了解phantomjs可以实现我想要的功能。
正常的网页我们需要浏览器打开才能访问,但是通过phontomjs的虚拟浏览器环境可以在后端打开一个网页,可以正常的执行js,生成dom。这样就可以在后端打开一个网页,并且使用pm2守护进程,保持网页一直打开,在网页js中设置定时器,每天固定时间出发爬取动作。
var page = require('webpage').create(), system = require('system'), address; address = system.args[1]; var url = 'http://*******'; //init and settings page.settings.resourceTimeout = 30000 ; page.settings.XSSAuditingEnabled = true ; //page.viewportSize = { width: 1000, height: 1000 }; page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'; page.customHeaders = { "Connection" : "keep-alive", "Cache-Control" : "max-age=0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6", }; page.open(url, function() { console.log(url); console.log('begin'); }); //加载页面完毕运行 page.onLoadFinished = function(status) { console.log('Status: ' + status); console.log(page.content); //phantom.exit(); };
如上代码,webpage是phantomjs的核心模块,他可以模拟浏览器打开网页的动作,比如page.setting.userAgent可以设置ua,page.setting.customHeader可以模拟浏览器的请求头部参数,page.open是请求网页,page.onLoadFinished 是网页加载完成的回调函数。
pnontomjs还可以做很多其他的工作。比如网页截图,可以将目标网站的网页整个ui截图保存本地。抓取网页的图片。最重要的是可以用来分析网页的性能,因为它可以监听网页不同的状态,提供相应的回调函数,例如 page.onInitialized,page.onLoadStarted,page.onLoadFinished等监听网页状态的回调函数,可以通过在这些回调函数中埋点,记录时间,就可以用来分析网页的性能。