Python中Selenium库使用教程详解


Posted in Python onJuly 23, 2020

selenium介绍

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

中文参考文档

官网

环境安装

下载安装selenium

pip install selenium -i https://mirrors.aliyun.com/pypi/simple/

谷歌浏览器驱动程序下载地址:

http://chromedriver.storage.googleapis.com/index.html

使用示例

from selenium import webdriver
from time import sleep

# 实例化一款浏览器
bor = webdriver.Chrome(executable_path='chromedriver.exe')

# 对指定的url发起请求
bor.get('https://www.jd.com/')
sleep(1)
# 进行标签定位
search_input = bor.find_element_by_id('key')

# 向搜索框中录入关键词
search_input.send_keys("mac pro")

# 点击搜索按钮
btn = bor.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btn.click()
sleep(2)

# 执行js,让滚轮向下滚动
bor.execute_script('window.scrollTo(0, document.body.scrollHeight)')
sleep(2)

page_text = bor.page_source

print(page_text)

bor.quit()

浏览器创建

Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。

from selenium import webdriver
 
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

元素定位

webdriver 提供了一系列的元素定位方法,常用的有以下几种:

定位一个元素 定位多个元素 含义
find_element_by_id find_elements_by_id 通过元素id定位
find_element_by_name find_elements_by_name 通过元素name定位
find_element_by_xpath find_elements_by_xpath 通过xpath表达式定位
find_element_by_link_text find_elements_by_link_tex 通过完整超链接定位
find_element_by_partial_link_text find_elements_by_partial_link_text 通过部分链接定位
find_element_by_tag_name find_elements_by_tag_name 通过标签定位
find_element_by_class_name find_elements_by_class_name 通过类名进行定位
find_elements_by_css_selector find_elements_by_css_selector 通过css选择器进行定位

注意:

1、find_element_by_xxx找的是第一个符合条件的标签,find_elements_by_xxx找的是所有符合条件的标签。

2、根据ID、CSS选择器和XPath获取,它们返回的结果完全一致。

3、另外,Selenium还提供了通用方法find_element(),它需要传入两个参数:查找方式By和值。实际上,它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID, id),二者得到的结果完全一致。

实例演示

假如有一个web页面,通过前端工具查看到一个元素的属性是这样的。

<html>
 <head>
 <body link="#0000cc">
 <a href="/" rel="external nofollow" onmousedown="return c({'fm':'tab','tab':'logo'})">
 <form name="f" action="/s">
  <span ></span>
  <input name="wd" value="" maxlength="255" autocomplete="off">

通过id定位:

dr.find_element_by_id("kw")

通过name定位:

dr.find_element_by_name("wd")

通过class name定位:

dr.find_element_by_class_name("s_ipt")

通过tag name定位:

dr.find_element_by_tag_name("input")

通过xpath定位,xpath定位有N种写法,这里列几个常用写法:

dr.find_element_by_xpath("//*[@]")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@]")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@]/input")
dr.find_element_by_xpath("//form[@]/span/input")
dr.find_element_by_xpath("//input[@ and @name='wd']")

通过css定位,css定位有N种写法,这里列几个常用写法:

dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")

假如页面上有如下一组文本链接

<a href="http://news.baidu.com" rel="external nofollow" name="tj_trnews">新闻</a>
<a href="http://www.hao123.com" rel="external nofollow" name="tj_trhao123">hao123</a>

通过link text定位:

dr.find_element_by_link_text("新闻")
dr.find_element_by_link_text("hao123")

通过partial link text定位:

dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")

控制浏览器

常用的控制浏览器操作的一些方法

方法 说明
set_window_size() 设置浏览器的大小
back() 控制浏览器后退
forward() 控制浏览器前进
refresh() 刷新当前页面
clear() 清除文本
send_keys (value) 模拟按键输入
click() 单击元素
submit() 用于提交表单
get_attribute(name) 获取元素属性值
is_displayed() 设置该元素是否用户可见
size 返回元素的尺寸
text 获取元素的文本

? 示例

from selenium import webdriver

from time import sleep
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口

browser = webdriver.Chrome(executable_path= "chromedriver.exe")

#2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")

sleep(3)

