Node.JS利用PhantomJs抓取网页入门教程


Posted in Javascript onMay 19, 2017

前言

当想用 nodejs 抓取一些网页 , 我第一反应想到的就是使用 http 模块 , 比如抓取百度首页:

var http = require('http');
var req = http.request('http://www.baidu.com/', function (res) {
 res.setEncoding('utf8');
 res.on('data', function (chunk) {
  //响应内容
  console.log(chunk)
 });
});
req.end(function () {
 // console.log('连接关闭');
});

但是 , 这仅限于简单地抓取 html , 有很大的局限性。

假如你想要的内容不在 html 里 , 而是 js 动态生成的 , 那 http 模块就不能满足你的需求了 ;

假如网页使 gbk 编码的 , 上述方法也不太好用了。

假如是 https 上述方法也要改一改了。

我渴望一个更强大 , 但使用起来也不麻烦的工具。

PhantomJs

用 PhantomJs 就可以解决上述问题。

PhantomJs 就是一个没有界面的浏览器。

安装

使用 cnpm 安装 PhantomJS 即可:

cnpm install phantomjs --save-dev

这里我没有选择全局安装 , 因为全局安装的话 , 别人使用我的源码的时候 , 不知道还有这么一个依赖 , 项目就跑不起来了。

如果你也选择局部安装 , 那么你需要在 package.json 里的 scripts 中加入一段 :

"phantomjs":"node_modules/.bin/phantomjs"

等下会用到这个的 , 到这里 , 安装算完成了。

写代码

我们新建一个文件 , 名字随意 , 这里我新建一个 main.js :

var webpage = require('webpage');
var page = webpage.create();
page.open('http://www.baidu.com/', function (status) {
 var data;
 if (status === 'fail') {
  console.log('open page fail!');
 } else {
  console.log(page.content);//打印出HTML内容
 }
 page.close();//关闭网页
 phantom.exit();//退出phantomjs命令行
});

这里有个 webpage 模块 , 我们刚才明明没有这个模块 , 为什么能引用这个模块 ???

当然不能引用 , 假如我们使用 node main.js 来跑这段代码 , 是跑不起来的 , 应该这样运行这段代码 :

npm run phantomjs main.js

这里的 npm run phantomjs 对应的就是前面我们在 package.json 里加入的那段命令 , 很方便吧 , 几乎和 http 模块一样方便。

page.content 就是 html 代码了 , 这个 page 对象还有很多的属性 , 功能更强大。

到这里 , 你就已经算入门了 , 想知道更多可以去 phantomjs 官网看看文档了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS小功能(setInterval实现图片效果显示时间)实例代码
Nov 28 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
Jun 08 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
Sep 14 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
node.js文件上传处理示例
Oct 27 Javascript
JS实现重新加载当前页面
Nov 29 Javascript
Angular的MVC和作用域
Dec 26 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
使用Angular CLI生成 Angular 5项目教程详解
Mar 18 Javascript
微信小程序swiper左右扩展各显示一半代码实例
Dec 05 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 #Javascript
angularjs封装$http为factory的方法
May 18 #Javascript
bootstrap表单示例代码分享
May 18 #Javascript
angularJS 发起$http.post和$http.get请求的实现方法
May 18 #Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 #Javascript
微信小程序中input标签详解及简单实例
May 18 #Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 #Javascript
You might like
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
php自动加载机制的深入分析
2013/06/08 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
php中session与cookie的比较
2015/01/27 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
canvas绘制多边形
2017/02/24 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
centos下更新Python版本的步骤
2013/02/12 Python
Python实现115网盘自动下载的方法
2014/09/30 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
英国森林假期:Forest Holidays
2021/01/01 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
校本研修个人总结
2015/02/28 职场文书
小学国庆节活动总结
2015/03/23 职场文书
httpclient调用远程接口的方法
2022/08/14 Java/Android