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 ...
随机推荐
- json序列化 & 反序列化
json序列化: json的dumps方法可以将json格式数据序列为python的相关数据类型,比如str,常用于打印,另外,在序列化时,中文汉字被转换为unicode编码,在dumps函数中添加参 ...
- linux动态库与静态库混合连接
1, 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库.使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有 ...
- CF724F Uniformly Branched Trees
CF724F Uniformly Branched Trees 有根树可以统计.无根树难以统计.因为可以换根. 所以不让换根:只要两个无根树在重心位置不同构,就一定不同构 每个本质不同的树在重心位置统 ...
- Kubernetes Pv & Pvc
Kubernetes PV & pvc 介绍 PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节.管理 ...
- 移动端自动化测试-Windows-Android-Appium环境搭建
1.安装JDK,并且配置好[JAVA_HOME]和[path]两个环境变量 1.1.JAVA_HOME:指向JDK的安装路径(如:C:\Program Files (x86)\Java\jdk1.7. ...
- shell提取文件后缀名,并判断其是否为特定字符串
如果文件是 .css文件 或 .js文件,则进行处理. file=$1 if [ "${file##*.}"x = "css"x ]||[ "${fi ...
- 学习windows编程 day4 之 自定义映射
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- jquery 遍历 json【转】
jquery 遍历 json <HTML> <HEAD> <meta http-equiv="content-Type" content=" ...
- spring boot 2.0.3+spring cloud (Finchley)2、搭建负载均衡Ribbon (Eureka+Ribbon+RestTemplate)
Ribbon是Netflix公司开源的一个负载均衡组件,将负载均衡逻辑封装在客户端中,运行在客户端的进程里. 本例子是在搭建好eureka的基础上进行的,可参考spring boot 2.0.3+sp ...
- Gym - 100269F Flight Boarding Optimization(dp+树状数组)
原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...