【Python从入门到进阶】37、selenium关于phantomjs的基本使用

接上篇《36、Selenium 动作交互》
上一篇我们介绍了selenium操作网页的动作内容。本篇我们来学习有关phantomjs的相关知识。

一、selenium的缺点

在介绍PhantomJS之前,让我们先讨论一下直接使用Selenium的一些缺点。

1、显示浏览器窗口:Selenium通常需要一个真实的浏览器窗口来执行测试或爬虫任务。这就意味着它会打开一个可见的浏览器窗口,这可能不是理想的选择,因为大部分同学都希望在后台运行这些自动化任务。

2、速度较慢:由于Selenium模拟了浏览器的交互行为,它可能比其他工具执行相同的任务更慢,尤其是在大规模数据爬取或测试方面。

3、内存占用高:Selenium驱动真实的浏览器窗口,因此它需要占用大量内存资源。如果你需要同时运行多个并发任务,这可能会导致内存消耗过高,影响性能。

此时,我们就需要使用“无头浏览器”来解决这些问题。那么,什么是“无头浏览器”呢?
无头浏览器就是Web浏览器在没有图形用户界面的情况下。此程序的行为与浏览器类似,但不会显示任何GUI。
无头驱动程序的一些示例包括:

● HtmlUnit
● Ghost
● PhantomJS
● ZombieJS
● Watir-WebDriver

在本篇博客,我们将先来介绍phantomjs。

二、phantomjs介绍及价值

让我们看看PhantomJS如何解决上述问题,以及为什么它具有价值的。

PhantomJS是一个基于WebKit的无界面浏览器,它可以通过命令行或脚本进行控制和操作,而无需显示实际浏览器窗口。这使得PhantomJS在以下方面具有优势:

1、无界面操作:PhantomJS在后台执行任务,没有可见窗口,这对于需要在服务器或自动化环境中运行的任务非常有用。你可以在无需人工干预的情况下执行自动化测试、网页截图、数据爬取等操作。
2、快速执行:由于PhantomJS不需要显示浏览器窗口,它通常比使用Selenium的方法更快。它可以以较高的速度加载和渲染页面,从而提高您的自动化任务的效率。
3、较低的内存消耗:相比于Selenium驱动实际浏览器窗口,PhantomJS通常需要更少的内存资源。这使得它在需要同时处理多个任务或大规模数据爬取时更具优势。

综上所述,PhantomJS通过提供无界面浏览器的功能,解决了Selenium直接使用的一些缺点。它能够在后台执行任务,加快执行速度,并且占用较少的内存资源。这使得PhantomJS成为一个强大的工具,适用于自动化测试、网络爬虫、屏幕截图等各种应用场景。

这样看来,如果我们把Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情。

三、PhantomJS的工作原理

1、WebKit引擎


PhantomJS是一个基于WebKit的无界面浏览器,而WebKit是一个开源的浏览器引擎,被PhantomJS用于解析和渲染网页内容。
WebKit是一个跨平台的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这个框架来开发的。WebKit还支持移动设备和手机,包括iPhone和Android手机都是使用WebKit做为浏览器的核心。
WebKit负责处理HTML、CSS和JavaScript,并将它们转化为可视化的网页。它具有优秀的兼容性和高性能,是许多主流浏览器所采用的核心引擎之一。

2、页面加载和渲染流程

下面是PhantomJS利用WebKit浏览器引擎在后台进行网页加载和渲染的过程:

(1)发起网络请求

PhantomJS通过网络协议(如HTTP和HTTPS)向服务器发送请求,获取网页内容。

(2)HTML解析和DOM树构建

接收到网页内容后,PhantomJS进行HTML解析,将HTML文档转换为DOM树结构。
DOM树代表了网页的结构,每个元素都对应着DOM节点,可以通过节点进行操作和访问。

(3)样式处理和布局计算

PhantomJS处理CSS样式信息,匹配选择器与DOM节点,计算最终的样式结果。
样式信息包括字体、颜色、大小等,对页面外观和布局起着重要作用。

(4)页面渲染和资源加载

将DOM树和样式信息合成为最终的渲染结果。
渲染过程包括布局计算、绘制元素、处理图像等,将网页呈现给用户。
同时,PhantomJS会加载页面所需的资源,如图片、脚本和样式表等。

(5)JavaScript执行

PhantomJS支持JavaScript的执行,它能够对页面进行交互和动态效果的实现。
执行JavaScript代码可以触发事件、修改DOM内容等。

(6)渲染结果呈现

最终渲染结果可以在屏幕上显示给用户,也可以进行进一步处理,如截图、数据提取等操作。

四、PhantomJS的使用步骤及示例

1、安装和配置

PhantomJS官网下载地址:https://phantomjs.org/download.html
下载完毕后,解压压缩包,将文件夹放在我们python安装文件夹的下面:

进入bin文件夹,然后复制上面的路径,桌面右击我的电脑选择属性:

点击高级环境设置:

