聊聊 Python 中的 selenium 的简单用法吧

Guide

我在之前的做过的一个可以用于爬虫入门的小项目中曾简单的提到过 selenium 这个工具,并且简单的使用它控制了 chrome 实现了自动控制浏览器并且获取了网页的源代码,实现了请求库 requests 的功能,有时候它有可能比 requests 更厉害一点,所以我整理一下 selenium 的一些用法,供大家参考。

Selenium 的简单介绍

Selenium 是一个 web 自动化测试工具,它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器. 我们可以利用它实现浏览器自动进入网页、输入、点击、下拉等操作。不仅如此,它还能获取到 JavaScript 所渲染的信息,实现真正的可见即可爬,这是 requests 所不及的。因此在在爬虫中,它也是一个比较有意义的工具。Python 基于它强大的特性为我们提供了 Selenium 库,我们可以直接导入这个库,通过一些方法实现我们想要的操作

Selenium 的功能和方法

1. 初始化

前面我们说过,Selenium 支持很多浏览器,而利用它去控制浏览器的时候,首先我们需要去安装相关的插件,然后通过代码初始化浏览器。

from selenium import webdriver

browser=webdriver.Chrome()

通过上述代码我们初始化选择了 Chrome 浏览器,之后我们可以通过代码实现自动控制 Chrome 浏览器进行一系列操作

如果你想要初始化别的浏览器进行操作的话,可以像下面这样修改第二行代码,即可初始化 Firefox,Edge 等浏览器

browser=webdriver.Firefox()
browser=webdriver.Edge()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()

2. 访问页面

初始化浏览器之后,我们需要用这个浏览器去访问我们所要爬取的页面,跟 requests 中一样我们仍可以用 get() 方法来请求网页,参数传入网页的 URL 即可。这里我们通过以下代码访问百度,然后打印出源代码,再关闭浏览器。

from selenium import webdriver
# 初始化浏览器
browser=webdriver.Chrome()
# 请求访问页面
browser.get('https://www.baidu.com')
#获取网页源代码
print(browser.page_source)
# 关闭浏览器
browser.close()

3. 查找节点

这里我们来介绍一下通过 Selenium 选择网页节点的方法

(1) 单个节点的查找

Selenium 中提供了直接方法去实现节点的选择,并为我们提供了多种选则方法,我们可以使用 id,name, 节点名,CSS 选择器等多种方法进行查找,这里我们试着找找淘宝搜索框的节点,当然,这需要你先找到搜索框所在的节点。

![alt 文本]!![f203ae487e654d4ba15b9062165e04fd_image.png](http://nucode.cn/upload/f203ae487e654d4ba15b9062165e04fd_image.png) 

使用 chrome 我们很容易的获取了上图中搜索框的节点信息,如 id,name,class 等。然后让我们通过代码进行操作吧

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.taobao.com')
# 通过id查找节点
input_first=browser.find_element_by_id('q')
# 通过css选择器查找节点
input_second=browser.find_element_by_css_selector('#q')
# 通过xpath语法查找节点
input_third=browser.find_element_by_xpath('//*[@id="q"]')
# 打印查找结果
print(input_first)
print(input_second)
print(input_third)
browser.close()
![alt 文本]![957726907ae143c39965c3f2a5bacd63_image.png](http://nucode.cn/upload/957726907ae143c39965c3f2a5bacd63_image.png) 

通过上述代码我们得到了上图所示的结果,这里我们使用了不同的方法去查找同一个节点,所以打印结果应该是相同的,其实单个节点的查找方法还有很多,在这里我给大家列出来,大家可以根据习惯随意选择

find_element_by_class_name()
find_element_by_id()
find_element_by_css_selector()
find_element_by_xpath()
find_element_by_tag_name()
find_element_by_name()
find_element_by_link_text()
find_element_by_partial_link_text()

查找多个节点

上述方法基本上能够满足我们的一般操作需求,但是它只能返回其匹配到的第一个节点。有时候,我们可能需要去查找多个节点,这时只需要将 element 变为 elements 即可实现。

find_elements_by_class_name()
find_elements_by_id()
find_elements_by_css_selector()
find_elements_by_xpath()
find_elements_by_tag_name()
find_elements_by_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()

4. 节点交互

Selenium 的一大重要功能是模拟进行输入、点击、下拉等操作,现在就让我们通过一个小例子了解一下它功能吧。

from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get('https://www.taobao.com')
# 通过id查找搜索框的节点
input=browser.find_element_by_id('q')
# 在搜索框中输入内容
input.send_keys('iPhone')
# 设置延时
time.sleep(3)
# 清空搜索框中的内容
input.clear()
input.send_keys('iPad')
# 通过class查找搜索按钮的节点
button=browser.find_element_by_class_name('btn-search')
# 实现点击操作
button.click()

5. 动作链

一般的交互动作是针对某个节点进行的,比如上述的输入、清空文字的方法和点击的方法,但是还有一些方法没有特定的执行对象,比如鼠标拖拽,这些动作用另一种方式执行,这就是动作链
我们可以先打开这个网站

http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

然后运行下述代码,再对比两个页面

from selenium import webdriver
from selenium.webdriver import ActionChains
browser=webdriver.Chrome()
url='http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
#切换到子节点中
browser.switch_to.frame('iframeResult')
#找到拖拽内容的节点
source=browser.find_element_by_css_selector('#draggable')
target=browser.find_element_by_css_selector('#droppable')
# 声明ActionChains对象为当前页面
actions=ActionChains(browser)
# 通过下述方法进行拖拽操作
actions.drag_and_drop(source,target)
actions.perform()

6. 执行 JavaScript

如果我们要爬取类似于今日头条,QQ 空间这样的页面时怎样才能获取这些信息呢,使用 Selenium 本身是没有下拉进度条的方法的,但是它可以通过 execute_script() 方法直接模拟 JavaScript 运行。
我们可以看看如下代码

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.zhihu.com')
# 将页面下拉到最后
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
# 弹出alert提示框
browser.execute_script('alert("To Bottom")')

学习资料是崔庆才老师的《Python3 网络爬虫开发实战》,上述例子也多源于此。