Selenium简介
Selenium是一个Web应用的自动化框架,利用它,我们可以编写相关的自动化程序,让程序完全像人一样在浏览器里面操作Web界面,比如模拟鼠标点击、模拟键盘输入等等。不但能够操作Web界面,还能从Web中获取信息,并且相对来说,使用Selenium来获取信息更加简单,它的基本原理是我们编写自动化程序之后利用浏览器驱动直接对浏览器进行操作,因此原理上来说,只要我们用户能在浏览器上获得的信息使用Selenium都可以获得,在我们编写爬虫程序的时候,最经常使用的可能是requests
了,可实际上在很多网站,它们不是静态网页,有很多东西并不在源代码中,这个时候如果继续使用它就需要使用很多前端的知识了,要对网页进行分析找出来真实的url
,或者对相关js文件解密等等,需要我们掌握一定的知识并且需要进行分析,而如果使用Selenium,则就完全可以傻瓜式的抓我们想要的东西了哈哈哈哈,我觉得,除了速度慢一点,其它方面Selenium几乎无敌。当然,Selenium是一个自动化测试框架,它能做的远不止抓数据这么简单,究竟怎么使用,还是因人而异了。
环境准备
首先使用它肯定要先搭建环境,很简单,我们只需要Selenium这个库以及我们要使用的浏览器驱动即可。
安装Selenium库
以管理员身份打开cmd
输入:
pip install selenium
对了,在安装库的时候可以选择使用国内的一些镜像源,可以极大了提高下载速度,避免有时候连接不上下载失败等情况。具体教程非常简单,自行百度即可。
安装浏览器驱动
如果使用Selenium,浏览器驱动是少不了的,程序本身并不能直接对网页浏览器进行操作,必须要借助浏览器驱动,并且,你使用哪个浏览器,必须要安装对应的浏览器驱动,同时,安装的驱动还有版本区别,==一定要安装自己使用的浏览器版本被支持的驱动==,为了方便大家下载驱动,这里我直接给出几个常用的浏览器驱动下载地址:
- Chrome驱动下载地址:
http://chromedriver.storage.googleapis.com/index.html
- IE驱动下载地址:
http://selenium-release.storage.googleapis.com/index.html
- Edge驱动下载地址:
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Firefox驱动下载地址:
https://github.com/mozilla/geckodriver/releases
最后强调一下,要下载对应版本的浏览器驱动,这个不知道对应版本的同志们自行百度吧。
使用
导入
我们使用Selenium操控浏览器的话,只需要导入其中的Webdriver
方法即可,顾名思义,Web老司机,有了它就够了。不过,有时候也需要使用其中的鼠标事件和键盘事件,也就是模拟鼠标操作和键盘操作,不过Webdriver里面以及自带了经常使用的鼠标点击和键盘输入字符等操作,因此鼠标事件和键盘事件还是因需而用吧,这里给出全部的导入方法。
#这是导入Webdriver类,一般使用有它就够了。
from selenium import webdriver
#这是导入鼠标事件,使用鼠标的复杂操作方法都包含在此方法内
from selenium.webdriver.common.action_chains import ActionChains
#这是导入键盘事件,使用键盘的复杂操作方法都包含在此方法内
from selenium.webdriver.common.keys import Keys
另外,强调一点,所说无绝对,如上面鼠标事件里面也包含了一些键盘的使用方法,这个的话在您深入使用的时候再自行了解吧。
相关方法
在Selenium中有很多很多可供我们使用的方法,在这里我仅根据经验及判断给出最常用的一些方法。
- 利用浏览器驱动建立一个webdriver对象
driver = webdriver.Chrome('D:\chromedriver_win32\chromedriver')
#注意,此例以Chrome浏览器为例,在如上语句中括号内参数可以为空,为空的话保证驱动的位置在python解释器的目录下,否则需要写入驱动所在位置,
#经过这条语句,driver即为一个webdriver对象,程序将自动打开一个Chrome浏览器。
- 打开要访问的网页
url = ''#这个为目标网址
#只需要对webdriver对象使用get方法即可打开要访问的网页
driver.get(url)
- 浏览器最大化最小化
#最大化
driver.maximize_window()
#最小化
driver.minimize_window()
- 控制浏览器前进后退
#前进
driver.forward()
#后退
driver.back()
- 设置浏览器的宽和高
#宽为400,高为800
driver.set_window_size(400,800)
- 刷新页面
driver.refresh()
这几个是常用的对浏览器操作的方法,操作对象都是webdriver对象,还有一些对元素操作的方法,也就是对界面里面目标元素操作的方法,既然要对界面操作,且界面远比这个窗口复杂的多,所以对目标元素的定位成为了重中之重,可以说,对元素的准确定位是会使用webdirver的核心,下面给出对元素进行定位的方法。
元素定位
对于元素定位,这里需要一些前端的知识,如对HTML组成的一些了解等等,本文默认读者了解HTML。
元素定位以方便我们对其进行操作,比如我们需要让鼠标点击一下网页中的某张图片,因为网页都是由HTML转换成的,我们只要在HTML中找到图片的位置,这个位置肯定是在一个标签中,我们先精准定位它,然后让鼠标点击一下这个标签即可。
常用的定位方法有以下几种:
- 通过标签名字进行定位
driver.find_element_by_tag_name(tag_name)
顾名思义,这种方法只需要标签名即可定位,但是大家都知道,每个HTML网页中相同标签名的标签不计其数,因此这种方法其实也用的很少,单纯使用它只会定位第一个此标签名的元素,不过可以定位此标签名的所有元素,这在后文会有介绍。
- 通过id进行定位
driver.find_element_by_id(id)
对于id,它就像标签的身份证一样,不会重复,因此对于有id的标签,使用它完全可以精准定位,不过大家也猜出来了,不是所有元素都有id的,因此这种方法在很多情况下也没法使用。不过有对有id的元素使用它还是非常方便的。
- 通过classname进行定位
driver.find_element_by_class_name(classname)
对于class,它是标签中的一种属性,classname是class对应的值,因为这种属性名称应用比较广泛,因此Selenium专门提供了一种使用它查询的方法,不过要注意的是,和id一样,有些标签没有这个属性。
- 通过name进行定位
driver.find_element_by_name(name)
注意一下,这个name, 也是标签中的一个属性,它不是标签的名字,标签名字的定位方法在本节开头,既然也是属性,详情参考前文。
- 通过xpath进行定位
driver.find_element_by_xpath(xpath)
xpath大家应该听说过吧,它是一种语法,常被用来选取未知的XML元素,它具有固定的语法规则,一般来讲XPath经常和lxml配合使用解析网页,使用过lxml的大家应该对其非常熟悉,在这里只需要输入你想定位的元素的xpath路径即可根据此方法精确定位了。
- 通过css selector进行定位
driver.find_element_by_css_selector(cssselector)
不得不说,这个方法应该是我们最经常使用的方法了,至少对我而言是的,CSS也是一种语法,不过我感觉相对XPath来讲更简单实用,简单介绍一下,CSS通常和HTML一起使用开发Web页面,它是一种标记语言,主要作用是改变网页页面中元素的大小、位置、方向、颜色等等等等,既然它是操控元素的,那么肯定能定位,并且能非常精准定位,因此它是一个非常好用的定位元素方法。
最后总结一下,上边这些就是常用的元素定位方法,哈哈哈其实以及包含的差不多了,只剩下超链接定位方法了,不过那个自我感觉用的不多,感兴趣自行了解,然后需要统一说明的是,上边这些方法都是定位单个元素,以标签名称定位为例,可能网页中相同标签名的元素不计其数,那么此方法就是定位此标签名的第一个元素,有时候我们需要定位某个标签名的全部元素,只需要:
driver.find_elements_by_tag_name(tag name)
即可,注意观察,只是element后面多了个s而已,这样定位的话返回的就是包含所有此标签名元素的一个列表,后续处理的话对列表进行遍历就可以了,同样的,上面列举的所有定位方法加个s就变成了定位相同目标的全部元素。
元素控制
在webdirver中,包含了简单的鼠标点击和键盘输入方法,具体示例如下:
#对选中的id='XXX'的元素进行鼠标点击
driver.find_element_by_id('XXX').click()
#对选中的id='XXX'的元素输入'words'
driver.find_element_by_id('XXX').send_keys('words')
鼠标事件
是的,操作就是这么简单,它已经可以满足我们的一些基本需求了,但是更复杂的需求就不行了,不过我们可以用鼠标事件和键盘事件来处理,导入方法看前文,下面给出相应的使用方法(假设E为已经选中的元素,即webdriver element对象,driver和前文一样,为webdriver对象):
鼠标事件使用方法作用ActionChains(driver).click(E)鼠标左击ActionChains(driver).context_click(E)鼠标右击ActionChains(driver).double_click(E)鼠标左键双击ActionChains(driver).move_to_element(E)将鼠标光标移动到该元素的中间,不点击ActionChains(driver).drag_and_drop(E,new E)在E上按下左键将其拖动到新的E上ActionChains(driver).click_and_hold(E)在该元素上按下左键,不松开ActionChains(driver).release()释放鼠标
上面这些就是常用鼠标事件的使用方法了,它们已经可以很好的模拟我们鼠标的各种操作(除了滚轮),其实它还包括了两种简单的键盘操作,这个不介绍了,因为后文的键盘事件非常强大,但是需要注意的是,鼠标事件中所有的方法引用只是对鼠标下了指令,它不会执行,让其执行必须在方法后面加上.perform()
,注意这一点非常重要,不加的话是不会执行的,举个例子:
#让鼠标在E上双击
ActionChains(driver).click(E).perform()
#让鼠标从原位置移动到E上双击E
ActionChains(driver).move_to_element(E).double_click(E).perform()
如上所示,在方法使用之后需要加上.perform()
,对了,像double_click
一样,除了移动光标和拖住两种方法外,其括号内的参数可以省略,这样的话默认在原位置进行操作,比如示例中的双击方法若没有E参数,和原效果是一样的,因为E已经被移动到了目标位置,双击的话是在此处进行的,不过建议都写上也方便读哈哈哈。
键盘事件
键盘事件比较简单,因为在键盘事件中每个键都对应了方法,它怎么使用呢?一般和send_keys()
配合使用,而对于键盘上的字母呢,直接输入即可不需要键盘事件,举个例子:
#通过id定位元素之后让键盘输入Python
driver.find_element_by_id('XXX').send_keys('Python')
#通过id定位之后需要敲击回车
driver.find_element_by_id('XXX').send_keys(Keys.ENTER)
#通过id定位之后需要需要按下退格键
driver.find_element_by_id('XXX').sned_keys(Keys.BACK_SPACE)
看到这儿大家已经明白了,对于字母键直接输入相应字母,而对于其它功能键,在前边导入的Keys
方法中已经包含了引用每个键的方法,都是一个套路,到时候根据需要使用即可。
有的同学可能已经想到了,如果需要输入组合键怎么办!当然,键盘事件也可以使用组合键!如例:
#全选的快捷键Ctrl + A
.send_keys(Keys.CONTROL,'a')
#复制的快捷键Ctrl + C
.send_keys(Keys.CONTROL,'c')
......
一些常用的组合键如上所示,如果还需要那些深度的按键组合的话,比如需要三键组合,那么需要考虑使用鼠标事件中的那个方法:
key_down()和key_up()
对,没错,它们在鼠标事件内,keydown代表按下某个键不松开keyup代表松开它,不过仅用于调整键Ctrl、Alt、Shift,不过差不多够了哈。
总结
本文列举了Selenium模块的安装使用方法,介绍了元素定位、元素控制的基本方法,有很多高级方法比如获得cookies等一些操作没有介绍,不过掌握了文章内容就已经可以做很多的事情了,更高级的需要慢慢深入。