Python-使用Selenium模块控制浏览器
本文简要介绍在Python中如何使用 selenium 模块控制浏览器获取动态页面元素。包括获取信息,点击链接,下拉框选取。毕设通过本方式自动化获取数据,简要记录。更新了没保存好被吞掉的部分...
部分网页在右键使用查看源代码与检查元素时看到的内容是不相同的,上下页的切换也不会导致页面链接发生变化,这一类网页仅仅依靠获取网页源代码的方式是无法自动获取页面元素的。Python中的selenium模块可以模拟手动操作浏览器的过程,虽然该模块主要用于编写功能/验收测试,用来获取动态网页的数据也很方便。
安装
下载 selenium 安装包
1 | pip install selenium |
安装 WebDriver
将要模拟的浏览器的 webdrver 下载至 Python 所在的位置。
(注意:该驱动与浏览器版本相关,下载前请先确认自己的浏览器版本)
启动浏览器
导入模块
导入该模块通常使用以下语句:
1 | from selenium import webdriver |
启动浏览器
对不同的浏览器,使用webdriver启动浏览器:
1 | browser = webdriver.Firefox() |
使用 get()
方法访问指定链接:
1 | driver.get("YOUR_URL") |
页面元素定位
使用 find_element_*
和 find_elements_*
查找页面中的
WebDriver对象,前者返回第一个匹配元素,后者返回所有匹配元素,形式为列表。
以下是 WebDriver
方法,仅列出查找第一个匹配元素的方法名,查找所有元素的方法明只需在
element
后加上 s
即可。
方法名 | 定位对象 |
---|---|
find_element_by_class_name(name) |
根据 class 名定位 |
find_element_by_css_selector(selector) |
根据 CSS 选择器定位 |
find_element_by_id(id) |
根据元素的 id 属性定位 |
find_element_by_link_text(text) |
根据文本定位 |
find_element_by_partial_link_text(text) |
根据文本的子字符串匹配 |
find_element_by_name(name) |
根据元素的 name 属性定位 |
find_element_by_tag_name(name) |
根据标签名定位 |
find_element_by_xpath(path) |
根据 Xpath 定位 |
以上所有的元素定位,若不能找到匹配元素,将抛出
NoSuchElementException
异常。
个人倾向于使用 CSS 选择器的方式进行元素定位,虽然完全不懂前端,但其实通过浏览器的检查元素可以很轻易地获取 CSS选择器的语法,同时参照 CSS选择器参考手册 就能很容易通过 CSS 选择器进行定位。
通过 浏览器快速获取 CSS 选择器语法的方式是:
打开页面右键菜单中的检查元素窗口;
点击左上角的选择元素工具;
在页面上选取需要定位的元素;
这时 HTML 代码的浏览窗格中将定位到所选取元素的 HTML 代码位置;
查看代码浏览窗格的下方,以
>
连接的形式呈现了子代以及每一级父代的 CSS 选择器语法。
例如:
1 | <td class="el-table_1_column_2 "> |
定位到 data 的 CSS
选择器语法为:td.el-table_1_column_2 div
,上面提到的定位方法使用方式如下:
1 | elem = browser.fidn_element_by_css_selector('td.el-table_1_column_2 div') |
此时 elem
为定位到的 WebElement
对象,还不是我们想要的内容。
获取内容
可以通过 WebElement 对象提供的属性和方法访问对象的信息,如下表所示:
属性或方法名 | 描述 |
---|---|
tag_name |
标签名 |
get_attribute() |
属性值 |
text |
文本 |
clear() |
清除文本字段或文本区域输入的文本 |
is_displayed() |
根据文本的子字符串匹配 |
find_element_by_name(name) |
元素是否可见 |
is_enabled() |
元素是否启用 |
is_selected() |
选框是否选中 |
location |
元素在页面上的位置 |
如上文提到的 data 信息的获取可通过 text 属性提取:
1 | print(elem.text) |
但对于一些隐藏的 CSS 元素,尽管页面上可以找到该元素,但无法通过
text
方式获取,如下面这段 HTML 代码:
1 | <td class="el-table_1_column_1 is-hidden"> |
直接使用 text 属性,获取到的内容将为空白,需要使用
get_attribute()
方法,如下列代码所示:
1 | print(elem.get_attribute("textContent")) |
具体可参考 HTML DOM textContent Property 。
点击页面
WebElement 中还提供了 click()
方法,通过该方法可模拟手动操作鼠标对页面元素进行点击,如上下页的切换等。在页面元素无法点击的情况下(如末页的下一页按钮被禁用),该方法不会执行任何操作,也不会有异常返回。以下是示例:
1 | browser.find_element_by_css_selector('button.searchBtr').click() |
下拉框选取
webdriver 中提供了 select 模块用于下拉框的选取,以下是导入该模块的语句的两种方式:
1 | from selenium.webdriver.support.ui import Select |
使用时将查找的元素作为 Select()
的参数,下拉框的选取有以下三种方式:
select_by_index(index)
:通过索引选取,即第几个元素,索引编号从 0 开始;select_by_value(value)
: 通过value
属性值选取;select_by_visible_text(text)
: 通过可见文本选取,即该下拉菜单中显示值。
以下是示例 HTML代码段:
1 | <div class="listquerybox"> |
通过三种不同方式选取 北京市 选项如下:
1 | Select(browser.find_element_by_css_selector('select#pid.area-select')).select_by_index(1) |
在下拉框中的选择值查找失败时,将抛出
NoSuchElementException
异常。
关闭浏览器
在信息获取完后,应使用 quit()
关闭浏览器,否则通过
selenium
启动的浏览器将一直处于活动运行状态。以下是包括浏览器常用的操控按钮示例。
1 | browser.quit() # 点击 关闭浏览器 按钮 |