问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样使用PhantomJSDriver啊,配置代码应该怎样写

发布网友 发布时间:2022-04-18 03:32

我来回答

2个回答

懂视网 时间:2022-04-18 07:53

有人说Selenium库和PhantomJ,说他们结合使用是万能的利器。那么,他们真的那么厉害吗,我们一起来看看Selenium库的用法吧。通过这篇文章让我们来看一下Selenium库结合PhantomJs,Chrome等一些浏览器的操作吧。

zz.jpg

什么是Selenium

Selenium是一个自动化测试工具,支持包括Chrome,Firefox,Safari,PhantomJs等一些浏览器。如果用于爬虫中,我们主要用来解决一些JavaScript渲染的问题。

我们在使用Requests库去请求一些网页的时候,比如 163music,我们获得的响应数据呢,并不全是我们在浏览器中看到的信息。他可能是通过js渲染出来的。那么,我们如果使用Selenium库,就不会再去关心如何去解决这种问题了。

因为我们的浏览器,比如PhantomJs,他就是一个无界面的浏览器,他用来渲染解析js,而Selenium库就负责给浏览器发送一些命令,模拟一些比如下拉,拖拽,翻页,输入表单等动作。这样他们两个结合,对于那些 JS 的渲染问题是不是完美解决了。

注意

虽然Selenium库加上PhantomJs很好用,但是他毕竟是驱动一个浏览器,然后获取数据。所以在我们使用中,会发现他并没有我们使用一些解析库速度快。这其实就是他的弊端,所以我还是建议大家,不到实在找不到解决办法的时候,不去使用他们。

安装准备

pip直接安装Selenium库:

pip install selenium

浏览器驱动的安装:

Chrome浏览器驱动

PhantomJs浏览器驱动

我们需要把安装好的浏览器驱动配置到我们的环境变量。对于Windows用户,配置环境变量比较麻烦。我们需要找到下载好的驱动位置,然后复制他的文件位置,见他粘贴到环境变量即可。

配置完成,命令行输入:

phantomjs -v

查看是否成功。

使用样例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
 
 
browser = webdriver.Chrome()
 
try:
 browser.get('http://www.yukunweb.com')
 input = browser.find_element_by_id('s')
 input.send_keys('Python')
 input.send_keys(Keys.ENTER)
 wait = WebDriverWait(browser, 10)
 wait.until(EC.presence_of_element_located((By.ID, 'main')))
 print(browser.current_url)
 print(browser.page_source)
finally:
 browser.close()

如果我们运行上面的代码,会看到本地打开了一个Chrome浏览器,然后在浏览器地址栏输入了我的博客网址,然后他会自动的在搜索栏输入‘Python’,并且点击了回车搜索。并且将结果页的url和源代码打印出来。

我们的例子都是使用Chrome浏览器来操作,因为PhantomJs是无界面的,不方便查看到效果。如果大家运行错误的话,一般情况是浏览器并没有打开,那么应该是大家没有安装好Chrome浏览器,或者没有将驱动配置环境变量。

那么这几行代码究竟是什么意思呢,我们究竟赋予了什么指令呢?

声明浏览器对象

from selenium import webdriver
 
browser = webdriver.Chrome()
# 声明其他浏览器
browser = webdriver.PhantomJs()
browser = webdriver.Firefox()

这就相当于我们调用了Selenium库的webdriver方法,实例化一个Chrome浏览器给我们调用。

访问页面

from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('http://www.yukunweb.com')

我们将要访问的url传给get方法。调用浏览器访问url。

查找元素

input = browser.find_element_by_id('s')

这句代码调用find_element_by_id方法,顾名思义,就是查找id为‘s’的标签,那么如果是操作class为‘s’的话,就是find_element_by_class('s')。

当然,我们还可以使用 CSS选择器和xpath选择器查找元素:

input = browser.find_element_by_css_selector("#s")
print(input)
input = browser.find_element_by_xpath('//*[@id="s"]')
print(input)

通过打印结果,可以看到不管使用什么选择器,查找结果都是一样的。下面是一些查找api:

find_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector

查找多个元素

如果我们查找的元素是网页中的li标签,是很多的元素。那么我们的查找方式和单个元素是相同的,只是对于查找的api我们需要在element后面加个复数形式 s。即是:

find_elements_by_namefind_elements_by_xpathfind_elements_by_link_textfind_elements_by_partial_link_textfind_elements_by_tag_namefind_elements_by_class_namefind_elements_by_css_selector

