# 1.2. selenium的使用
# 目标
- 了解selenium和phantomjs以及chromedriver是什么以及如何安装
- 掌握selenium的控制浏览器的方法
- 掌握selenium获取元素中数据的方法
# 1. 什么是selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
# 2. PhantomJS的介绍
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript
# 3. Chromedriver的介绍
Chromedriver 也是一个能够被selenium驱动的浏览器,但是和PhantomJS的区别在于它是有界面的
# 4. driver的安装
最简单的安装方式是:解压后把bin目录下的可执行文件移动到环境变量下,比如/usr/bin
或者是/usr/local/bin
下面
注意:Chromedriver和电脑上的chrome版本有对应关系,建议使用最新的Chromedriver版本并且更新chrome浏览器到最新版
# 5. selenium的入门使用
知识点:
- 掌握如何发送请求,加载网页
- 掌握如何进行简单的元素定位
- 掌握如何从获取浏览器中的数据
加载网页: selenium通过控制浏览器,所以对应的获取的数据都是elements中的内容
from selenium import webdriver driver = webdriver.PhantomJS(“c:…/pantomjs.exe”) driver.get("http://www.baidu.com/") driver.save_screenshot("长城.png")
1
2
3
4定位和操作:
driver.find_element_by_id(“kw”).send_keys(“长城”) driver.find_element_by_id("su").click()
1
2查看请求信息:
driver.page_source driver.get_cookies() driver.current_url
1
2
3退出
driver.close() #退出当前页面 driver.quit() #退出浏览器
1
2
# 6.练习
模拟登陆豆瓣网
# 7. selenium的定位操作
知识点:
- 掌握定位元素的方法
- 掌握获取元素中数据的方法
定位元素语法:
find_element_by_id (返回一个元素) find_elements_by_xpath (返回一个包含元素的列表) find_elements_by_link_text (根据连接文本获取元素列表) find_elements_by_partial_link_text (根据连接包含的文本获取元素列表) find_elements_by_tag_name (根据标签名获取元素列表) find_elements_by_class_name (根据类名获取元素列表)
1
2
3
4
5
6注意:
find_element
和find_elements
的区别by_link_text
和by_partial_link_tex
的区别:全部文本和包含某个文本使用:
以豆瓣首页为例:https://www.douban.com/ (opens new window)
from selenium import webdriver driver =webdriver.Chrome() driver.get("https://www.douban.com/") ret1 = driver.find_element_by_id("anony-nav") print(ret1) # 输出为:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")> ret2 = driver.find_elements_by_id("anony-nav") print(ret2) #输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>] ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a") print(len(ret3)) #输出为:1 ret4 = driver.find_elements_by_tag_name("h1") print(len(ret4)) #输出为:1 ret5 = driver.find_elements_by_link_text("下载豆瓣 App") print(len(ret5)) #输出为:1 ret6 = driver.find_elements_by_partial_link_text("豆瓣") print(len(ret6)) #输出为:28 driver.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31获取数据语法
- find_element仅仅能够获取元素,不能顾直接获取其中的数据,
find_element_by_xapth
也是这样 - 获取文本:
element.text
- 获取属性值:
element.get_attribute("href")
- find_element仅仅能够获取元素,不能顾直接获取其中的数据,
使用示例:
from selenium import webdriver
driver =webdriver.Chrome()
driver.get("https://www.douban.com/")
ret4 = driver.find_elements_by_tag_name("h1")
print(ret4[0].text)
#输出:豆瓣
ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
print(ret5[0].get_attribute("href"))
#输出:https://www.douban.com/doubanapp/app?channel=nimingye
driver.close()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 8. selenium 处理cookie
通过driver.get_cookies()
能够获取所有的cookie
# 把cookie转化为字典
{cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
2
3
4
5
6
7
# 9. 页面等待
为什么需要等待
如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错
页面等待的方法
time.sleep(10)
# 9.动手
爬取斗鱼直播平台的所有房间信息:https://www.douyu.com/directory/all (opens new window)
思路分析:
数据的位置
每个房间的数据都在
id=live-list-contentbox
的ul中实现翻页和控制程序结束
selenium中通过点击就可以实现翻页,观察存在下一页和不存在下一页时候标签的变化
存在下一页时:
不存在下一页时:
# 10. 使用selenium切换frame
frame是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是 driver.switch_to.frame()
动手:模拟登陆qq邮箱
在使用selenium登录qq邮箱的过程中,我们会发现,无法在邮箱的登录input标签中输入内容,通过观察源码可以发现,form表单在一个frame中,所以需要切换到frame中
# 11. selenium的优缺点
- selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
- selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用
# 11. 作业
完成网易云音乐的所有分类下的所有的播放列表,包括:播放列表的标题和url地址
思路分析:
确定程序入口的位置 首先可以定位到所有的大分类和所有的小分类
获取所有的小分类的地址后,遍历请求获取播放列表页的首页
确定首页数据的位置和url地址
数据不是在url地址对应的响应中,而是在另一个url地址中,可以使用selenium,也可以使用requests来获取
实现翻页和程序停止的判断
存在下一页的情况:
不存在下一页的情况
地址:http://music.163.com/#/discover/playlist (opens new window)
# 小结
- 本小结重点
- 掌握selenium和driver的安装
- 掌握selenium操作浏览器的方法
- 掌握selenium定位页面数据的方法