zoukankan      html  css  js  c++  java
  • node调用phantomjs-node爬取复杂页面

    什么是phantomjs

    phantomjs官网是这么说的,‘整站测试,屏幕捕获,自动翻页,网络监控’,目前比较流行用来爬取复杂的,难以通过api或正则匹配的页面,比如页面是通过异步加载。phantomjs就是一个完整的浏览器只能没有界面,因此我们可以用它来模拟真正的浏览器去访问页面,然后再获取页面。我要说的重点是如何在node中调用phantomjs来获取页面。

    node与phantomjs通信

    1. 命令行传参   只能在phantomjs开启时对其传参,运行过程中无能为力。
    2. 标准输出       能从phantomjs向node输出数据,但是没法反过来。
    3. http                 phantomjs向node发http请求,然后node返回数据,但是请求只能由phantomjs发出
    4. websocket     websocket通讯,能够双向通讯但是实现略麻烦。
    5. phantomjs-node        实际上也是使用websocket或者http通讯,但是毕竟是别人写好的我们直接用就行,缺点是依赖略庞大。

    如何使用phantom-node

    GitHub地址:https://github.com/amir20/phantomjs-node

    这里只做简单说明详细api见github。

        1.安装

            npm install phantom

        2.模块封装(以下代码基于es7,需支持async/await,node版本>7.0),更详细使用可查看phantomjs官方文档

     1 'use strict'
     2 
     3 const phantom = require('phantom');
     4 
     5 let getPic = async ( name ) => {
     6     //url路径
     7     let url        = 'http:///'+name;
     8     //创建一个实例
     9     const instance = await phantom.create();
    10     //创建一个页面
    11     const page     = await instance.createPage();
    12     //设置页面参数
    13     await page.property( 'viewportSize' , { width : 1800 , height : 1200 } );
    14     //打开url,返回状态(url有转码,解决中文问题)
    15     const status = await page.open( encodeURI( url ) );
    16     console.log( status );
    17     //延时等待页面js执行完成(phantomjs只是等待页面上全部资源加载完毕,不包含页面js执行时间,所以需延时一段时间等待js)
    18     await lateTime( 500 );
    19     //输出页面到当前目录下
    20     await page.render(`${ name }--${Date.now()}.png`);
    21     //销毁实例
    22     await instance.exit();
    23     //返回数据
    24     return 'xxx';
    25 };
    26 
    27 let lateTime = ( time ) =>{
    28     return new Promise( function(resolve,reject){
    29         setTimeout(function(){
    30             resolve();
    31         }, time );
    32     } );
    33 }
    34 //暴露接口
    35 module.exports = getPic ;
  • 相关阅读:
    四、面向对象分析和设计全流程概述
    三、三大核心特征-继承
    二、三大核心特征-多态
    [第三章]一、三大核心特征-封装
    四、抽象类
    三、接口
    二、对象
    [第二章]一、类
    六、面向对象的迷思
    五、面向对象的应用范围
  • 原文地址:https://www.cnblogs.com/wuyoucao/p/7278818.html
Copyright © 2011-2022 走看看