元素交互操作

即是对于我们获取的元素下达指令,调用交互的方法。

browser.get('http://www.yukunweb.com')
input = browser.find_element_by_id('s')
input.send_keys('Python')
input.send_keys(Keys.ENTER)


这段代码中,我们首先查找到了id为‘s’的元素,然后传给他‘Python’值,然后调用交互方法,敲了回车。

当然,在大多是情况下,我们不能直接使用敲击回车的方法,因为我们不确定是不是敲了回车,表单就提交了。我们需要使用查找器查找到提交按钮元素,然后模拟点击:

button = browser.find_element_by_class_name('xxxx')
button.click()
# 清除表单信息
button.clear()

那么,我们可以看到在模拟登陆时候,直接让我们手动的输入账号,密码,如果有验证码的话直接给一个input方法,我们手动输入验证码传给表单,是不是很简单的就模拟登录了了。

交互动作

元素交互动作与上面的操作是不同的。上面的操作需要获得一个特定的元素。然后对这个特定的元素调用一些指令,才可以完成交互。而这个交互是将这些动作附加到动作链中串行执行。

我们以拖拽元素为例(我们需要导入ACtionChains方法):

from selenium import webdriver
from selenium.webdriver import ActionChains
 
browser = webdriver.Chrome()
 
browser.get(url)
source = browser.find_element_by_name("source")
target = browser.find_element_by_name("target")
actions = ActionChains(browser)
actions.drag_and_drop(source, target).perform()

这里的sourcs是我们要拖拽的元素,我们使用查找器找到他,target就是我们要拖拽到的位置元素。然后调用ActionChains方法,实现拖拽操作。

执行JavaScript

有些动作呢,Selenium库并没有为我们提供特定的api,比如说将浏览器进度条下拉,这个实现起来是很难的。那么我们就可以通过让Selenium执行JS来实现进度条的下拉,这个得需要一些js的知识,不过还是很简单的。

from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('http://www.yukunweb.com')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("到达底部")')

这就相当于我们将一些JS命令传给Selenium的execute_script这个api,我们运行就可以看到浏览器下拉到底部,然后弹出会话框。

获取元素文本值

如果我们查找得到一个元素,我们要怎样获得元素的一些属性和文本信息呢?

from selenium import webdriver
 
browser = webdriver.Chrome()
 
browser.get('http://www.yukunweb.com')
name = browser.find_element_by_css_selector('#kratos-logo > a')
print(name.text)
print(name.get_attribute('href'))

运行结果可以看到,他打印出了‘意外’和他的url。

Frame框架

有些网页在我们直接使用Selenium驱动浏览器打印源码的时候,并没有如期获得想要的数据,那在我们查看网页源码的时候,可以看到网页的iframe标签包裹的一个一个的框架。那么这就需要我们请求对应框架,拿到源码了。

我们以网易云音乐的歌手栏为例。

from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://music.163.com/#/discover/artist/signed/')
 
print(browser.page_source)

可以查看结果,并没有我们想要的信息。

from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://music.163.com/#/discover/artist/signed/')
browser.switch_to.frame('contentFrame')
 
print(browser.page_source)

这次打印,我们就可以看到我们需要的信息了,是不是很简单。

显示等待

在文章开始的时候,我们运行的那段代码中有一段代码是不是还没有说。那就是我们命令浏览器等待的操作。

等待有两种方式,一种是隐士等待,一种是显示等待。当使用了隐士等待执行时,如果浏览器没有找到指定元素,将继续等待,如果超出设定时间就会抛出找不到元素的异常。而大多数情况我们建议使用显示等待。

显示等待是你指定一个等待的条件,还指定一个最长等待时间。那么程序会在最长等待时间内,判断条件是否成立,如果成立,立即返回。如果不成立,他会一直等待,直到最长等待时间结束,如果条件仍然不满足,就返回异常。

wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.ID, 'main')))

这里的By.ID方法实际上就是一个查找的万能方法,而我们直接查找或者使用CSS、xpath查找足够满足,我也不过多介绍,想要了解可以查看官方文档。

这里是知道查找到id为‘main’就返回。

显示等待的一些条件还有:

title_is 标题是某内容

title_contains 标题包含某内容

presence_of_element_located 元素加载出,传入定位元组,如(By.ID, ‘p’)

visibility_of_element_located 元素可见,传入定位元组

visibility_of_element_located 元素可见,传入定位元组

visibility_of_element_located 元素可见,传入定位元组

