在Windows下安装PhantomJS和CasperJS及入门介绍(上)

news2024/12/25 2:15:13

近在使用Python爬取网页内容时,总是遇到JS临时加载、动态获取网页信息的困难。例如爬取CSDN下载资源评论、搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题。这第一篇文章当然就是安装过程及入门介绍。

一. 安装Phantomjs

        下载地址:PhantomJS - Scriptable Headless Browser
        官网介绍:
          PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.
          Full web stack No browser required.
        PhantomJS是一个服务器端的 JavaScript API 的WebKit(开源的浏览器引擎)。其支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。

        下载PhantomJS解压后如下图所示:

        在该文件夹下创建test.js文件,代码如下:

log('Hello world!');  
exit();  

        通过Ctrl+R打开CMD调用phantomjs.exe执行该程序输出如下图所示:

        参考官方文档:Documentation | PhantomJS


        1、脚本参数-arguments.js


        同时其自带的examples文件夹中有很多模板代码,其中获取脚本参数代码如下:

varsystem = require('system');  
if(system.args.length === 1) {  
log('Try to pass some args when invoking this script!');  
} else{  
args.forEach(function(arg, i) {  
log(i + ': '+ arg);  
});  
}  
exit();  

        运行程序及输出结果如下图所示:

     phantomjs examples/arguments.js arg0 agr1 arg2 arg3

        2、网页截图

        在根目录新建文件loadpic.js,其代码如下:

varpage = require('webpage').create();  
open('http://www.baidu.com', function() {  
render('example.png');  
exit();  
});  

        运行程序结果如下图所示:
        phantomjs loadpic.js

         短短5行代码让我第一次体会到了PhantomJS和调用脚本函数的强大,它加载baidu页面并存储为一张PNG图片,这个特性可以广泛适用于网页快拍、获取网页在线知识等功能。同时也感受到了似乎能够解决我最初的加载JS问题。

        3、页面加载-Page Loading


          A web page can be loaded, analyzed, and rendered by creating a web page object.
        通过创建一个网页对象,一个网页可以被加载,分析和渲染。examples文件夹中的loadspeed.js脚本加载一个特殊的URL (不要忘了http协议) 并且计量加载该页面的时间。

varpage = require('webpage').create(),  
system = require('system'),  
t, address;  

if(system.args.length === 1) {  
log('Usage: loadspeed.js <some URL>');  
exit(1);  
} else{  
t = Date.now();  
address = system.args[1];  
open(address, function(status) {  
if(status !== 'success') {  
log('FAIL to load the address');  
} else{  
t = Date.now() - t;  
log('Page title is '+ page.evaluate(function () {  
returntitle;  
}));  
log('Loading time '+ t + ' msec');  
}  
exit();  
});  
}  

        运行程序如所示:
        phantomjs examples/loadspeed.js http://www.baidu.com
        其中包括document.title获取网页标题和t=Date.now()-t计算网页加载时间。此时输出如下图所示,但会存在中文乱码,如何解决呢?

        添加如下代码即可:

        t = Date.now();
        address = system.args[1];
        phantom.outputEncoding="gbk";

        4.代码运算-Code Evaluation

      通过在网页上下文中对JavaScript代码进行计算,使用evaluate()方法。代码是在“沙箱(sandboxed)”中运行的,它没有办法读取在其所属页面上下文之外的任何JavaScript对象和变量。evaluate()会返回一个对象,然而它仅限制于简单的对象并且不能包含方法或闭包。
        下面这段代码用于显示网页标题:
 

​​​​​​​varpage = require('webpage').create();  

open('http://www.csdn.net', function(status) {  
var title = page.evaluate(function() {  
returntitle;  
});  
outputEncoding="gbk";  
log('Page title is '+ title);  
exit();  
});  

        输出如下图所示:

         任何来自于网页并且包括来自evaluate()内部代码的控制台信息,默认不会显示的。要重写这个行为,使用onConsoleMessage回调函数,前一个示例可以被改写成:

varpage = require('webpage').create();  
outputEncoding="gbk";  
onConsoleMessage = function(msg) {  
log('Page title is '+ msg);  
};  
open('http://www.csdn.net', function(status) {  
evaluate(function() {  
log(document.title);  
});  
exit();  
});  

        调用phantomjs gettile2.js即可。



        5.DOM操作-DOM Manipulation

        因为脚本好像是一个Web浏览器上运行的一样,标准的DOM脚本和CSS选择器可以很好的工作。这使得PhantomJS适合支持各种页面自动化任务。
        参考page automation tasks
        下面的 useragent.js(examples文件样本)将读取id 为myagent的元素的 textContent 属性:

varpage = require('webpage').create();  
log('The default user agent is '+ page.settings.userAgent);  
settings.userAgent = 'SpecialAgent';  
open('http://www.httpuseragent.org', function(status) {  
if (status !== 'success') {  
log('Unable to access network');  
} else {  
var ua = page.evaluate(function () {  
returngetElementById('myagent').innerText;  
});  
log(ua);  
}  
exit();  
});  

        输入如下指令,获取id=myagent元素的值:
        phantomjs examples/useragent.js

         上面示例也提供了一种自定义user agent的方法。
         使用JQuery及其他类库(Use jQuery and Other Libraries)。如果版本是1.6,你也可以把jQuery放入你的页面中,使用page.includeJs如下:

varpage = require('webpage').create();  
open('http://www.sample.com', function() {  
includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {  
evaluate(function() {  
$("button").click();  
});  
exit()  
});  
});  

          The above snippet will open up a web page, include the jQuery library into the page, and then click on all buttons using jQuery. It will then exit from the web page. Make sure to put the exit statement within the page.includeJs or else it may exit prematurely before the javascript code is included.
        即需要确保JavaScript代码中包括引用的页面存在。The Webpage instance具体用法参考前面官方文档。



        6.网络请求及响应 – Network Requests and Responses

        当一个页面从一台远程服务器请求一个资源的时候,请求和响应均可以通过 onResourceRequested 和 onResourceReceived 回调方法追踪到。文档示例 netlog.js:

varpage = require('webpage').create(),  
system = require('system'),  
address;  

if(system.args.length === 1) {  
log('Usage: netlog.js <some URL>');  
exit(1);  
} else{  
address = system.args[1];  

onResourceRequested = function(req) {  
log('requested: '+ JSON.stringify(req, undefined, 4));  
};  

onResourceReceived = function(res) {  
log('received: '+ JSON.stringify(res, undefined, 4));  
};  

open(address, function(status) {  
if(status !== 'success') {  
log('FAIL to load the address');  
}  
exit();  
});  
}  

        输入指令:
        phantomjs examples/netlog.js http://www.baidu.com
        
输出部分内容:

received: {  

"contentType": "text/javascript; charset=gbk",  
"headers": [  
{  
"name": "Server",  
"value": "bfe/1.0.8.5"  
},  
{  
"name": "Date",  
"value": "Tue, 18 Aug 2015 20:10:03 GMT"  
},  
{  
"name": "Content-Type",  
"value": "text/javascript; charset=gbk"  
},  
{  
"name": "Content-Length",  
"value": "88"  
},  
{  
"name": "Connection",  
"value": "keep-alive"  
},  
{  
"name": "Cache-Control",  
"value": "private"  
}  
],  
"id": 13,  
"redirectURL": null,  
"stage": "end",  
"status": 200,  
"statusText": "OK",  
"time": "2015-08-18T20:09:38.085Z",  
"url": "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=&json=1&p=3&  
sid=16486_16222_1421_16896_16738_12825_12868_16800_16659_16424_16514_15936_12073  
_13932_16866&csor=0&cb=jQuery110208203572703059763_1439928574608&_=1439928574609  
"  
}  

        获取如何把该特性用于HAR 输出以及基于YSlow的性能分析的更多信息,请参阅网络监控页面:network monitoring
        下面显示了从英国广播公司网站获得典范的瀑布图(waterfall diagram):

        
        PS:其他本分参考官方文档,目录如下,examples中包括每个js对应的用途、github中源代码、Troubleshooting等。
 


 

