PhantomJSのメモいろいろ
提供されるモジュール群は5つ
- phantom: そのもの
- FileSystem: ファイルに出力したり、依存ファイルの存在確認したり
- System: コマンドラインから引数取りたいなら
- WebPage: きっと主役なrequire('webpage').create()するやつ
- WebServer: まだ使わない方がよさそう
おおまかな使い方は2パターン
pageを使いまわす
オーソドックスなやつかと。
PhantomJSのサンプルといえば!的な。
var page = require('webpage').create(); page.open('http://example.com', function(){
// do something..
page.evaluate(function(){
// do something...
});
phantom.exit();
});
コールバックに載せまくる
ネットワークの監視とか。
var page = require('webpage').create(); page.onResourceRequested = function (request) {
console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function (response) {
console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);
とにかくいろいろサンプルあるので、先に見るとイメージがつかめるかもです。
page.evaluate()に任意の引数を与えたい
Evaluates the given function in the context of the web page. The execution is sandboxed, the web page has no access to the phantom object and it can't probe its own setting.
それは困った。
// NG!
var url = 'http://example.com',
idPw = {
id: 'hoge',
pw: 'piyo'
}; page.open(url, function(){
page.evaluate(function(){
document.getElementById('login-name').value = idPw.id; // Undefined!!
document.getElementById('pass-word').value = idPw.pw; // Undefined!!
document.getElementById('myForm').submit();
});
});
これは困った・・。
evaluate(function, arg1, arg2, ...)
// OK!
var url = 'http://example.com',
idPw = {
id: 'hoge',
pw: 'piyo'
}; page.open(url, function(){
page.evaluate(function(idPw){
document.getElementById('login-name').value = idPw.id;
document.getElementById('pass-word').value = idPw.pw;
document.getElementById('myForm').submit();
}, idPw); // 渡せた!
});
UserAgentを偽装する
やり方は2通り。
推奨されてるのは最初のやつだそうな。
page.settingsに設定
// var page … page.settings = {
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'
}; // page.open(…
page.customHeadersに設定
// var page … page.customHeaders = {
User-Agent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'
}; // page.open(…
この方法で設定すると、最初の方法を上書きしてしまうそうです。
ログイン処理するならライブラリ併用が無難
ログインした後のリダイレクト待ちとか、そもそも重いページとか、単純なコールバックで上手くいかない時とか。
ここに書かれてる内容で、やりたいことのほとんどはできるのではないでしょうか。
あとはflow.jsとか。
ページへは、
if(!phantom.injectJs('./utils/jsdeferred.js')){
console.log('This script requierd jsdefferred.js!');
phantom.exit(1);
}
という具合で差し込めば使えます。
書式やスタイルはNode.jsと同じ
まぁ当たり前ですが・・。
コールバックの嵐になりがちなあたりや、CommonJSスタイルでのモジュール読み込みとか。
というかCasperJS
PhantomJSのAPIをいろいろ調べるとか、するより先に、コレ使ったほうが早いし楽です。
おそらくスクレイピング絡みのほとんどのことは、難なく実現できちゃいます。
CasperJSのメモとか、作ったサンプルはまた個別の記事で載せようと思います。
PhantomJSのメモいろいろ的更多相关文章
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...
- Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...
- 使用PhantomJS实现网页截图服务
这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Canvas.Html2Image.Cobra),就是性能不怎么样(如SWT的Brower). ...
- 如何用phantomjs去抓取js渲染后的页面
1.安装phantomjs 网上有很多. 2.执行官网上的示例代码 // Read the Phantom webpage '#intro' element text using jQuery and ...
- Python爬虫学习(10):Selenium的好基友PhantomJS
上一节中我们学习了selenium,用python来操作浏览器,在做网页自动化测试的时候最好不过了 .如果我们来做爬虫用一个带界面的浏览器似乎不太好吧,那可咋办呢?别着急,下来我们要介绍的就是一款不带 ...
- phantomjs 双向认证,访问nginx,https
应用背景: phantomjs的一个爬虫,访问https站点,单向认证(只认证服务器身份)的都可以,双向认证(服务器和客户端都需要认证)必须上传本地证书: 开始用一个包含公钥私钥的PEM证书访问,怎么 ...
- selenium phantomjs 关闭问题
一个获取供应商余额的项目中,使用了 selenium 来爬虫,原因是获取余额不用太频繁,对性能要求不高.第二是 selenium 更好应对各种页面. 项目中,selenium webdriver使用了 ...
- 利用PhantomJS进行网页截屏,完美解决截取高度的问题
关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...
- phantomjs+selenium实现爬取动态网址
之前使用 selenium + firefox驱动浏览器来实现爬取动态网址,但是firefox经常更新,更新后时常会导致webdriver启动不来,所以改用phantomjs+selenium来改善一 ...
- 爬虫:selenium + phantomjs 解决js抓取问题(一)
selenium模块主要用来做测试,模拟键盘.鼠标来操作浏览器. phantomjs 就像一个无界面的浏览器一样. 两个结合能很好的解决js抓取的问题. 测试代码: #coding=utf-8 fro ...
随机推荐
- [AHOI2014/JSOI2014] 解题报告
[AHOI2014/JSOI2014] 奇怪的计算器 一个很关键的结论,任何时候每个数的相对大小是不变的. 于是可以把这个相对大小当成线段树的权值,每次只需要维护一下区间极值和tag就好了,关于操作四 ...
- Elasticsearch中使用groovy脚本处理boolean字段的一个问题
Elasticsearch中使用groovy脚本获取文档的bool字段值时,得到的值是字符的 'T' 或者 'F' ,而不是bool值 true 和 false . 比如文档中有一个字段是 { &qu ...
- luogu2336 喵星球上的点名 (SA+二分答案+树状数组)
离散化一下然后把姓名串和询问串都放一起做SA 和bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...
- configParse模块(二十七)
configparser用于处理特定格式的文件,其本质上是利用open来操作文件. # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [section ...
- python - how to sort
python - how to sort overview Key function (★★★★★) OPerator module functions asc and desc 升序和降序 Over ...
- Post和get请求时中文乱码
在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter</filter-name> <filte ...
- Nginx核心配置文件常用参数详解
Nginx核心配置文件常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Nginx权威文档的话童鞋们可以参考Nginx官方文档介绍:http://nginx.org/ ...
- Python基础【day03】:入门知识拾遗(八)
本节内容 1.作用域 2.三元运算 3.进制 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1: name = 'wupeiq ...
- mysql -- 索引补充
.unique索引补充:联合唯一 unique(name,email)是name和email这两列联合起来唯一,不再试某个字段唯一 .主键索引,类似唯一索引,也是允许联合多个字段作为主键,例如:pri ...
- 用java发邮件之一 (直接源于真实项目) 【原】
真实项目应用的java发送邮件,应该还待进一步完善. 依赖 mail-1.4.jar jar包下载地址: http://mvnrepository.com/artifact/javax.mail/ma ...