Selenium+PhantomJs解析渲染Js的基本操作

有人说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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom 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 webdriverfrom 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 timefrom selenium import webdriverfrom 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,因为他很慢。但是即使是慢,也很爽啊,是不是。

以上就是Selenium+PhantomJs解析渲染Js的基本操作的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2258802.html

(0)
上一篇 2025年2月27日 04:28:20
下一篇 2025年2月26日 00:28:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Cookie介绍和模拟登录演示

    Cookie可以说是和我们的生活息息相关,当你在淘宝购物的时候,那些推荐的宝贝就是Cookie的杰作。 上一篇我们讲解的是Selenium+PhantomJs的基本操作,今天给大家带来的是Cookie的介绍和模拟登录演示。 什么是Cooki…

    2025年2月27日
    200
  • 强大的爬虫框架Scrapy是什么?

    网络爬虫(web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面,以获取这些网站的内容。而scrapy则是一种十分强大的爬虫框架,并…

    2025年2月27日
    200
  • python可以开发什么

    python是一个非常好用的编程语言,开发的速度非常快,而且语法简单,通俗易懂,很容易上手,很适合初学者学习,对于python的了解,很多人只知道python与人工智能关系密切,却不知道python的其他用途,其实学好python还可以做很…

    2025年2月27日
    200
  • 自学python有什么网站

    python是未来人工智能最好的编程语言,很多程序员在有其她编程基础的情况选择学习python是比较容易的,当然现在很多想进入编程界的新手选择python开始接触学习编程,但是由于经费有限,只能选择最便宜的学习方式就是自学成才,不管是新手还…

    2025年2月27日
    200
  • 在python中不等于用什么来表示

    在python中不等于用什么来表示十分简单,并且应用十分广泛。 推荐手册:Python 基础入门教程 在Python语言中,用 != 表示不等于。我们通过下面一个简单的例子来 理解: >>> x=3>>>…

    2025年2月27日
    200
  • python如何对字符串大小写进行转换

    在python中,关于将字符串大小写转化的方法十分简单,下面给大家演示一下: upper()将小写字母转换成大写字母;lower()将大写字母转换成小写字母;capitalize()只将第一个字母转换为大写;title()将每个单词的第一个…

    2025年2月27日
    200
  • 如何用python统计不同字符个数

    如何计算一个字符串中不同字符出现的次数呢? 那就用强大的python来解决吧! 示例 #统计不同字符的次数str_1 = input(“请输入一串字符:”)result = {}for i in str_1:    result[i] = …

    2025年2月27日
    200
  • python怎么发音

    python的读音及注解如下: python英                                                                                                […

    2025年2月27日
    200
  • python如何赚外快

    python是目前最流行的编程语言,那么学好python怎样才能增加自己的额外收入呢?那就是用爬虫 今天分两类人说一说这个事: 如果是在校学生 最好是数学或计算机相关专业,编程能力还可以的话,稍微看一下爬虫知识,主要涉及一门语言的爬虫库、h…

    2025年2月27日
    200
  • python的浮点数占几个字节

    浮点数是用机器上浮点数的本机双精度(64 bit)表示的。提供大约17位的精度和范围从-308到308的指数。和c语言里面的double类型相同。python不支持32bit的单精度浮点数。如果程序需要精确控制区间和数字精度,可以考虑使用n…

    2025年2月27日
    200

发表回复

登录后才能评论