selenium 基础

selenium 可以通过程序控制浏览器进行自动化操作。在某些网站中,接口数据通常会被进行各种加密等操作来防止爬虫进行爬取数据,但是为了展示给用户数据,在浏览器中必须要将数据解析出来。通过selenium操作浏览器,就可以省去破解数据加密的过程从而直接拿到数据。

安装及导入

selenium 模块安装:

> pip install selenium

若想要 selenium 模块控制浏览器,需要下载对应的浏览器驱动:

本文以谷歌浏览器为例,在链接中,有各种版本的浏览器驱动,下载驱动的版本必须与浏览器版本一致,否则可能会无法使用。在谷歌浏览器中,版本好通过⋮ → 帮助 → 关于 google chrome中查看版本号。

选择对应的版本号,如果没有当前版本号,说明当前谷歌浏览器的版本更新没有影响到此驱动的运行,因此,找到最近的旧版本即可。点击进入找到响应的系统下载文件。

下载完成后,进行解压,将解压的文件拷贝到执行程序的python解释器中。

# 导入控制chrome浏览器的模块,以下代码块将不再导入
from selenium import webdriver

# 创建一个chrome浏览器对象,并打开一个网址
web = webdriver.Chrome()
web.get('https://www.baidu.com')

测试一下是否安装成功。

浏览器对象

使用webdriver.<浏览器>()来创建一个浏览器对象,如果是谷歌浏览器,那么是 webdriver.Chrome()。在浏览器对象中,可以进行各种操作来控制浏览器。

创建浏览器对象之后,第一件事必须是打开一个网站,使用以下函数:

web = webdriver.Chrome()   # 创建一个浏览器对象
web.get(url)               # 打开一个网址

查找html标签函数:

obj.find_element_by_id(str)              找到 id 值为 str 的标签
obj.find_element_by_name(str)            找到 name 值为 str 的标签
obj.find_element_by_tag_name(str)        找到标签名为 str 的标签
obj.find_element_by_class_name(str)      找到 class 值为 str 的标签
obj.find_element_by_css_selector(str)    使用css选择器的方式查找标签,#id, .class
obj.find_element_by_xpath(str)           使用xpath方式查找标签
obj.find_element_by_link_text(str)       找到内容为 str 的a标签

注:以上函数中 element 改为 elements,表示为查找多个符合要求的值,返回列表

找到标签之后,可以在后续进行各种操作:

.send_keys(str)      向标签中输入内容,通常是表单标签
.click()             点击标签,通常是按钮和a标签
.clear()             清空输入的内容
.text                获取标签中的文本
.id_                 获取标签id
.tag_name            获取标签名
.s_selected()        判断标签是否被选择
.is_enabled()        判断标签是否被启用
.submit()            提交表单
.get_attribute(str)  获取属性名为 str 的值

对浏览器本体的操作:

obj.maximize_window()      将浏览器最大化显示
obj.set_window_size(x, y)  控制浏览器的宽高
obj.back()                 后退一个页面
obj.forward()              前进一个页面

键盘操作,需要导入 from selenium.webdriver.common.keys import Keys ,然后在 send_keys() 函数中输入对应键盘按键的枚举值。在 send_keys() 函数中输入多个参数即为组合按键。

Keys.CONTROL           ctrl键
Keys.TAB               Tab键
Keys.ENTER             回车键
Keys.SHIFT             上档键
'a'~'z', '0'~'9'       字母和数字(字符串)

鼠标操作,需要导入 from selenium.webdriver.common.action_chains import ActionChains

# 前置,需要将获取标签并赋值,如 tag_obj = obj.find_element_by_id(xxx)
ActionChains(obj).context_click(tag_obj).perform()    双击某个标签
ActionChains(obj).double_click(tag_obj).perform()     双击某个标签
ActionChains(obj).drag_and_drop(tag_obj1, tag_obj2).perform()  拖拽某个标签到某个标签上(tag_obj1 是目标标签,tag_obj2是要拖拽到的位置标签)

cookie 的处理:

obj.get_cookies()         获取全部cookie
obj.add_cookie(dict)      添加cookie,传字典类型的数据
obj.delete_cookie(str)    删除指定名称的cookie
obj.delete_all_cookies()  删除全部cookie

进入iframe和其他窗口:

switch_to_frame(str)    找到并进入 iframe 标签的 id 为 str 的 iframe
switch_to_window(str)

其他函数:

obj.execute_script(js_str)  调用js代码
obj.implicitly_wait(s)      指定等待秒数,可在 0~s秒内智能等待

在运行中没有找到指定标签,但网页中有这个标签

有时在运行中,我们需要获取指定标签,但是程序报错了,说没有找到这个标签。很可能是这个标签是通过 js 代码请求接口动态生成的。请求接口并处理返回数据需要一定的时间,当程序运行时还没处理完成时,就会报错。

一般情况下最好的解决办法就是使用 time.sleep(2)使程序休眠几秒钟。

防止识别到selenium自动化控制

在谷歌浏览器中,通过 window.navigator.webdriver这个js属性来判断是否是使用来 selenium 自动化控制,结果为布尔值。

在谷歌浏览器版本为 88 以上的版本中,需要在代码中添加以下内容,可以将此属性修改为false

from selenium.webdriver.chrome.options import Options
# 配置设置
option = Options()
option.add_argument('--disable-blink-features=AutomationControlled')
# 创建浏览器对象时出入配置
web = Chrome(options=option)