Selenium是一个基于浏览器自动化的一个模块。
一:安装 selenium 模块
使用anaconda安装的过程我这里不再重复了,详情点击《Python(三)开源的Python包管理器 anaconda——window安装》
命令行安装:
pip install selenium
二:安装浏览器驱动(谷歌浏览器)
1:驱动下载地址
chromedriver.storage.googleapis.com/index.html
这么多版本,哪一个才是我需要的版本呢?
2:浏览器驱动版本与浏览器版本映射关系查找
我这里没有找到最新的,大概就是这个意思,有找到最新对照表的同学,请在文末评论一下。
我的chrome浏览器版本是 99.0.4844.51,因此我这里直接下载上图中对应的版本就好,下载成功之后,放入要执行的python文件同级
二:selenium使用流程
1:引入selenium模块
from selenium import webdriver
2:实例化一个浏览器对象
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
3:让浏览器发起一个指定的url对应的请求
bro.get('https://guanchao.site/pc/index')
4:使用page_source获取浏览器当前页面的页面源码数据
page_text = bro.page_source
5:使用xpath解析
tree = etree.HTML(page_text)
# xpath获取标题名称
li_list = tree.xpath('/html/body/div/div/main/div[2]/section[1]//h5/span/@title')
完整的示例:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2022/3/10 19:55
# @Author : camellia
# @Email : 805795955@qq.com
# @File : seleniums.py
# @Software: PyCharm
from selenium import webdriver
from lxml import etree
from time import sleep
# 实例化一个浏览器对象
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
# 让浏览器发起一个指定的url对应的请求
bro.get('https://guanchao.site/pc/index')
# 睡一会儿,等待网页加载完成
sleep(2)
# page_source获取浏览器当前页面的页面源码数据
page_text = bro.page_source
# 将网页源代码 保存至本地,以便于爬取不到数据的时候查看原因
with open('boke.html', 'w', encoding='utf-8') as fe:
fe.write(page_text)
print('爬取完成!')
tree = etree.HTML(page_text)
# xpath获取标题名称
li_list = tree.xpath('/html/body/div/div/main/div[2]/section[1]//h5/span/@title')
# sleep(5)
print(li_list)
# 退出程序,关闭浏览器
bro.quit()
我在查看selenium官方网站文档(www.selenium.dev/documentati…
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://selenium.dev")
driver.quit()
webdriver.Chrome()中并没有传递我们上边的浏览器驱动,一样可以打开浏览器。我的chrome浏览器版本是 99.0.4844.51,大概是我将浏览器驱动添加到了我系统的环境变量中这种写法才好用吧,具体我没有在其他的位置测试。有试过的同学,分享一下你的成果呀。
三:selenium的其他自动化操作
下面我再来尝试写一个小例子,打开京东,搜索RTX3060TI,点击搜索,产品列表页滚轮向下滑动,回到京东首页,再回到刚才的RTX3060ti的搜索页。代码如下:
from selenium import webdriver
from lxml import etree
from time import sleep
# =========================================================================
# selenium 其他应用
# 实例化一个浏览器对象
bro = webdriver.Chrome()
# 让浏览器发起一个指定的url对应的请求
bro.get('https://www.jd.com/')
# 根据标签定位搜索输入框input
search_input = bro.find_element_by_id('key')
# 发送 搜索内容
search_input.send_keys('RTX3060ti')
# 定位搜索button
button_click = bro.find_element_by_class_name('button')
# 模拟点击事件
button_click.click()
# 睡一会儿 等待页面加载完成
sleep(3)
# 执行一组js程序 让搜索结果 滚动条 向下滚动
bro.execute_script('window.scrollTo(0,1500)')
# 睡一会儿 等待页面加载完成
sleep(2)
# 回到搜索页
bro.back()
# 睡一会儿 等待页面加载完成
sleep(2)
# 回到 RTX3060ti搜索页
bro.forward()
四:selenium处理iframe以及动作链
这个位置我没想好使用什么进行测试,就在网上找了一个例子,我看到好多人都在用这个例子:
菜鸟教程,将一个div拖动至另一个div中,并释放
我们使用selenium的动作链来实现这一系列操作,代码如下:
# 引入动作链模块
from selenium.webdriver import ActionChains
# =========================================================================
# selenium 操作iframe 与 动作链
# 实例化一个浏览器对象
bro = webdriver.Chrome()
# 浏览器最大化
bro.maximize_window()
# 让浏览器发起一个指定的url对应的请求
bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable')
# 如果定位的标签是存在于iframe标签之后的则必须通过如下操作进行标签定位
bro.switch_to.frame('iframeResult') # 传入iframe的id
# 实例化一个动作链
action = ActionChains(bro)
# # 此时就已经切换至iframe中的html了
# div = bro.find_element_by_id('draggable')
# # 点击长按指定的标签
# action.click_and_hold(div)
# perform 立即执行动作链操作
# move_by_offset(x,y) x:水平 y:竖直
# 一点一点的移动
# for i in range(4):
# action.move_by_offset(17,0).perform()
# sleep(0.5)
# 但是,我觉得上边的例子不太好,没有释放动作,
# 定位要拖动的元素
source = bro.find_element_by_id('draggable')
# 定位目标元素
target = bro.find_element_by_id('droppable')
# 执行拖动动作
action.drag_and_drop(source, target).perform()
# 释放动作链
action.release()
sleep(10)
# 关闭浏览器
bro.quit()
使用百度上边的测试代码,感觉不是太完整,最后没有释放div那一步。
我这里小小的改动了一下
# 定位要拖动的元素
source = bro.find_element_by_id('draggable')
# 定位目标元素
target = bro.find_element_by_id('droppable')
# 执行拖动动作
action.drag_and_drop(source, target).perform()
使用这部分代码来进行操作,效果就很完整了。
以上大概就是selenium的一些基本的操作,关于python中的selenium,后边可能还会单独出一个系列来好好研究一下,这玩意挺好玩的。.
有好的建议,请在下方输入你的评论。