以前写爬虫,遇到需要登录的页面,一般都是通过chrome的检查元素,查看登录需要的参数和加密方法,如果网站的加密非常复杂,例如登录qq的,就会很蛋疼

在后面,有了Pyv8,就可以把加密的js文件扔给它,然后返回加密后的字符串。但是Pyv8只能安装在Centos7的版本,而且耗用内存也比较大。

现在有了PhantomJS,再也不需要考虑登录的参数和加密了,用PhantomJS打开页面,通过JS或JQuery语句,填入账号和密码,然后点击登录,然后把Cookies保存下来,就可以模拟登录了。

1.安装

# yum -y install gcc gcc-c++ make flex bison gperf ruby \
openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \
libpng-devel libjpeg-devel
# git clone git://github.com/ariya/phantomjs.git
# cd phantomjs
# git checkout 2.0
# ./build.sh

2.创建一个page实例

var page = require('webpage').create();

3.打开一个页面

page.open('http://www.baidu.com', function() {
});

第二个参数是打开页面后回调的函数

4.执行js语句

        page.evaluate(function() {
$("button").click();
console.info($("button"))
});

包裹在evaluate里面的js语句是在沙箱里面运行的,沙箱的上下文环境就是open的页面的环境,所以在这里可以通过js语句访问页面的元素,例如$("body").html()

由于在沙箱中执行,所以console.info不会输出的终端,如果需要输出到终端,就要设置回调函数:

page.onConsoleMessage = function(msg) {
console.log(msg);
};

5.cookies

获取页面的cookies

console.info(JSON.stringify(page.cookies))

cookies的数据结构,相当于{"age":"12"}

[
{
"domain": "info.aaa.com",
"httponly": false,
"name": "age",
"path": "/",
"secure": false,
"value": "12"
}
]

6.截图

page.viewportSize = { width: 1366, height: 600 };//设置页面的尺寸
page.render('info_test.png');

如果截图后,中文字符显示为方框,安装字体库

yum install bitmap-fonts bitmap-fonts-cjk

7.脚本参数

var page = require('webpage').create(),
system = require('system'),
address, output, size; if (system.args.length != 5) {
console.log('Usage: test.js domain username password projects screen_shot_path ');
phantom.exit(1);
} else {
var domain = system.args[1]
var username = system.args[2]
var password = system.args[3]
var projects = system.args[4]
var root_shot_path = system.args[5]
}

8.注意

  • 由于js语言是非阻塞的,所以有时候需要使用setTimtout setInterval来等待沙箱中执行的js语句,例如等待里面的ajax完成等。

9.简单的模拟登录DEMO

var page = require('webpage').create();
page.viewportSize = { width: 1366, height: 600 };
var url='http://www.mysite.com/login'
page.open(url, function() {
ret=page.evaluate(function() {
$("#username")[0].value='lujianxing'
$("#password")[0].value='test'
$("#submit").click();
});
setTimeout('print_cookies()',10000)
}); function print_cookies(){
console.info(JSON.stringify(page.cookies, undefined, 4))
phantom.exit()
}

10.命令行运行脚本

phantomjs test.js

参考

PhantomJS官网

转载请带上

最新文章

  1. OpenGL超级宝典笔记----框架搭建
  2. mac 安装jdk1.5
  3. fcitx error
  4. vue组件一
  5. POJ3735 矩阵
  6. MongoDB 基础知识
  7. iOS字符串为空的判断
  8. [软件测试]Linux环境中简单清爽的Google Test (GTest)测试环境搭建(初级使用)
  9. JavaIO中的Reader和writer
  10. java 倒序输出
  11. 2009国家集训队小Z的袜子
  12. Gym 100827G Number Game (博弈)
  13. Chrome 浏览器地址栏直接搜索太慢的解决方案
  14. Smart Client Software Factory安装
  15. HelloMyBLOG!!!
  16. StreamReader和StreamWriter说明
  17. rest framework 源码流程
  18. C语言上机复习(一)文件操作
  19. 搜索引擎:Elasticsearch与Solr
  20. git reset --hard和git revert命令

热门文章

  1. K.Bro Sorting
  2. TCP/IP协议原理与应用笔记17:IP编址(重点)
  3. CSS完成三角形
  4. 编写一个单独的Web Service for Delphi
  5. C++编译器的函数名修饰规则
  6. 【模拟】UVa 12108 - Extraordinarily Tired Students
  7. hdu1501 动态规划
  8. 转: utf16编码格式(unicode与utf16联系)
  9. css禁止双击dom节点被选中user-select:none
  10. C# 利用ffmpeg 对视频转换系类操作 (1) 基本分析