点击环境变量:

在下面的系统变量中找到Path并双击:

点击新建,将之前复制的bin的全路径粘贴进去,依次点击确定,完成配置:

然后打开cmd,输入phantomjs,按回车如果结果为下图则安装正确:

下面我们就可以使用phantomjs了。

2、在python中测试phantomjs

编写以下代码,使用PhantomJS浏览器打开百度:

# _*_ coding : utf-8 _*_
# @Time : 2023-09-23 11:45
# @Author : 光仔December
# @File : PhantomJS样例
# @Project : Python_Projectsfrom selenium import webdriverbrowser = webdriver.PhantomJS()  # 初始化浏览器
# 发送请求
browser.get('https://www.baidu.com/')  
print(browser.title)  # 打印页面的标题
# 退出模拟浏览器
browser.quit()  # 一定要退出!不退出会有残留进程

能够正常显示百度的标题,证明环境安装成功:

这里注意,新版的selenium已经放弃PhantomJS(两家分手了,官方推荐我们用Chrome或Firefox的无头版本来替代),所以可能会出现下面的报错:
AttributeError: module 'selenium.webdriver' has no attribute 'PhantomJS'

这里如果我们想要测试,需要把selenium版本降低(一般是2.48.0)。
通过pip show selenium显示当前的默认安装版本(我是4.12.0,先降级吧= =)。
先执行删除新版本

pip uninstall selenium

再安装指定版本

pip install selenium==2.48.0

3、使用phantomjs的步骤

(1)首先,确保你已经安装了Selenium和PhantomJS,并将它们添加到你的项目中。
(2)导入相应的包:

from selenium import webdriver

(3)创建一个PhantomJS的WebDriver实例:

driver = webdriver.PhantomJS()

(4)使用WebDriver打开网页:

driver.get("http://example.com")

(5)进行其他的操作,比如查找元素、点击按钮等:

element = driver.find_element_by_id("my-element")
element.click()

(6)最后,记得关闭WebDriver:

driver.quit()

这些代码将创建一个PhantomJS的WebDriver实例,并通过该实例控制浏览器行为。大家可以根据自己的需求,在代码中添加更多的操作和逻辑。请注意,从Selenium 4开始,PhantomJS被废弃了,建议使用基于Chrome的Headless模式代替。

4、实例

我们通过selenium操作PhantomJS模拟浏览器行为,百度搜索“我要学python”,获取第一个非广告的搜索结果,打印其标题和链接地址:

代码如下:

# _*_ coding : utf-8 _*_
# @Time : 2023-09-23 11:45
# @Author : 光仔December
# @File : PhantomJS样例
# @Project : Python_Projectsfrom selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.PhantomJS()  # 初始化浏览器
# 发送请求
browser.get('https://www.baidu.com/')
print(browser.title)  # 打印页面的标题
# (1)通过ID定位百度搜索的按钮
element1 = browser.find_element(By.ID, "su")
# (2)通过名称定位元素(百度的搜索输入框)
element2 = browser.find_element(By.NAME, "wd")
# 给输入框输入字符串“我要学python”
element2.send_keys("我要学python")
element1.click()  # 点击搜索
# 使用浏览器隐式等待3秒
browser.implicitly_wait(3)
resultObj = browser.find_element(By.XPATH, "//div[@id=\"content_left\"]//div[@id=\"1\"]")
url = resultObj.get_attribute("mu")
aObj = resultObj.find_element(By.TAG_NAME, "a")
text = aObj.text
# 获取
print("搜索‘我要学python’的第一个非广告结果:")
print("结果标题:", text)
print("地址链接:", url)
# 退出模拟浏览器
browser.quit()  # 一定要退出!不退出会有残留进程

效果:

PS:搞完了,我赶紧把selenium升级回4.12.0版本,以免影响后面新技术的学习= =。

由于selenium已经放弃PhantomJS,下一篇我们使用Chrome的无头版本来代替,学习Chrome的Handless无头浏览器的使用。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频
转载请注明出处:https://guangzai.blog.csdn.net/article/details/133203375

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

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

相关文章

CUDA学习笔记0924

一、nvprof分析线程束和内存读写 (1)线程束占用率分析 线程束占用率:nvprof --metrics achieved_occupancy (2)内存读写分析 内核数据读取效率:nvprof --metrics gld_throughput 程序对设备内存带宽利…

《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.4.1 Inception块 GoogLNet 中的基本卷积块叫做 Inception 块(大概率得名于盗梦空间),由 4 条并行路径组成。 前 3 条路径使用窗口…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中,为了真实模拟多个用户同时进行操作以度量服务器的处理能力,可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意:虽然通过加入集合点可…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数,不是关键字。 变量初始化,一般分为2步,变量声明变量内存分配,var 关键字就是用来声明变量的,new和make 函数主要是用来分配内存的。 var 声明值类型的变量时,系统会默…

Vector Art - 矢量艺术