#3.刷新浏览器
browser.refresh()

#4.设置浏览器的大小
browser.set_window_size(1400,800)

#5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()

调用JavaScript代码

虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。

用于调整浏览器滚动条位置的JavaScript代码如下:

<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);
from selenium import webdriver
from time import sleep

# 1.访问百度
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.baidu.com')

# 2.搜索
drive.find_element_by_id('kw').send_keys('python')
drive.find_element_by_id('su').click()

# 3.休眠2s,获取服务器的响应内容
sleep(2)

# 4.通过javascript设置浏览器窗口的滚动条位置
drive.execute_script('window.scrollTo(0, 500)')
# drive.execute_script('window.scrollTo(0, document.body.scrollHeight)') #滑到最底部

sleep(2)
drive.close()

获取页面源码数据

通过page_source属性可以获取网页的源代码,接着就可以使用解析库(如正则表达式、Beautiful Soup、pyquery等)来提取信息了。

? 示例

from selenium import webdriver
from time import sleep

# 1.访问百度
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.baidu.com')

# 2.搜索
drive.find_element_by_id('kw').send_keys('python')
drive.find_element_by_id('su').click()

# 3.休眠2s,获取服务器的响应内容
sleep(2)

# 4.获取页面源码数据
text = drive.page_source
print(text)

drive.close()

cookie操作

有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。

WebDriver操作cookie的方法:

方法 说明
get_cookies() 获得所有cookie信息
get_cookie(name) 返回字典的key为“name”的cookie信息
add_cookie(cookie_dict) 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
delete_cookie(name,optionsString) 删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
delete_all_cookies() 删除所有cookie信息

? 示例

from selenium import webdriver
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.cnblogs.com/')

# 1.打印cookie信息
print(drive.get_cookies())

# 2.添加cookie信息
dic = {'name':'name', 'value':'python'}
drive.add_cookie(dic)
print(drive.get_cookies())

# 3.遍历打印cookie信息
for cookie in drive.get_cookies():
 print(f"{cookie['name']}---f{cookie['value']}\n")

drive.close()

谷歌无头浏览器

PhantomJs已停止维护更新,这里使用谷歌的无头浏览器,是一款无界面的谷歌浏览器。很多时候我们爬取数据,并不想打开一个浏览器窗口进行操作,我们只需要获取数据或者拿到cookie然后进行操作。

? 示例

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 1.创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 2.创建浏览器对象
drive = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)

# 3.发起请求获取数据
drive.get('https://www.cnblogs.com/')

page_text = drive.page_source
print(page_text)

drive.close()

selenium规避被检测识别

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined。而使用selenium访问则该值为true。那么如何解决这个问题呢?

只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为['enable-automation'],完整代码如下:

? 示例

from selenium import webdriver
from selenium.webdriver import ChromeOptions

# 1.实例化一个ChromeOptions对象
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

# 2.将ChromeOptions实例化的对象option作为参数传给Crhome对象
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=option)

# 3.发起请求
driver.get('https://www.taobao.com/')

到此这篇关于Python中Selenium库使用教程详解的文章就介绍到这了,更多相关Python Selenium库使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python自动zip压缩目录的方法
Jun 28 Python
Python中的数学运算操作符使用进阶
Jun 20 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
Python处理命令行参数模块optpars用法实例分析
May 31 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
win10系统下python3安装及pip换源和使用教程
Jan 06 Python
python字符串替换re.sub()实例解析
Feb 09 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
python右对齐的实例方法
Jul 05 Python
Django如何实现密码错误报错提醒
Sep 04 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
Dec 09 Python
Python基于traceback模块获取异常信息
Jul 23 #Python
Python TestSuite生成测试报告过程解析
Jul 23 #Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 #Python
Python分类测试代码实例汇总
Jul 23 #Python
基于Python3读写INI配置文件过程解析
Jul 23 #Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 #Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 #Python
You might like
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
python 多线程应用介绍
2012/12/19 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
python中__call__内置函数用法实例
2015/06/04 Python
Django的信号机制详解
2017/05/05 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
介绍一下Ruby的特点
2013/01/20 面试题
求职简历自荐信范文
2013/10/21 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python