visibility_of 可见,传入元素对象

presence_of_all_elements_located 所有元素加载出

text_to_be_present_in_element 某个元素文本包含某文字

text_to_be_present_in_element_value 某个元素值包含某文字

frame_to_be_available_and_switch_to_it frame加载并切换

invisibility_of_element_located 元素不可见

element_to_be_clickable 元素可点击

staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新

element_to_be_selected 元素可选择,传元素对象

element_located_to_be_selected 元素可选择,传入定位元组

element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False

element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False

alert_is_present 是否出现Alert


窗口选择

如果我们在表单输入关键词,提交表单后浏览器新打开了一个窗口,那么我们要怎么去操作新的窗口呢?索性Selenium为我们提供了对应的api.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
 
browser = webdriver.Chrome()
browser.get('http://www.23us.cc/')
input = browser.find_element_by_id('bdcs-search-form-input')
input.send_keys('斗破苍穹')
input.send_keys(Keys.ENTER)
browser.switch_to_window(browser.window_handles[1])
print(browser.current_url)
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
print(browser.current_url)

通过打印结果,不难看出先打印了搜索结果窗口url,然后打印了索引页url。要注意窗口的索引是从 0 开始的哦,这个大家都明白。

异常处理

异常处理和普通的异常处理一样,没有什么要说的,大家自己查看官方异常 api.地址

最后

好了,通过本篇文章希望大家可以基本上了解Selenium库结合浏览器驱动的一些使用方法。我们例子里使用的是Chrome,但是大家在实际的代码里最好是使用PhantomJs,因为他是无界面的,运行起来相对好一点。

文章开始说过一般情况下不建议大家使用Selenium,因为他很慢。但是即使是慢,也很爽啊,是不是。

热心网友 时间:2022-04-18 05:01

System.setProperty("phantomjs.binary.path",
"D:\\selenium\\phantomjs.exe");
DesiredCapabilities desiredCapabilities = DesiredCapabilities.phantomjs();
PhantomJSDriver driver = new PhantomJSDriver(desiredCapabilities);
phantomJs怎样在linux下使用

phantomjs想在linux下配置应该怎样写, System.setProperty("phantomjs.binary.path", "D:\\selenium\\phantomjs.exe"); DesiredCapabilities desiredCapabilities = DesiredCapabilities.phantomjs(); PhantomJSDriver driver = new PhantomJSDriver(desiredCapabilities); 这种只能在windox下运行啊,在linux下...

如何在selenium+phantomjs上使用高匿代理

下载最新的chrome driver,然后放到一个目录下,再手动置顶chrome driver位置进行调用 java代码如下 System.setProperty("webdriver.chrome.driver", "D:\\software\\chromedriver_win32\\chromedriver.exe"); Python应该是类似

Selenium和PhantomJS 终极最全使用总结

02 隐示等待 隐性等待对整个driver的周期都起作用,所以只要设置一次即可 隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。 driver.implicitly_wait(30) # 隐性等待,最长等30秒 03 显示等待 这里需要特别注意的是un...

使用phantomjs爬取页面内容时,内存占用过多如何解决

怎说,我当时写爬虫的时候,也是开了多台gecodriver的进程,但是我用Python监控了cpu的资源管理,占用率太高了我就kill掉一部分的进程,如果是进程本身就死掉当然会kill并且有重启机制。当然最后稳定下来确定了每台机器开几个进程利用率很高。

谷歌浏览器驱动的安装及selenium的安装与使用

步骤总结第一步:下载安装selenium 使用pip命令或在pycharm解释器下搜索安装。第二步:下载安装谷歌浏览器驱动首先查看浏览器版本,这将帮助您找到对应的驱动版本。在Chrome菜单的“帮助”中找到“关于 Google Chrome”以查看版本号。我的浏览器版本为116.0.5845.180。访问chromedriver.storage.googleapis.com...

poi数据获取、学校poi分布、医院poi分布、公园分布、地铁分布

使用Python中的Selenium和PhantomJS完成网页抓取。主要代码如下:python from bs4 import BeautifulSoup from selenium import webdriver def get_university(url):print(url)driver = webdriver.PhantomJS(executable_path=r'D:\Python27\phantomjs-2.1.1-windows\bin\phantomjs.exe')driver.get(url)data ...

...第4篇:Selenium课程概要,selenium的介绍【附代码文档】