什么是矢量艺术? 矢量图形允许创意人员构建高质量的艺术作品,具有干净的线条和形状,可以缩放到任何大小。探索这种文件格式如何为各种规模的项目提供创造性的机会。 什么是矢量艺术作品? 矢量艺术是由矢量图形组成的艺术。这些图形是基于…

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 第二题 题目来源 题目内容 解决方法 方法一:模拟 方法二:数学规律 方法三:分组 第三题 题目来源 题目内容 解决方法 方法一:数学方法 方法…

QT:使用行编辑器、文本编辑器、单选按钮、水平布局、垂直布局做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QTextEdit> //文本编辑器 #include <QRadioButton> //单选按钮class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *pare…

USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)

1.概述 如下图所示&#xff0c;Linux内核中USB主机体系结构由五部分组成&#xff0c;分别为Application Software、USB Class Driver、USB Core(USB Driver)、USB Host Controller Driver、USB Host Controller。应用程序处于用户空间&#xff0c;通过系统调用访问Class Drive…

关于计算机找不到d3dx9_43.dll,无法继续执行代码修复方法

d3dx9_43.dll是一个动态链接库文件&#xff0c;它是DirectX的一个组件&#xff0c;主要用于处理游戏中的图形、声音等多媒体元素。当这个文件丢失时&#xff0c;可能会导致以下问题&#xff1a; 1. 游戏无法正常运行&#xff1a;由于d3dx9_43.dll负责处理游戏中的多媒体元素&a…

Jumpserver堡垒机

一、堡垒机概述 1、堡垒机的基本概念 堡垒机也是一台服务器&#xff0c;在一个特定的网络环境下&#xff0c;为了保障网络和数据不受来自外部和内部用户的入侵和破坏&#xff0c;而运用各种技术手段实时收集、监控网络环境中每一个组成部分&#xff08;服务器&#xff09;的系…

C进阶-数据的存储

数据类型介绍 内置类型&#xff1a; //数据类型中的内置类型 // char //字符数据类型 // short //短整型 // int //整型 // long //长整型 // long long //更长的整型 // float //单精度浮点数 // double //双精度浮点数 //数据类型中的内置类型 单位是字节 // char //字…

大厂面试之算法篇

目录 前言 算法对于前端来说重要吗&#xff1f; 期待你的答案 算法 如何学习算法 算法基础知识 时间复杂度 空间复杂度 前端 数据结构 数组 最长递增子序列 买卖股票问题 买卖股票之交易明细 硬币找零问题 数组拼接最小值 奇偶排序 两数之和 三数之和 四数之…

速码!!BGP最全学习笔记:IBGP和EBGP基本配置

实验1&#xff1a;配置IBGP和EBGP 实验目的 熟悉IBGP和EBGP的应用场景掌握IBGP和EBGP的配置方法 实验拓扑 想要华为数通配套实验拓扑和配置笔记的朋友们点赞关注&#xff0c;评论区留下邮箱发给你! 实验步骤 1.IP地址的配置 R1的配置 <Huawei>system-view …

Android之AMessage机制存/取原理(四十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Fiddler抓包工具配置+Jmeter基本使用

一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前&#xff0c;得先学会如何抓包&#xff0c;这里以Fiddler为例。会抓包的同学可以跳过这一步&#xff0c;当然看看也是没坏处的…… 局域网络配置 将要进行抓包的手机与电脑连入同一局域网&#xff0c;电脑才能够抓到…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

阻塞队列-生产者消费者模型

阻塞队列介绍标准库阻塞队列使用基于阻塞队列的简单生产者消费者模型。实现一个简单型阻塞队列 &#xff08;基于数组实现&#xff09; 阻塞队列介绍 不要和之前学多线程的就绪队列搞混&#xff1b; 阻塞队列&#xff1a;也是一个队列&#xff0c;先进先出。带有特殊的功能 &…

PostgreSQL 技术内幕(十)WAL log 模块基本原理

事务日志是数据库的重要组成部分&#xff0c;记录了数据库系统中所有更改和操作的历史信息。 WAL log(Write Ahead Logging)也被称为xlog&#xff0c;是事务日志的一种&#xff0c;也是关系数据库系统中用于保证数据一致性和事务完整性的一系列技术&#xff0c;在数据库恢复、高…

若依前后端分离版搭建记录

一、如果是mysql8&#xff0c;得修改一下参数allowPublicKeyRetrieval为true&#xff0c;不然会报Public Key Retrieval is not allowed错误&#xff1a; 二、导入第二张表的数据库的时候&#xff0c;需要增加“--default-character-setutf8”参数才不会报错&#xff1a;

硕士应聘大专老师

招聘信息 当地人社局、学校&#xff08;官方&#xff09; 公众号&#xff08;推荐&#xff09;&#xff1a; 辅导员招聘 厦门人才就业信息平台 高校人才网V 公告出完没多久就要考试面试&#xff0c;提前联系当地院校&#xff0c;问是否招人。 校招南方某些学校会直接去招老师。…