我爱编程

PhantomJS在爬虫中应用

2017-09-20  本文已影响0人  Evtion

编写爬虫时,如果单纯是静态网站,Nodejs的cheerio,requests以及Python的urlib、urlib2与request(BeautifulSoup)就能解决需求。如果碰上网站通过AJAX获取数据或者JS延迟获取数据时。上面的技术栈就比较难获取到我们想要的数据,PhantomJS这个无界面浏览器,又有人称"虚拟浏览器"就派上用场了。
Phantomjs的功能,就是提供一个命令行下使用,它是基于Webkit内核,我们可以使用像正常的浏览器访问所需的网站。在某些时候,很多的人搭配着selenium+phantomjs搭建可以访问动态获取数据的网站,现在先说phantomjs在爬虫中的用法。

npm install phantomjs -g
1-1
# >>>表示是输出行
phantomjs --version
>>>2.1.1
phantomjs>window.navigator
{
   "appCodeName": "Mozilla",
   "appName": "Netscape",
   "appVersion": "5.0 (Windows NT 6.1; WOW64) AppleWebKit/538.1 (KHTML, like Gec
ko) PhantomJS/2.1.1 Safari/538.1",
   "cookieEnabled": true,
   "language": "zh-CN",
   "mimeTypes": {
      "length": 0
   },
   "onLine": true,
   "platform": "Win32",
   "plugins": {
      "length": 0
   },
   "product": "Gecko",
   "productSub": "20030107",
   "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/538.1 (KHTML, l
ike Gecko) PhantomJS/2.1.1 Safari/538.1",
   "vendor": "Apple Computer, Inc.",
   "vendorSub": ""
}
#代码实例代码
function plus(a,b){
  return a*b;
}
console.log(plus(1,2));
phantom.exit()
#以下为命令行窗口运行的情况
>phantomjs spider.js
2
# 这是默认get的获取方法
var webPage=require('webpage');
#设置网页的编码格式,如果不设置,会出现乱码情况
phantom.outputEncoding="gbk";
#创建一个webpage实例对象
var page=webPage.create();
var tbUrl="https://www.baidu.com";
#设置浏览器伪headers
page.settings.userAgent="Mozilla/5.0(Windows NT 6.1;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36";
# 调用open方法打开具体网页,默认以get请求获取
page.open(tbUrl,function (status) {
   setTimeout(function(){
       var result=pageTab.evaluate(function(){
           return document.body
           
       });
       console.log(result.toString());
       pageTab.render("1.png");
       phantom.exit();
   },4000);
})
#post方法传参数获取网页数据
var webPage=require('webpage');
var page=webPage.create();
var postData="username&password"
page.open('http://www.kiwis.com/','post',postData,function(status){
 console.log(status);
 phantom.exit();
});
# open()方法提供配置对象,对HTTP请求进行详细的配置
var webPage=require('webpage');
var page=webPage.create();
var setting={
 operation:"POST",
 encoding:"urf8",
 headers:{
   "Content-Type":"application/json"
 },
 data:JSON.stringify({
   some:'something',
   others:['data1']
 })
};
page.open("http://www.kiwis.com",setting,function(status){
 console.log("Status:"+status);
 phantom.exit();
});
var webpage=require('webpage');
page=webPage.create();
page.open("https://www.baidu.com",function(status){
  var title=page.evaluate(function(){
    console.log(document.title);
    return document.title;
  });
  phantom.exit();
});
var webPage=require('webpage');
var page=webPage.create();
page.onConsoleMessage(function(data){
  console.log("the pass data is"+data);
});
page.open(url,function(status){
  if(status){
    console.log("hello world!");
  }
  phantom.exit();
});
var webPage=require('webpage');
var page=webPage.create();
page.open("https://www.baidu.com",function(status){
  page.includeJs("https://code.jquery.com/jquery-3.2.1.min.js",function(){
    page.evaluate(function(){
      $('.su').click();
    });
  });
});
var webPage=require("webpage");
var page=webPage.create();
page.viewportSize={widtth:960,height:580};
page.open("http://www.baidu.com",function(status){
  page.render("1.png",{format:"png",quality:"100"});
  phantom.exit()
});
var webPage=require('webpage');
var page=webPage.create();
page.viewportISize={
  width:920,
  height:480
};
page.zoomFactor=1;
page.render("1.png");
var webPage=require('webpage');
var page=webPage.create();
page.onResourceRequested=function(requestData,RequestObj){
  console.log('request'+requestData.id+'----'+JSON.stringify(requestData));
}
//过滤资源应用
page.onResourceRequested=function(requestData,RequestObj){
  if((/http:\/\/.+?\.css$/gi).test(requestData['url'])){
    console.log("abort this resource");
    request.abort();
  }
}
var webPage=require('webpage');
var page=webPage.create();
page.onResourceReceived=function(response){
  console.log("response"+response.status+response.statusText);
}
var webpage=require('webpage')
var system=require('system');
var t,address;
//如果命令行没有给出网址
if(system.args.length===1){
  console.log("the url address is need!");
  phantom.exit();
}
t=Date.now();
address=system.args[1];
page.open(address,function(status){
  if(status!=="success"){
    console.log("failed to get webpage");
  }else{
    t=Date.now()-t;
    console.log("Loading time"+t+"ms");
  }
phantom.exit();
});
var webPage=require('webpage');
//设置网页编码格式
phantom.outputEncoding="gbk";
var pageTab=webPage.create();
var tbUrl="http://www.360kan.com/";
//设置请求头信息
pageTab.settings.userAgent="Mozilla/5.0(Windows NT 6.1;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36";
pageTab.open(tbUrl,function (status) {
//360kan网址的数据是动态加载的,这里等待2秒在执行其他操作。
    setTimeout(function(){
        pageTab.includeJs("http://code.jquery.com/jquery-3.2.1.min.js", function() {
            pageTab.evaluate(function() {
              var lists=$(".name");
              for(i=0;i<lists.length;i++){
                var list=lists[i];
                console.log(lists.text()+"\n");
              }
            });
            phantom.exit()
        });
    },2000);
})
pageTab.onConsoleMessage = function(msg) {
  console.log('Page title is ' + msg);
};
抓取的数据
var webpage=require('webpage');
var page=webpage.create();
page.setting.UserAgent="webkit/534.46 Mobile/9A405 safari/7534.48.3";
page.setting.viewportSize={width:400,height:600};
page.open("http://www.baidu.com",function(status){
  if(status!=="success"){
    console.log("load failed");
    phantom.exit();
  }else{
    var title=page.evaluate(function(){
      return document.title;
    });
    window.setTimeout(function(){
      page.clipRect={top:0,left:0,width:600,height:400};
      page.render(title+".png");
      page.clipRect={left:0,top:600,width:400,height:400};
      page.render(title+"1.png");
      phantom.exit();
    });
  }
});

上面是phantomjs的常用使用方法,下一篇关于selenium2和phantomjs结合使用爬虫js延迟或者AJAX获取数据的提取方式实例。

资料参考来自:
1.阮一峰老师 phantomJS
2.腾云阁社区关于phantomjs使用

上一篇 下一篇

猜你喜欢

热点阅读