Phantomjs
在爬虫、自然语言时偶然接触到phantomjs、casper等相对于httpclient较新的框架及采集解决方案,微查之后发现方案可行,故尽清明三日之力,将其二次开发应用于百度元搜索信息采集项目中,达到预期效果,下一步将重点应用到腾讯微博采集和抢票抢手机项目中。下面,将分步骤介绍一下。
一、phantomjs介绍
(1)一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。
(2)提供JavaScript API接口,即通过编写js程序可以直接与webkit内核交互,在此之上可以结合Java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。
(3)提供windows、Linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。
二、phantomjs常用API介绍
近几天的学习找了不少资料,也包括官网的,但其相关学习资料还是相对较少的,很多问题都是进行N多测试才搞清楚,在此耗费了不少时间。在学习时,结合官网和本篇博文效果会更好。
(1)常用内置几大对象
1 2 3 |
var system=require('system'); //获得系统操作对象,包括命令行参数、phantomjs系统设置等信息 var page = require('webpage'); //获取操作dom或web网页的对象,通过它可以打开网页、接收网页内容、request、response参数,其为最核心对象。 var fs = require('fs'); //获取文件系统对象,通过它可以操作操作系统的文件操作,包括read、write、move、copy、delete等。 |
(2) 常用API
1 2 3 4 5 6 7 8 9 10 11 12 |
page.open(url,function (status) {} //通过page对象打开url链接,并可以回调其声明的回调函数,其回调发生的时机为该URL被彻底打开完毕,即该URL所引发的请求项被全部加载完,但ajax请求是与它的加载完成与否没有关系 page.onLoadStarted = function() {}//当page.open调用时,回首先执行该函数,在此可以预置一些参数或函数,用于后边的回调函数中 page.onResourceError = function(resourceError) {} //page的所要加载的资源在加载过程中,出现了各种失败,则在此回调处理 page.onResourceRequested = function(requestData, networkRequest) {} //page的所要加载的资源在发起请求时,都可以回调该函数 page.onResourceReceived = function(response) {} //page的所要加载的资源在加载过程中,每加载一个相关资源,都会在此先做出响应,它相当于http头部分, 其核心回调对象为response,可以在此获取本次请求的cookies、userAgent等 page.onConsoleMessage = function (msg) {}//欲在执行web网页时,打印一些输出信息到控制台,则可以在此回调显示。 page.onAlert = function(msg) {} //phantomjs是没有界面的,所以对alert也是无法直接弹出的,故phantomjs以该函数回调在page在执行过程中的alert事件 page.onError = function(msg, trace) {} //当page.open中的url,它自己(不包括所引起的其它的加载资源)出现了异常,如404、no route to web site等,都会在此回调显示。 page.onUrlChanged = function(targetUrl) {} // 当page.open打开的url或是该url在打开过程中基于该URL进行了跳转,则可在此函数中回调。 page.onLoadFinished = function(status){} // 当page.open的目标URL被真正打开后,会在调用open的回调函数前调用该函数,在此可以进行内部的翻页等操作 page.evaluate(function(){});// 在所加载的web page内部执行该函数,像翻页、点击、滑动等,均可在此中执行 page.render("");//将当前page的现状渲染成图片,输出到指定的文件中去。 |
(3)注意事项
1、区分phantomjs的对象和打开的web page的对象,如document、window等,两者都有,在调用page.evaluate和不调用的时候,注意区分二者的范围,容易在调试时出现很多的问题,且不好发现。
2、page.injectJs和page.includeJs的区别,前者侧重本地的js文件,与libraryPath挂购,后者侧重网络js文件,尤其在引入jQuery等第三方库时,会经常遇到。
3、编码问题,两个重要参数,--output-encoding,--script-encoding,前者为输出编码,后者为所使用js、参数配置文件的编码,为方便起鉴,建议均采用utf-8编码,并注所应用到的目标文件的编码,以免引起很不可思议的异常,又无从查起。
三、百度元搜索采集器
主要是Java SE+js+phantomjs的应用,
(1) 编写好js脚文程序,预留出所有可配置参数,并提供json文件传输相关参数。
(2) 通过java程序,定义相关参数并生成对应的json文件。
(3) 通过java命令行调用API,调用phantomjs命令,并传入js、配置文件路径,从而开启爬虫。
(4) 首先采集关键词的搜索页的链接集合,最后统一去遍历采集具体的对象网页。
四、应用小结
经过上述的项目实测应用,它将非常方便的应用于模拟登陆,如微博、电商类,或是小米、火车票抢票等项目中,下一步计划将其与上述项目结合,开发更有意思的项目。
欢迎加入以爬虫、自然语言处理为主题的技术群320349384,更多问题与建议,欢迎交流。