二. 安装CasperJS

        下载地址:[5600+] Cartoon Wallpapers | Wallpapers.com
        官方文档:[5600+] Cartoon Wallpapers | Wallpapers.com
        PS:准备下一篇文章介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/905321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SWUST派森练习题:P118. 数组接雨

描述 给定一个整形数组​​arr​​**&#xff0c;已知其中所有的值都是非负的&#xff0c;将这个数组看作一个柱子高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。​​(​​数组以外的区域高度视为​0)** 数据范围&#xff1a;数组长度​​** 0≤n≤…

wustojc2010两小时学完C语言

#include <stdio.h> int main() {int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("%d",a-b*c);return 0;}

AUTOSAR规范与ECU软件开发(实践篇)4.5在Simulink中导入软件组件描述文件——“自上而下”的工作流程

“自上而下”的工作流程有别于“自下而上”的工作流程,其需要先在AAT(AUTOSAR Authoring Tool)工具(如ISOLAR-A)中完成软件组 件框架设计,并将软件组件arxml描述文件导入Matlab/Simulink完成内部 算法的实现,然后再通过Matlab/Simulink生成符合AUTOSAR规范的代 码及arxm…

js 获取页面的滚动高度

想要获取页面的滚动位置可以通过给window绑定滚动事件来实现。 window.addEventListener(scroll,()>{const n document.documentElement.scrollTopconsole.log(n);}) 通过该方法可以获取页面的当前位置&#xff0c;或者实现其他的效果&#xff0c;例如电梯导航

v-model原理

v-model本质上是一个语法糖&#xff0c;应用在输入框上&#xff0c;就是value属性 和input事件的合写 作用:提供数据的双向绑定—实现子组件 和父组件数据的双向绑定 数据变 视图跟着变 :value视图变 数据跟着变 input <input type"text" v-model"msg"…

漏洞指北-VulFocus靶场专栏-中级01

漏洞指北-VulFocus靶场专栏-中级01 中级001 &#x1f338;dcrcms 文件上传 &#xff08;CNVD-2020-27175)&#x1f338;step1&#xff1a;输入账号 密码burp suite 拦截 修改类型为 jpeg 中级002 &#x1f338;thinkphp3.2.x 代码执行&#x1f338;step1&#xff1a;burpsuite …

[保研/考研机试] KY11 二叉树遍历 清华大学复试上机题 C++实现

题目链接&#xff1a; 二叉树遍历_牛客题霸_牛客网编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/43719512169254700747…

【Android】Mobile-Security-Framework-MobSF Manifest 静态扫描规则

前言 移动安全框架&#xff08;MobSF&#xff09;是一个自动化的一体化移动应用程序&#xff08;Android/iOS/Windows&#xff09;测试、恶意软件分析和安全评估框架&#xff0c;能够执行静态和动态分析。MobSF支持移动应用程序二进制文件&#xff08;APK、XAPK、IPA和APPX&am…

JavaScript:DOM (5) 节点的CRUD - 修改、删除

修改(替换)节点 替换子项 replaceChild()可以将指定元素的某个子节点换成新的节点&#xff0c;语法为指定元素.replaceChild(新节点, 旧节点)。 范例&#xff1a; 原始结构&#xff1a; <ul><li>第一项</li><li>第二项</li><li>第三项&l…

Python编程从入门到实践_8-8 用户的专辑_答案

Python编程从入门到实践_8-8 用户的专辑_答案 我也看了一些其他人的答案&#xff0c;很多的答案存在问题&#xff0c;每次调用函数 make_album() 后生成一个专辑字典会覆盖上次调用函数 make_album() 生成的字典&#xff0c;不符合题意。 我采取的解决方案是添加一个空列表 …

全局异常捕获

