#selenium的使用
1.selenium的介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接调用浏览器,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等。我们可以使用selenium很容易完成之前编写的爬虫,接下来我们就来看一下selenium的运行效果
2.selenium的工作原理
python代码 = > 浏览器厂商提供的api = > 浏览器
3.安装selenium
pip install selenium
4.安装webdriver webdriver相当于每个浏览器厂商提供的api (win10 64位系统为例)
webdriver分为 :无头浏览器(包含:phantomjs),有头浏览器(包含:主流浏览器,Chrome,IE)
chrome浏览器的webdriver的下载链接: https://npm.taobao.org/mirrors/chromedriver
一,先确认一下自己的浏览器的版本号 (我的版本号是:版本 80.0.3987.149(正式版本) (64 位) )
二,在链接上下载对应版本号的webdriver程序 (win32 你64位系统也是可以正常运行的)
三,把下载好的 webdriver.exe程序 所在目录配置到环境变量 (直接把webdriver放到python根目录也行)
5.简单的案例
import time
from selenium import webdriver
# 通过指定chromedriver的路径来实例化driver对象,chromedriver放在当前目录。
# driver = webdriver.Chrome(executable_path='./chromedriver')
# chromedriver已经添加环境变量
driver = webdriver.Chrome() # 调用Chrome浏览器
driver.get("https://www.baidu.com/") # 控制浏览器访问url地址
driver.find_element_by_id('kw').send_keys('python') # 在百度搜索框中搜索'python'
driver.find_element_by_id('su').click() # 点击'百度搜索'
time.sleep(6) # 延时6秒执行 下面代码
driver.quit() # 退出浏览器
# driver对象的常用属性和方法
1. driver.page_source 当前标签页浏览器渲染之后的网页源代码
2. driver.current_url 当前标签页的url
3. driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
4. driver.quit() 关闭浏览器
5. driver.forward() 页面前进
6. driver.back() 页面后退
7. driver.save_screenshot('img_name.png') 页面截图
import time
from selenium import webdriver
driver = webdriver.Chrome() # 调用Chrome浏览器
driver.get('https://www.baidu.com/') # 访问 百度
print(driver.page_source) # 获取网页源码
print(driver.current_url) # 获取当前标签页的url
time.sleep(2)
driver.get('https://blog.dbsgw.cn/') # 访问 前端博客
time.sleep(2)
driver.back() # 页面后退
time.sleep(2)
driver.forward() # 页面前进
time.sleep(2)
driver.back()
time.sleep(2)
driver.save_screenshot('baidu.png') # 页面截图
driver.close() # 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
# driver.quit() # 关闭浏览器
#元素定位 数据提取
find_element_by_id (返回一个元素) id是唯一的所以没有加s的
find_element(s)_by_class_name (根据类名获取元素列表)
find_element(s)_by_name (根据标签的name属性值返回包含标签对象元素的列表)
find_element(s)_by_xpath (返回一个包含元素的列表)
find_element(s)_by_link_text (根据连接文本获取元素列表)
find_element(s)_by_partial_link_text (根据链接包含的文本获取元素列表)
find_element(s)_by_tag_name (根据标签名获取元素列表)
find_element(s)_by_css_selector (根据css选择器来获取元素列表)
注意:
1. find_element和find_elements的区别:
多了个s就返回列表,没有s就返回匹配到的第一个标签对象
find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
2.by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本
3.以上函数的使用方法
driver.find_element_by_id('id_str')
# 案例
import time
from selenium import webdriver
driver = webdriver.Chrome() # 调用谷歌浏览器
driver.get('https://www.baidu.com/')
# driver.find_element_by_id('kw').send_keys('python3') #id定位
# driver.find_element_by_class_name('s_ipt').send_keys('calss定位') #class定位
# driver.find_element_by_name('wd').send_keys('name定位') #name定位
# driver.find_element_by_xpath('//*[@id="kw"]').send_keys('xpath语法') #xpath定位
num = driver.find_elements_by_css_selector('input') # 获取页面中所以的input标签
for i in num: #循环 输出每个元素
print(i)
# driver.find_element_by_id('su').click() # 点击回车
time.sleep(3)
driver.close() # 关闭当前页面
#标签对象提取文本内容和属性值
1.对元素执行点击操作`element.click() 对定位到的标签对象进行点击操作
2.向输入框输入数据`element.send_keys(data) 对定位到的标签对象输入数据
3.获取文本`element.text 通过定位获取的标签对象的`text`属性,获取文本内容
4.获取属性值`element.get_attribute("属性名") 通过定位获取的标签对象的`get_attribute`函数,传入属性名,来获取属性的值
#案例
from selenium import webdriver
import time
driver = webdriver.Chrome() # 调用谷歌浏览器
driver.get('https://www.dadayl.com/')
# print(driver.find_element_by_id('u_sp'))
num = driver.find_elements_by_css_selector('.news-article_container ul li') # 查询文章类别
for i in num:
# print(i.text) #获取文章列表的文字
print(i.find_element_by_css_selector('a').get_attribute('href'), i.text) # 获取a链接的链接 + 获取文字
time.sleep(3) # 延迟3秒
driver.close() # 关闭当前页面
# 案例 标签页的切换
1. 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles
2. 根据标签页句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])
import time
from selenium import webdriver
driver = webdriver.Chrome() # 调用谷歌浏览器
driver.get('https://www.baidu.com/') # 请求地址
print(driver.window_handles) # 获取当前所有的标签页的句柄构成的列表
driver.find_element_by_xpath('//*[@id="virus-2020"]').click() # xpath语法选择元素 点击打开新窗口
time.sleep(3)
driver.switch_to.window(driver.window_handles[0]) # 切换到 窗口0
time.sleep(3)
driver.switch_to.window(driver.window_handles[1]) # 切换到 窗口1
time.sleep(3)
driver.switch_to.window(driver.window_handles[0]) # 切换到 窗口0
print(driver.window_handles) # 获取当前所有的标签页的句柄构成的列表
driver.quit() # 退出浏览器
# 切换frame标签(frame框架)
iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是`driver.switch_to.frame(frame_element)`。接下来我们通过qq邮箱模拟登陆来学习这个知识点
import time
from selenium import webdriver
# emial = input('请输入邮箱')
# pw = input('请输入密码')
emial = 'xxxxx'
pw = 'xxxx'
driver = webdriver.Chrome()
driver.get('https://mail.qq.com/cgi-bin/loginpage')
driver.switch_to.frame(driver.find_element_by_id('login_frame')) #切换到frame 框架里面
driver.find_element_by_xpath('//*[@id="u"]').send_keys(emial) # 输入邮箱
driver.find_element_by_xpath('//*[@id="p"]').send_keys(pw) # 输入密码
driver.find_element_by_xpath('//*[@id="login_button"]').click() # 单击登录
#############需要操作frame外边的元素需要切换出去
time.sleep(12)
driver.switch_to.window(driver.window_handles[0]) #切换到当前 能操控的页面
print(driver.find_element_by_xpath('//*[@id="logotips"]/div/div/span[4]/a[1]').text) #输入 邮箱首页
# selenium对cookie的获取和删除
1.获取cookie
print(driver.get_cookies()) # 获取当前标签页的全部cookie信息
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()} # 把cookie转化为字典
2.删除cookie
driver.delete_cookie("CookieName") # 删除一条cookie
driver.delete_all_cookies() # 删除所有的cookie
3.案例
from selenium import webdriver
driver = webdriver.Chrome() #调用浏览器
driver.get('https://blog.dbsgw.cn/') # 发送请求
print(driver.get_cookies()) # 获取当前页的全部cookie
cookies_dict = {cookie['name']: cookie['value'] for cookie in
driver.get_cookies()} # 推导式 获取cookie (cookie最重要的就是name和value所以提取他们)
print(cookies_dict) # 查看提取后的 cookie
driver.delete_cookie('CNZZDATA1278526282') # 删除单独一个 cookie
print(driver.get_cookies(), 22222) # 查看当前的cookie
driver.delete_all_cookies() # 删除所有cookie
print(driver.get_cookies(), 3333) # 查看当前的cookie
# selenium执行js语句
有时候selenium的内置方法不够满足自己的需求,就需要调用js操作浏览器了
import time
from selenium import webdriver
driver = webdriver.Chrome() #调用谷歌浏览器
driver.get("https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_pc_1")
js = 'window.scrollTo(0,document.body.scrollHeight)' # js语句
driver.execute_script(js) # 执行js的方法
time.sleep(5) #延时5秒
driver.quit() #关闭浏览器
# 页面等待
页面在加载的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素有可能还没有加载出来,是不可见的,如何处理这种情况呢?
1.强制等待
就是强制等待3秒 time.sleep(3)
2.隐式等待
隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步,在设置的时间内没有定位成功,则会报超时加载
import time
from selenium import webdriver
url = 'https://blog.dbsgw.cn/'
driver = webdriver.Chrome()
driver.get(url) #发送请求
driver.implicitly_wait(10) #隐式等待 10秒
driver.find_element_by_xpath('/html/body/section/div[1]/div/div[3]/ul/li[5]/a').click() #跳转到尾页
time.sleep(6)
driver.close() #关闭当前页
3.显示等待 和隐式等待差不多 建议直接使用隐式等待
每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码 如果没有达成就继续等待直到超过规定的时间后,报超时异常
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 显式等待
WebDriverWait(driver, 20, 0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, '好123')))
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常
print(driver.find_element_by_link_text('好123').get_attribute('href'))
driver.quit()
# selenium在谷歌浏览器中开启无界面模式
from selenium import webdriver
url = 'https://blog.dbsgw.cn/'
options = webdriver.ChromeOptions() # 实例化配置对象
options.add_argument("--headless") # 配置对象添加无界面模式
options.add_argument("--disable-gpu") # 配置对象添加禁用gpu
driver = webdriver.Chrome(options=options)
driver.get(url)
driver.save_screenshot('前端笔记.png') # 截图
driver.quit() # 关闭浏览器
# selenium中使用代理ip
import time
from selenium import webdriver
url = 'https://blog.dbsgw.cn/'
options = webdriver.ChromeOptions() # 实例化配置对象
# options.add_argument("--headless") # 配置对象添加无界面模式
# options.add_argument("--disable-gpu") # 配置对象添加禁用gpu
options.add_argument("--proxy-server=http://124.237.83.14:53281") # ip代理
driver = webdriver.Chrome(options=options)
driver.get(url)
driver.save_screenshot('前端笔记.png') # 截图
time.sleep(6)
driver.quit() # 关闭浏览器
# selenium中设置 user-agent(浏览器请求头)
import time
from selenium import webdriver
url = 'https://blog.dbsgw.cn/'
options = webdriver.ChromeOptions() # 实例化配置对象
# options.add_argument("--headless") # 配置对象添加无界面模式
# options.add_argument("--disable-gpu") # 配置对象添加禁用gpu
# options.add_argument("--proxy-server=http://124.237.83.14:53281") # ip代理
options.add_argument("--user-agent=python") # 浏览器头的配置 ,告诉别人我是python
driver = webdriver.Chrome(options=options)
driver.get(url)
driver.save_screenshot('前端笔记.png') # 截图
time.sleep(6)
driver.quit() # 关闭浏览器
发表评论