无界面与有界面浏览器的选择:PhantomJS适合无头模式爬取,而ChromeDriver则适用于需要视觉界面的情况。Selenium的安装与使用:安装Python的selenium模块,并配置与Chrome或PhantomJS的对应webdriver。基本操作演示:通过实例展示如何使用Selenium进行百度搜索,包括点击和输入操作。数据提取:掌握driver对象的属性和...

java怎么关闭phantomjs

1 安装phantomjs brew install phantomjs 2 建立js文件 / Created by xiehonghao on 16-7-24./ //codes.js system = require('system')address = system.args[1];//获得命令行第二个参数 接下来会用到 //console.log('Loading a web page');var page = require('webpage').create()...

Selenium-remote-webdriver使用指南

文章列举了多个进程的资源占用情况,这些都是运行PhantomJS时的实例。然而,值得注意的是,Selenium远程Web驱动接口并不支持PhantomJS,目前推荐使用的浏览器包括Android、Chrome、Firefox、HTMLUnit等,不包括PhantomJS。解决此问题的方法是通过配置服务器,例如在Ubuntu上使用selenium-server-standalone.jar和...

怎么用Python获取Chrome的地址栏句柄

代码如下所示:?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 coding=utf-8 import os from selenium import webdriver PhantomJS无界面浏览器 driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")打开火狐浏览器 driver = webdriver.Firefox()url...

写代码对电脑配置要求 敲代码用什么配置的电脑 写代码电脑配置 跑代码用什么电脑配置 此设备的配置不正确 代码1 由于其配置信息代码19 电脑配置代码 噬血代码配置要求 网络配置怎么设置
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求大神指导如何用小米4进入单手模式,home划了半天没反应?如何进入安全... 首次买社保未满一年,转其它公司怎么续交?(同一城市) 小米4有单手模式么? 江苏库存玻璃外墙维修上门服务 安徽警示柱厂家 数学题求解?高数 会的进? 初一数学问题高手进,低手也看看啊,求~~~ 问各位一道数学题,不难,会的进! TMD数学题,会的都进来看看。 初二数学题,会的进 百度旗下人工助手小度一直通着电源使用是否可以? 求助高手:求解我的紫微斗数星盘,非常感谢! 有天生就适合炒股的人吗,这些人有什么特点吗? 懂的人~ -v-|||请帮我看一下~~~这个紫薇星盘我第一次算,不懂哎- -! 什么样的人(命盘)适合炒股哦,紫微斗数的,望指教 想问一下,什么样的命盘适合炒股 适合炒股的星盘特征 流感是怎么传染的啊?要怎么预防啊?我真被这段时间的流感情况吓怕了! python 怎么使用selenium phantomjs 请问个体定额税是怎么算的 螺丝钉头上有个米字是什么做用 螺丝刀是轮轴还是杠杆 ak螺丝刀怎么样 最有效减肥药哪个好 怎么才能瘦脸最快最有效 怎样安全瘦脸?什么减肥药瘦脸效果最好? 吃什么减肥药可以瘦脸的啊?我想瘦身瘦脸哇 吃什么减肥药效果好 分享怎么样可以瘦脸最快最有效 瘦脸效果好的减肥产品,什么瘦脸产品最有效 可以瘦脸的减肥药? 什么产品瘦脸效果最好 联通200兆光纤,用360测速的话,一般下载速度是多少? GB/T601-2016规定量取35.00~40.00ml,为什么没有单标35mL移液管这种规格? 如果用规格为10ml的移液管移取8ml溶液,应如何操作? 什么是单标移液管 我装的是200m宽带现在测速现在只有-35是怎么回事啊? 配置标准曲线怎么选择移液管? 容量瓶100ml于烧杯的100ml 能否在量筒量瓶中直接溶解固体试剂?为什么? 请问,在用大肚子移液管移取50ml溶液时,结果表示是50.0还是50.00ml?谢谢! 移液管的使用步骤是什么? 移液管末端残液需要吹出吗 浓度为1的标准溶液稀释成0.1的怎么稀释 应用多元分析王学民版第四版和第五版区别大吗 联想笔记本电脑使用过程中突然出现 no bootable device,电脑优先启动项里只有光盘、没有硬盘选项? 联想win8笔记本开机显示no bootable device--please restart s_百度问一问 笔记本电脑出现了No bootable device -- Please restart syst 家庭煎牛肉怎么做好吃 联想笔记本,换新系统后不能开机了,no bootable device? 联想笔记本g470无法开机出现no bootabledevice,怎么办 联想笔记本电脑开机以后写的 no bootable device是怎么回事啊?