一、创建普获异常的类 二、定义异常处理器 定义全局异常处理器非常简单&#xff0c;就是定义一个类&#xff0c;在类上加上一个注解RestControllerAdvice&#xff0c;加上这个注解就代表我们定义了一个全局异常处理器。 在全局异常处理器当中&#xff0c;需要定义一个方法来捕…

第二章、应用层

文章目录 2.1 应用层原理2.1.1 网络应用程序体系结构2.1.2 进程通信2.1.3 可供应用程序使用的运输服务2.1.4 因特网提供的运输服务2.1.5 应用层协议 2.2.2 Web 和 HTTP2.2.1 HTTP概况2.2.2 非持续连接和持续连接2.2.3 HTTP报文格式2.2.4 用户与服务器的交互&#xff1a;cookie2…

华为ENSP网络设备配置实战6(简单的链路聚合)

题目要求 1、创建聚合组&#xff0c;添加端口成员 2、PC1网段为vlan10&#xff0c;PC2网段为vlan20 3、LSW1为核心网关设备&#xff0c;正确配置PC网关 4、PC1与PC2互通 解题过程 1.1、 按照拓扑图&#xff0c;各个设备起名 sys &#xff08;进入系统视图&#xff09; sy…

OpenCV4环境配置

0.安装mingw64 官网链接&#xff1a;mingw 安装红框标记下载免安装版本&#xff0c;解压可用。 将解压后的mingw64\bin添加到path环境变量cmd中输入gcc -v&#xff0c;出现下图所示即配置成功 1.下载OpenCV源码 源码下载 官网&#xff1a;Releases - OpenCV 运行下载好的ex…

负载均衡下的 WebShell 连接

目录 负载均衡简介负载均衡的分类网络通信分类 负载均衡下的 WebShell 连接场景描述难点介绍解决方法**Plan A** **关掉其中一台机器**&#xff08;作死&#xff09;**Plan B** **执行前先判断要不要执行****Plan C** 在Web 层做一次 HTTP 流量转发 &#xff08;重点&#xff0…

经典组合优化问题

本文根据学习进度不定时更新。 团问题 此处要理解"each pair of which is connected by an edge"的含义&#xff0c;这里的which指的是谁呢&#xff1f;肯定是vertices&#xff0c;即每一对定点都有一条边连接起来。 团问题是NPC问题。 团问题和定点覆盖问题、边覆盖…

LLM提示词工程和提示词工程师Prompting and prompt engineering

你输入模型的文本被称为提示&#xff0c;生成文本的行为被称为推断&#xff0c;输出文本被称为完成。用于提示的文本或可用的内存的全部量被称为上下文窗口。尽管这里的示例显示模型表现良好&#xff0c;但你经常会遇到模型在第一次尝试时无法产生你想要的结果的情况。你可能需…

22.0.6 LEADTOOLS 增加了 Python 支持 -Crack

LEADTOOLS 增加了 Python 支持 Python 开发人员现在可以利用 LEADTOOLS 技术&#xff0c;包括识别、多媒体和成像。 2023 年 7 月 18 日 - 16:40新版本 特征 添加了完整的 Python 支持 LEADTOOLS Python 支持包括高级图像处理功能、OCR、PDF、条形码识别和表单处理&#xff0c;…

FPGA原理与结构——RAM IP核原理学习

目录 一、什么是RAM 二、RAM IP介绍 1、RAM分类简介 2、可选的内存算法 &#xff08;1&#xff09;Minimum Area Algorithm&#xff08;最小面积算法&#xff09; &#xff08;2&#xff09;Low Power Algorithm &#xff08;低功耗算法&#xff09; &#xff08;3&#x…

ChatGPT-4: 半年的深度使用思考

几个月的时间一直在使用 ChatGpt-4&#xff0c;以口述语音转文字的形式说一下自己的体会。 1、选择版本 大前提&#xff1a;我使用的都是 GPT4 的版本。也就是说至少每个月要付费20$。 因为 3.5 的版本&#xff0c;实际上使用体验是非常差的&#xff0c;主要体现在答非所问上。…