什么是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官方文档

 'use strict'

 const phantom = require('phantom');

 let getPic = async ( name ) => {
//url路径
let url = 'http:///'+name;
//创建一个实例
const instance = await phantom.create();
//创建一个页面
const page = await instance.createPage();
//设置页面参数
await page.property( 'viewportSize' , { width : 1800 , height : 1200 } );
//打开url,返回状态(url有转码,解决中文问题)
const status = await page.open( encodeURI( url ) );
console.log( status );
//延时等待页面js执行完成(phantomjs只是等待页面上全部资源加载完毕,不包含页面js执行时间,所以需延时一段时间等待js)
await lateTime( 500 );
//输出页面到当前目录下
await page.render(`${ name }--${Date.now()}.png`);
//销毁实例
await instance.exit();
//返回数据
return 'xxx';
}; let lateTime = ( time ) =>{
return new Promise( function(resolve,reject){
setTimeout(function(){
resolve();
}, time );
} );
}
//暴露接口
module.exports = getPic ;

node调用phantomjs-node爬取复杂页面的更多相关文章

  1. Node.js 动态网页爬取 PhantomJS 使用入门(转)

    Node.js 动态网页爬取 PhantomJS 使用入门 原创NeverSettle101 发布于2017-03-24 09:34:45 阅读数 8309  收藏 展开 版权声明:本文为 winte ...

  2. Node JS爬虫:爬取瀑布流网页高清图

    原文链接:Node JS爬虫:爬取瀑布流网页高清图 静态为主的网页往往用get方法就能获取页面所有内容.动态网页即异步请求数据的网页则需要用浏览器加载完成后再进行抓取.本文介绍了如何连续爬取瀑布流网页 ...

  3. Scrapy爬取静态页面

    Scrapy爬取静态页面 安装Scrapy框架: Scrapy是python下一个非常有用的一个爬虫框架 Pycharm下: 搜索Scrapy库添加进项目即可 终端下: #python2 sudo p ...

  4. scrapy模拟浏览器爬取验证码页面

    使用selenium模块爬取验证码页面,selenium模块需要另外安装这里不讲环境的配置,我有一篇博客有专门讲ubuntn下安装和配置模拟浏览器的开发 spider的代码 # -*- coding: ...

  5. scrapy(四): 爬取二级页面的内容

    scrapy爬取二级页面的内容 1.定义数据结构item.py文件 # -*- coding: utf-8 -*- ''' field: item.py ''' # Define here the m ...

  6. 爬取百度页面代码写入到文件+web请求过程解析

    一.爬取百度页面代码写入到文件 代码示例: from urllib.request import urlopen #导入urlopen包 url="http://www.baidu.com& ...

  7. node js 爬虫爬取静态页面,

    先打一个简单的通用框子 //根据爬取网页的协议 引入对应的协议, http||https var http = require('https'); //引入cheerio 简单点讲就是node中的jq ...

  8. Node.js 薄荷网爬取

    Node.js:是一个基于前端的服务器,主要的特点:单线程,异步I/O(对这个没有了解,开发起来真的会踩很多坑),事件驱动 前言:本人主要是一个以使用.Net平台下的语言,进行开发的一个菜鸡,之前面试 ...

  9. selenium + PhantomJS 爬取js页面

    from selenium import webdriver import time _url="http://xxxxxxxx.com" driver = webdriver.P ...

随机推荐

  1. 跨域CORS

    一.跨域CORS是什么 当一个资源从与该资源本身所在的服务器的域或端口不同的域或不同的端口请求一个资源时,浏览器会发起一个跨域 HTTP 请求.出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求 ...

  2. flask 扩展之 -- flask-script

    一. 使用 Flask-Script 支持命令行选项 1. 安装 $ pip install flask-script 2. 配置 from flask_script import Manager m ...

  3. 详解 try-with-resource

    [TOC] Oracle官方文档: http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources. ...

  4. 几种 vue的数据交互形式

    var that=this get请求 that.$http.get("1.txt").then(function(result){ console.log(result) thi ...

  5. mysql清除数据库中字符串空格方法

    update `z_lottery_list` set `win_number`=replace(`win_number`,' ','');

  6. 【Android Developers Training】 7. 添加Action Buttons

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. Linux编程之epoll

    现在有这么一个场景:我是一个很忙的大老板,我有100个手机,手机来信息了,我的秘书就会告诉我"老板,你的手机来信息了."我很生气,我的秘书就是这样子,每次手机来信息就只告诉我来信息 ...

  8. SVN仓库迁移到Git的完美解决办法

    参考文章Converting a Subversion repository to Git 1 使用git svn clone 拷贝svn仓库 cd ~/test_repo git svn clone ...

  9. 屏幕适配/autoLayout autoresizingMask

    #pragma mark-- 屏幕适配/autoLayout autoresizingMask 1> 发展历程 代码计算frame -> autoreszing(父控件和子控件的关系) - ...

  10. SQL联表查询

    数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...