Python自动化办公——Selenium控制浏览器

发布时间 2023-04-29 10:27:38作者: shuzihua
Python之selenium创建多个标签页 码夫破石 2022-11-04 原文 最近在做一个项目,需要用到cookies登录,想法是,在同一个浏览器下,打开两个标签页进行。让其自动获取cookies,先记录,不行的话,到时候再手动加载cookies。 1 ''' 2 #selenium加载新标签页 3 ''' 4 #导入所需库 5 from selenium import webdriver 6 from selenium.webdriver.common.keys import Keys 7 import time 8 9 #初始化浏览器的一些参数 10 options = webdriver.ChromeOptions() #实例化 11 options.add_argument('--headless') #无头模式 12 options.add_argument('--disable-gpu') #禁用gpu硬件加速 13 options.add_argument('--window-size=1920, 1080') #初始化窗口大小,网上很多人说用maximize_window()最大化窗口,经测试,然并卵 14 15 #定义两个链接,以便观察 16 url1 = 'https://www.baidu.com' #用在浏览器标签页1 17 url2 = 'https://www.sina.com.cn' #用在浏览器标签页2 18 19 #初始化浏览器 20 driver = webdriver.Chrome(options=options) 21 #driver.maximize_window() #然并卵的最大化窗口函数 22 23 #开始请求网页 24 driver.get(url1) 25 driver.implicitly_wait(5) #等待加载,用time.sleep()的话,我更建议用这个函数 26 driver.save_screenshot('baidu.png') #截图查看是否符合预期 27 #打印以便比较 28 print(driver.window_handles) 29 cookies = driver.get_cookies() 30 print(cookies) 31 32 #新增标签页 33 newTab = 'window.open("https://www.sina.com.cn");' #就当成js语句吧 34 driver.execute_script(newTab) #输出js语句 35 #切换标签页 36 #driver.switch_to_window(driver.window_handles[-1]) #切换到最后一个标签页,switch_to_window在3.7已经不推荐使用了(反正我的版本是3.7.9,姑且这么说) 37 driver.switch_to.window(driver.window_handles[-1]) #切换到第二个标签页 38 cookies2 = driver.get_cookies() 39 print(cookies2) 40 41 #截图 42 driver.save_screenshot('sina.com.cn.png') 43 #打印第二个标签页的值用来和第一个比较 44 print(driver.window_handles) 方法总是不止一种,再加一种: 1 ''' 2 #selenium创建标签页方法2 3 ''' 4 from selenium import webdriver 5 from selenium.webdriver import ActionChains 6 from selenium.webdriver.common.keys import Keys 7 8 #初始化一些参数 9 options = webdriver.ChromeOptions() 10 options.add_argument('--headless') 11 # options.add_argument('--disable-gpu') 12 options.add_argument('--window-size=1920, 1080') 13 14 #定义两个url 15 url1 = 'https://www.baidu.com' 16 url2 = 'https://www.sina.com.cn' 17 18 #初始化浏览器 19 driver = webdriver.Chrome() 20 #请求第一个网页 21 driver.get(url1) 22 driver.implicitly_wait(5) #等待加载 23 driver.save_screenshot('baidu.png') #保存截图 24 baiduCookies = driver.get_cookies() #获取cookie 25 print(baiduCookies) #打印cookie 26 27 #实例化一个行为 28 actions = ActionChains(driver) 29 # 经测试下面的按键没用 30 # #调用actions模拟按键,先按下键盘下的Control键,然后再发送t,然后再松开Control键,这样我们就发送了一个control+t的命令,即添加标签页 31 # actions.key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform() 32 # 调整思路,那就在原标签页按住Ctrl+链接也会打开新的标签页,一般浏览器都这样 33 news = driver.find_element_by_link_text('新闻') #找到带链接的新闻标签 34 actions.key_down(Keys.CONTROL).click(news).key_up(Keys.CONTROL).perform() #找到news并按住ctrl点击 35 #切换到第二个标签页 36 driver.switch_to.window(driver.window_handles[-1]) 37 #利用第二个标签页请求第二个url 38 driver.get(url2) 39 driver.save_screenshot('anotherTab.png') #保存截图 40 anotherTabCookies = driver.get_cookies() #获取cookies 41 print(anotherTabCookies) #打印cookies 42 43 # driver.close() #是退出当前句柄的标签页 44 # driver.quit() #退出浏览器 看到网上有帖子说,打开第二个标签页很卡,也就是根本加载不出第二段代码的代码41行。不知道是我网速问题还是真的如网上的帖子所说,懒得等,直接开启硬件加速,问题解决。 Python之selenium创建多个标签页的更多相关文章 selenium WebDriver 对浏览器标签页的切换 关于selenium WebDriver
 
 
 
 
 
Python爬虫技术之Selenium自动化测试及模拟点击页面爬虫最全知识
【Python爬虫技术之Selenium自动化测试及模拟点击页面爬虫最全知识】https://mbd.baidu.com/ma/s/psbfudsN
熊凯瑞
原创全栈领域新星创作者
已关注
8点赞·2301人阅读
Python爬虫之Selenium
一、基础认识
1、解释
2、流程
3、安装库
3.1 下载selenium库的命令
3.2 下载谷歌浏览器Chrome对应的驱动
3.3 样例
4、implicitly_wait和time.sleep
二、元素的选择
1、通过id来选择对应元素
1.1 解释
1.2 样例
2、根据class属性、tag名选择元素
2.1 相关方法
2.1.1 find_elements
2.1.2 find_elements
2.2 根据属性名(class_name)来选择元素
2.3 根据标签名(tag_name)来选择元素
3、根据WebElement对象选择元素
3.1 解释
3.2 作用
4、操控元素的基本方法
4.1 点击元素
4.2 输入框
4.3 获取元素内容
4.4 获取元素属性
4.5 获取整个元素对应的HTML
4.6 获取输入框里面的文字
4.7 获取元素文本内容2
5、CSS表达式选择元素
5.1 根据tag名、id属性、class属性选择元素
5.1.1 根据tag名选择元素
5.1.2 根据id属性选择元素
5.2 选择子元素和后代元素
5.2.1 常用表示方法
5.3 根据属性选择
5.4 验证CSS Selector
5.5 组合选择
5.5.1 并列(用逗号 ',' 分割)
5.6 按照次序选择子节点
5.6.1 父元素的第n个子节点
5.6.2 父元素倒数第几个节点
5.6.3 父元素的第几个某类型的子节点
5.6.4 奇数节点和偶数节点
5.6.5 兄弟节点选择
5.6.5.1 相邻兄弟节点选择
5.6.5.2 后续所有兄弟节点选择
6、frame切换
6.1 解释
6.2 用法1
6.2.1 样例
6.3 用法2
6.3.1 样例
6.4 切换回原来的主页面
7、切换到新的窗口
7.1 基础操作
7.2 判别新窗口的代码
7.3 切换到原来的窗口
8、radio选择框(单选框)
9、checkbox框(多选框)
9.1 思路
9.2 实现代码
10、select框
10.1 相关方法
10.1.1 根据选项的value属性值,选择元素
10.1.2 根据选项的次序(从1开始),选择元素
10.1.3 根据选项的可见文本,选择元素
10.1.4 根据选项的value属性值,去除选中元素
10.1.5 根据选项的次序,去除选中元素
10.1.6 根据选项的可见文本,去除选中元素
10.1.7 去除选中所有元素
10.2 Select单选框
10.3 Select多选框
11、其他操作元素的方法
11.1 使用ActionChains来模拟鼠标移动
12、冻结界面
13、弹出框处理
13.1 Alert弹出框
13.2 Confirm
13.2.1 点击OK按钮
13.2.2 点击Cancel按钮
13.2.3 样例
13.3 Prompt
13.3.1 基础知识
13.3.2 实例
13.4 注意
14、xpath选择元素
14.1 绝对路径选择
14.2 相对路径选择
14.3 通配符
14.4 根据属性选择
14.4.1 用法
14.4.2 注意
14.4.3 根据id属性选择
14.4.4 根据class属性选择
14.4.5 css选择属性值包含某个字符串的元素
14.4.6 选择属性值以某个字符串开头的元素
14.4.7 选择属性值以某个字符串结尾的元素
14.4.8 属性值包含字符串
14.5 按次序选择
14.5.1 某类型第几个子元素
14.5.2 第几个子元素
14.5.3 某类型 倒数第几个子元素
14.5.4 范围选择
14.6 组选择和兄弟节点
14.6.1 组选择
(1)css和xpath的区别
14.6.2 选择父节点
14.6.3 选择兄弟节点
14.7 注意
一、基础认识
1、解释
Selenium是一套Web网站的程序自动化操作解决方案(比如点击界面按钮,在文本框中输入文字等操作)
 
2、流程
Selenium的自动化原理如下
3、安装库
3.1 下载selenium库的命令
pip install selenium
复制
3.2 下载谷歌浏览器Chrome对应的驱动
驱动库网址:http://chromedriver.storage.googleapis.com/index.html
注意:根据自己的Chrome版本进行选择
由于我的是103版的,那么就选103版的驱动进行下载,只要版本(比如开头的103)一样,后面的数字比如0.5060.114啥的不会造成什么影响。
 
3.3 样例
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
 
#创建webDriver对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(service=Service(r'D:\chromedriver_win32\chromedriver.exe'))
 
#隐式等待,防止程序过快而网页反应不过来(10s)
wd.implicitly_wait(10)
 
#调用webDriver 对象的get方法,可以让浏览器打开指定网址
wd.get('http://www.baidu.com/')
复制
注意:service里的路径’D:\chromedriver_win32\chromedriver.exe’也可以在电脑系统的环境变量中来配,之后直接调用即可,细节就不展开了,可以自行搜索。
 
4、implicitly_wait和time.sleep
wd.implicitly_wait(10)是指当找不到元素的时候才会等,如果找到了就不会等。每次调用find_element或find_elements都会判断,因此当能找到时,就用time.sleep(1)来控制时间间隔。
二、元素的选择
1、通过id来选择对应元素
1.1 解释
id属性是唯一的,所以如果元素有id,则根据id选择元素是最简单高效的方式。
 
1.2 样例
#根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element(By.ID, 'kw')
 
#通过该WebElement对象,就可以对页面元素进行操作
#比如输入字符串到这个输入框里
element.send_keys('水果\n')
 
#输出当前窗口的标题栏
print(wd.title)
 
#关闭页面退出
#wd.close()
复制
2、根据class属性、tag名选择元素
2.1 相关方法
2.1.1 find_elements
使用find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,返回空列表
 
2.1.2 find_elements
使用find_element选择的是符合条件的第一个元素,如果没有符合条件的元素,抛出异常
 
2.2 根据属性名(class_name)来选择元素
# 根据class name 选择元素,返回的是一个列表
# 里面都是class属性值为animal的元素对应的WebElement对象
elements = wd.find_elements(By.CLASS_NAME, 'animal')
 
print(elements)
 
复制
2.3 根据标签名(tag_name)来选择元素
# 根据tag name选择元素,返回的是一个列表
# 里面都是tag名为div元素对应的WebElement对象
elements = wd.find_elements(By.TAG_NAME, 'div')
print(elements)
 
# 取出列表中的每个WebElement对象,打印出其text属性的值
# text属性就是该WebElement对象对应的元素在网页中的文本内容
for element in elements:
print(element.text)
复制
3、根据WebElement对象选择元素
3.1 解释
WebElement对象也可以调用find_elements、find_element之类的方法
 
3.2 作用
WebDriver对象选择元素的范围是整个web页面,而WebElement对象选择元素的范围是该元素内部
 
# 根据id选择元素
# 里面都是id名为container元素对应的WebElement对象
elements = wd.find_element(By.ID, 'container')
 
# 限制选择元素的范围id为container元素的内部
spans = elements.find_elements(By.TAG_NAME, 'span')
 
for span in spans:
print(span.text)
 
wd.quit()
 
复制
4、操控元素的基本方法
4.1 点击元素
调用元素WebElement对象的click方法(浏览器接到自动化命令,点击的是该元素中心点的位置)
 
#直接调用click()
a.click()
复制
4.2 输入框
调用元素WebElement对象的send_keys方法,如果要清除输入框已经有的内容,可以用WebElement对象的clear方法
 
element = wd.find_element(By.ID,"input")
 
#清除输入框已有的字符串
element.clear()
 
#输入新字符串
element.send_keys('xxxx')
复制
4.3 获取元素内容
获取元素的文本内容
 
element = wd.find_element(By.ID,'xxx')
print(element.text)
复制
4.4 获取元素属性
通过WebElement对象的get_attribute方法来获取元素的属性值
 
element = wd.find_element(By.ID,'input_name')
print(element.get_attribute('class'))
复制
4.5 获取整个元素对应的HTML
(1)要获取整个元素对应的HTML文本内容
element.get_attribute(‘outerHTML’)
 
(2)如果只是想获取某个元素内部的HTML文本内容
element.get_attribute(‘innerHTML’)
 
4.6 获取输入框里面的文字
element = wd.find_element(By.ID,"input")
#获取输入框中的文本
print(element.get_attribute('value'))
复制
4.7 获取元素文本内容2
通过WebElement对象的text属性,可以获取元素展现在界面上的文本内容,但有时候元素的文本内容没有展示在界面上,或者没有完全展示在界面上。这时,用WebElement对象的text属性,获取文本内容,就会有问题。
 
element.get_attribute('innerText')
 
element.get_attribute('textContent')
复制
5、CSS表达式选择元素
基础格式,通过css样式来选
 
element = wd.find_element(By.CSS_SELECTOR, '.plant')
 
print(element.get_attribute('outerHTML'))
 
复制
5.1 根据tag名、id属性、class属性选择元素
5.1.1 根据tag名选择元素
根据tag名选择元素,直接写上tag名
 
elements = wd.find_elements(By.CSS_SELECTOR,'div')
#等价于
elements = wd.find_elements(By.TAG_NAME,'div')
复制
注意:
 
#如果根据标签名来选择,比如....
elements = wd.find_elements(By.CSS_SELECTOR,'span')
 
#对比
 
#如果根据样式class属性来选择,比如...,那么前面要加'.'
elements = wd.find_elements(By.CSS_SELECTOR,'.span')
复制
5.1.2 根据id属性选择元素
选择元素的话,要在id号前加上一个井号:#id值
 
elements = wd.find_elements(By.CSS_SELECTOR,'#search')
复制
5.2 选择子元素和后代元素
5.2.1 常用表示方法
(1)大于号’>',元素1>元素2,表示元素2是元素1的后代元素,可以有多级关系,但必须是直接子元素,不能是间接的。
 
#通过大于号就可以层层递进找到要的内容
elements = wd.find_elements(By.CSS_SELECTOR,'#search > qu > look > #lazy')
复制
(2)空格分隔’ ',元素1 元素2,表示元素2在元素1的范围内,不管是否是直接子元素,间接子元素也可以。
 
#通过空格的判定,也可以找到对应的元素里的内容
elements = wd.find_elements(By.CSS_SELECTOR,'#search #lazy')
复制
5.3 根据属性选择
css选择器支持通过任何属性来选择元素,语法是用一个方括号[ ]
 
elements = wd.find_element(By.CSS_SELECTOR,'[href]')
复制
也可以组合限制
 
#表示选择所有标签名为div,且class属性为SKnet的元素
elements = wd.find_element(By.CSS_SELECTOR,'div[class='SKnet']')
复制
5.4 验证CSS Selector
在浏览器里按CTRL + F键来检查
 
5.5 组合选择
5.5.1 并列(用逗号 ‘,’ 分割)
#输出的是class属性为plant和animal的值
elements = wd.find_element(By.CSS_SELECTOR,'.plant,.animal')
复制
5.6 按照次序选择子节点
5.6.1 父元素的第n个子节点
指定选择的元素是父元素的第几个子节点,使用nth-child
 
#指定父元素为span的第二个子元素
elements = wd.find_element(By.CSS_SELECTOR,'span:nth-child(2)')
复制
5.6.2 父元素倒数第几个节点
指定选择的元素是父元素的倒数第几个子节点,使用nth-last-child
 
#指定父元素为span的倒数第二个子元素
elements = wd.find_element(By.CSS_SELECTOR,'span:nth-last-child(2)')
复制
5.6.3 父元素的第几个某类型的子节点
指定选择的元素是父元素的第几个某类型的子节点,使用nth-of-type
 
#选择的是第1个span类型的子元素
elements = wd.find_element(By.CSS_SELECTOR,'span:nth-of-type(1)')
复制
5.6.4 奇数节点和偶数节点
如果要选择的是父元素的偶数节点,使用nth-child(even)
如果要选择的是父元素的奇数节点,使用nth-child(odd)
 
#选择id为t1下,属性为p的偶数节点
elements = wd.find_element(By.CSS_SELECTOR,'#t1 p:nth-of-type(even)')
复制
5.6.5 兄弟节点选择
5.6.5.1 相邻兄弟节点选择
选择h3后面紧跟着的兄弟节点span
表示元素紧跟关系的是加号+
所以是h3+span
 
elements = wd.find_element(By.CSS_SELECTOR,'h3+span')
复制
5.6.5.2 后续所有兄弟节点选择
如果要选择h3后面所有的兄弟节点span,可以这样写h3 ~ span
 
elements = wd.find_element(By.CSS_SELECTOR,'h3~span')
复制
6、frame切换
6.1 解释
在html语法中,frame元素或者iframe元素的内部会包含一个被嵌入的另一份html文档,由于使用selenium打开一个网页,操纵范围是当前的html,并不包括被嵌入的html文档里的内容,如果要操作被嵌入的html文档中的元素,就必须切换操作范围到被嵌入的文档中。
 
6.2 用法1
wd.switch_to.frame(frame_reference),其中frame_reference可以是frame元素的属性name或id
 
6.2.1 样例
#切换到被嵌入文档中某个class属性
wd.switch_to.frame('frame1')
复制
6.3 用法2
wd.switch_to.frame(frame_reference),其中frame_reference也可以填写frame所对应的WebElement对象
 
6.3.1 样例
wd.switch_to.frame(wd.find_element(By.TAG_NAME,'iframe'))
复制
6.4 切换回原来的主页面
wd.switch_to.default_content()
复制
7、切换到新的窗口
7.1 基础操作
由于需要到新的窗口操作
可以使用Webdriver对象的switch_to属性的window方法
 
wd.switch_to.window(handle)
复制
WebDriver对象有window_handles属性,这是一个列表对象,里面包括了当前浏览器里面所有的窗口句柄(类似于对应窗口的一个ID)
 
7.2 判别新窗口的代码
# 依次获取wd.window_handles里面的所有句柄对象,并且调用wd.switch_to.window(handle)方法,
#切入到每个窗口,然后检查里面该窗口对象的属性(标题栏。地址栏),判断是不是我们要操作的那个窗口。
#如果是,就跳出循环。
for handle in wd.window_handles:
#先切换到该窗口
wd.switch_to.window(handle)
#得到该窗口的标题栏字符串,判断是不是要操作的那个窗口
if 'baidu' in wd.title:
#如果是,那么这时候WebDriver对象就是对应的该窗口,正好跳出循环
break
复制
 
7.3 切换到原来的窗口
进入新窗口操作完后,回到原来窗口,可以先保存老窗口句柄
 
#mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
 
#...等等操作代码....
 
#切换新窗口操作完后,将driver对应的对象返回到原来的窗口
wd.switch_to.window(mainWindow`)
复制
8、radio选择框(单选框)
radio框直接用WebElement的click方法,模拟用户点击就可以了。
 
#获取当前选中的元素
element = wd.find_element(By.CSS_SELECTOR,'#radio input[checked = checked]')
print('当前选中的是:' + element.get_attribute('value'))
 
#点击选择
wd.find_element(By.CSS_SELECTOR,'#radio input[value = "学院"]').click()
 
print('现在选中的是:' + element.get_attribute('value'))
复制
9、checkbox框(多选框)
对checkbox进行选择,也是直接用WebElement的click方法,模拟用户点击选择。
 
9.1 思路
先把已经选中的选项全部点击一下,确保都是未选中状态,再点击想要选择的选择框。
 
9.2 实现代码
#先把已经选中的选项全部点击一下
elements = wd.find_elements(By.CSS_SELECTOR, '#checkbox input[checked = "checked"]')
 
for element in elements:
element.click()
 
wd.find_element(By.CSS_SELECTOR, '#checkbox input[value = '学院']').click()
 
复制
10、select框
10.1 相关方法
10.1.1 根据选项的value属性值,选择元素
#例如页面里Bar
s.select_by_value('foo')
复制
10.1.2 根据选项的次序(从1开始),选择元素
#例如页面里Bar
s.select_by_index(1)
复制
10.1.3 根据选项的可见文本,选择元素
#例如页面里Bar
s.select_by_visible_text('Bar')
复制
10.1.4 根据选项的value属性值,去除选中元素
deselect_by_value
 
10.1.5 根据选项的次序,去除选中元素
deselect_by_index
 
10.1.6 根据选项的可见文本,去除选中元素
deselect_by_visible_text
 
10.1.7 去除选中所有元素
deselect_all
 
10.2 Select单选框
直接用Select方法选择
 
#导入Select类
from.selenium.webdriver.support.ui import Select
 
#创建Select对象
select = Select(wd.find_element(By.ID,"single"))
 
#通过Select对象选中
select.select_by_visible_text("学院")
复制
10.3 Select多选框
可以用select类的deselect_all方法,清除所有已经选中的选项,然后通过select_by_visible_text方法选择
 
#导入Select类
from.selenium.webdriver.support.ui import Select
 
#创建Select对象
select = Select(wd.find_element(By.ID,"multi"))
 
#清除所有已经选中的选项
select.deselect_all()
 
#选择对应选项
select.select_by_visible_text("学院1")
select.select_by_visible_text("学院2")
复制
 
11、其他操作元素的方法
ActionChains类里面提供了一些特殊动作的模拟。
 
11.1 使用ActionChains来模拟鼠标移动
from selenium.webdriver.common.action_chains import ActionChains
 
#初始化对象
ac = ActionChains(wd)
 
#鼠标移动到元素上
ac.move_to_element(
wd.find_element(By.CSS_SELECTOR,'[name="briicon"]')
).perform()
复制
12、冻结界面
在开发者工具栏console里面执行如下js代码
 
#冻结界面5秒
setTimeout(function(){debugger},5000)
复制
13、弹出框处理
13.1 Alert弹出框
模拟用户点击OK按钮
 
#---alert----
driver.find_element(By.ID,'b1').click()
 
#打印弹出框提示信息(获取弹出对话框的文本)
print(driver.switch_to.alert.text)
 
#点击OK按钮
driver.switch_to.alert.accept()
复制
13.2 Confirm
Confirm弹出框,主要是让用户确认是否要进行某个操作
 
13.2.1 点击OK按钮
driver.switch_to.alert.accept()
复制
13.2.2 点击Cancel按钮
driver.switch_to.alert.dismiss()
复制
13.2.3 样例
#---confirm----
driver.find_element(By.ID,'b1').click()
 
#打印弹出框提示信息(获取弹出对话框的文本)
print(driver.switch_to.alert.text)
 
#点击OK按钮
driver.switch_to.alert.accept()
 
driver.find_element(By.ID,'b2').click()
 
#点击取消按钮
driver.switch_to.alert.dismiss()
复制
 
13.3 Prompt
13.3.1 基础知识
出现Prompt弹出框是需要用户输入一些信息,提交上去
 
driver.switch_to.alert.send_keys()
复制
13.3.2 实例
#获取alert对象
alert = driver.switch_to.alert
 
#打印弹出框提示信息
print(alert.text)
 
#输入信息,并且点击OK按钮提交
alert.send_keys('web自动化 - selenium')
alert.accept()
 
#点击Cancel按钮取消
driver.find_element(By.ID,'b3').click()
alert = driver.switch_to.alert
alert.dismiss()
复制
 
13.4 注意
有些弹窗并非浏览器的alert窗口,而是html元素,这种对话框,只需要通过之前介绍的选择器选中并进行相应的操作。
 
14、xpath选择元素
14.1 绝对路径选择
Xpath路径以正斜杠(/)开始,就表示从根节点开始,从根节点开始的路径表达式,就是某元素的绝对路径。
 
xpath表达式 /html/body/div 等价于 css表达式里的 html>body>div
复制
如果要使用Xpath来选择web元素,应该调用WebDriver对象的方法
find_element(By.XPATH, ‘XX’)
或者
find_elements(By.XPATH, ‘XX’)
 
elements = driver.find_elements(By.XPATH,'/html/body/div')
复制
14.2 相对路径选择
如果要选择某个元素,不管它的位置,那么如果用css表达式,直接写一个div就可以了,如果用xpath,那么xpath需要前面加//,表示从当前节点往下寻找所有的后代元素,不管它在什么位置,则写成//div。
 
#选择div元素里面的所有的p元素
elements = driver.find_elements(By.XPATH,'//div//p')
复制
14.3 通配符
如果要选择所有div节点的所有直接子节点,可以使用表达式//div/*,是一个通配符,对应任意节点名的元素,等价于css选择器div>
 
elements = driver.find_elements(By.XPATH,'//div/*')
for element in elements:
print(element.get_attribute('outerHTML'))
复制
14.4 根据属性选择
14.4.1 用法
根据属性来选择元素,是通过[@属性名 = ‘属性值’]
 
14.4.2 注意
属性名前有@
属性值一定要用引号,可以是单引号,也可以是双引号
 
14.4.3 根据id属性选择
选择id为west
 
//*[@id='west']
复制
14.4.4 根据class属性选择
选择所有div元素中class为single_choice的元素
 
//div[@class='single_choice']
复制
如果一个元素class有多个
 
//p[@class="capital huge-city"]
复制
14.4.5 css选择属性值包含某个字符串的元素
#选择a节点,里面的href属性包含了beian字符串
a[href*="beian"]
复制
14.4.6 选择属性值以某个字符串开头的元素
#选择a节点,里面的href属性以http开头
a[href^="beian"]
复制
14.4.7 选择属性值以某个字符串结尾的元素
#选择a节点,里面的href属性以gov.cn结尾
a[href$="gov.cn"]
复制
14.4.8 属性值包含字符串
#选择style属性值包含color字符串的页面元素
//*[contains(@style,'color')]
 
#选择style属性值以color字符串开头的页面元素
//*[starts-with(@style,'color')]
复制
14.5 按次序选择
xpath也可以根据次序选择元素。语法比css更简洁,直接在方括号中使用数字表示次序
 
14.5.1 某类型第几个子元素
#选择p类型第2个的子元素
//p[2]
 
#选取父元素为div中的p类型第2个子元素
//div/p[2]
复制
14.5.2 第几个子元素
#选择父元素为div的第2个子元素
//div/*[2]
复制
14.5.3 某类型 倒数第几个子元素
last( )本身代表最后一个元素
last( )-1本身代表倒数第2个元素
 
#选取p类型倒数第1个子元素
//p[last()]
 
#选择p类型倒数第2个子元素
//p[last()-1]
 
#选择父元素为div中p类型倒数第二个子元素
//div/p[last()-2]
复制
14.5.4 范围选择
xpath还可以选择子元素的次序范围
 
#选取option类型第1到2个子元素
//option[position()<=2]
//option[position()<3]
 
#选择class属性为multi_choice的前3个子元素
//*[@class='multi_choice']/*[position()<=3]
 
#选择class属性为multi-choice的后3个子元素
//*[@class='multi_choice']/*[position()>=last()-2]
复制
14.6 组选择和兄弟节点
14.6.1 组选择
css有组选择,可以同时使用多个表达式,多个表达式选择的结果都是要选择的元素。
 
(1)css和xpath的区别
css组选择,表达式之间用 逗号 隔开
xpath则是用 竖线 隔开多个表达式
 
#选择所有的option元素和所有的h4元素
//option|//h4
 
#等同于css选择器
option,h4
 
#选择所有的class为single_choice和class为multi_choice的元素
//*[@class='single_choice']|//*[@class='multi_choice']
复制
14.6.2 选择父节点
某个元素的父节点用/…表示
 
#选择id为china的节点的父节点
//*[@id='china']/..
 
#继续找上层父节点
//*[@id='china']/../../..
复制
14.6.3 选择兄弟节点
(1) xpath选择后续兄弟节点,用following-sibling::
 
#选择class为single_choice的元素的所有后续兄弟节点
//*[@class='single_choice']/following-sibling::*
 
#选择class为single_choice的元素的所有后续兄弟节点的div节点
//*[@class='single_choice']/following-sibling::div
 
复制
(2) xpath选择前面的兄弟节点,用preceding-sibling::
 
#选择class为single_choice的元素的所有前面的兄弟节点
//*[@class='single_choice']/preceding-sibling::*
复制
14.7 注意
xpath如果在某个WebElement里使用时,如果要选择里面的元素,前面一定要加小数点
 
#先寻找id是china的元素
china = wd.find_element(By.ID, 'china')
 
#再通过WebElement对象选择该元素内部的p元素
elements = china.find_element(By.XPATH, './/p')
复制
python
爬虫
selenium
济宁小区充电桩招商,无需店面,无需经验,全程扶持!
驴充充
广告
 
python爬虫+selenium模拟点击+网页内容需要点击打开
7879阅读·3评论·12点赞
2020年3月9日
selenium中模拟鼠标操
 
 
 
 
 
 

Python自动化办公——Selenium控制浏览器
统计分析与数据挖掘
这一节我们将学习使用selenium模块控制浏览器,其中包括自动打开网页,寻找页面元素并模拟鼠标点击,填写并提交表单以及发送特殊键如回车,换行,到页面底部等操作。”

准备工作
Selenium模块是利用程序直接操控浏览器,就像模拟用户与页面交互一样,你只需把程序设定好就可以让他自己执行一系列操作像打开网页,填写内容,提交表单,下载文件等操作。但其运行时间较慢。
这里我们以FireFox浏览器作为我们将要去控制的浏览器,那么我们需要在电脑中提前下载安装好FireFox浏览器,同时要下载一个可以让程序控制它的驱动,驱动下载链接为Releases · mozilla/geckodriver · GitHub,可以根据自己电脑的版本来下载对应的驱动。下载好后将其解压到自己指定的文件夹中,selenium模块可以通过在cmd中 ‘pip install selenium’进行安装。以上准备完成后就可以执行接下来的操作了,我们先简单的试一下:

#导入相关模块from selenium import webdriverfrom selenium.webdriver.chrome.service import Service#将驱动所在路径放入service中drive = Service('D:\\软件\\geckodriver.exe')#启动火狐浏览器browser = webdriver.Firefox(service=drive)#将链接指向https://xueshu.baidu.com/browser.get('https://xueshu.baidu.com/')

输出:
图片

这样我们就成功利用程序自动打开了网页!
点击页面
下面我们模拟鼠标点击页面,我们在百度学术的右面可以看到各个功能,接下来我们想进入学术分析这一栏目中,应该如何操作呢?首先我们需要获取到学术分析所在的位置,并转到它所代表的链接,这需要我们知道如何在页面中寻找元素。WebDriver中寻找元素通常使用的是find_elements(by=By.*),其中包括以下几种查找方式:
图片


比如这里我们可以根据(LINK_TEXT)“学术分析”所在的位置找到其链接,进而进行模拟点击的操作,使其跳转到“学术分析”页面:

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.action_chains import ActionChains#导入Byfrom selenium.webdriver.common.by import Bydrive = Service('D:\\软件\\geckodriver.exe')browser = webdriver.Firefox(service=drive)browser.get('https://xueshu.baidu.com/')link = browser.find_element(by=By.LINK_TEXT,value='学术分析')link.click()

按道理来说,这样就能成功转到学术分析所指的页面,然而现在只停在打开的时候的页面外加一堆看不到的错误提示。在进行短暂的思考过后,发现其刚打开页面的时候首先会出现一个页面提示(如首页图所示),需要先点击一下页面(任意位置即可),才能进行后续操作,那么我们也可以利用程序模拟鼠标随意点击下页面再进行后续操作就可以了呀!:

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.action_chains import ActionChains#导入Byfrom selenium.webdriver.common.by import Bydrive = Service('D:\\软件\\geckodriver.exe')browser = webdriver.Firefox(service=drive)browser.get('https://xueshu.baidu.com/')#随意点击页面,位置为页面横坐标500,纵坐标100处ActionChains(browser).move_by_offset(500, 100).click().perform()link = browser.find_element(by=By.LINK_TEXT,value='学术分析')link.click()

输出:
图片
填写并提交表单
我们还可以找到网页中的输入文本部分,通常是<input>或<textarea>元素,通过调用send_keys()方法将文本传进去,再使用submit()方法提交表单,等同于点击表单所在的提交按钮,比如这里我们想搜索有关‘medical’的文献,即可找到百度学术检索框的位置:
图片

然后将’medical’传入进去并提交:
from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bydrive = Service('D:\\软件\\geckodriver.exe')browser = webdriver.Firefox(service=drive)browser.get('https://xueshu.baidu.com/')ipt = browser.find_element(by=By.ID,value='kw')ipt.send_keys('medical')ipt.submit()
输出:
图片
发送特殊键及点击浏览器按钮
如果我们想要的内容不在光标当前所在的页面位置,我们可以通过滚动到该页面的底部进行获取。这里我们利用的是<html>标签,以及Keys的END变量。<html>标签通常是在HTML文件的开头和结尾处,因此我们利用它来滚动页面:

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.keys import Keysdrive = Service('D:\\软件\\geckodriver.exe')browser = webdriver.Firefox(service=drive)browser.get('https://xueshu.baidu.com/')#随意点击页面,位置为页面横坐标500,纵坐标100处ActionChains(browser).move_by_offset(500, 100).click().perform()roll = browser.find_element(by=By.TAG_NAME,value='html')roll.send_keys(Keys.END)

输出:
图片
我们还可以模拟点击浏览器按钮比如前进browser.forward(),后退browser.back(),刷新browser.refresh(),关闭窗口browser.quit():

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bydrive = Service('D:\\软件\\geckodriver.exe')browser = webdriver.Firefox(service=drive)browser.get('https://xueshu.baidu.com/')browser.refresh()

selenium还能做的远不止这些,比如模拟登录,修改cookie等等
以上即为本次全部内容,写文不易,如果您觉得我们的推送对您很有帮助,您可以通过赞赏来给予我们超大鼓励!跪谢~
END
参考资料
[1]Python编程快速上手:让繁琐工作自动化/(美)斯维加特(Al Sweigart)著;王海鹏译. -- 北京:人民邮电出版社,2016.7
[2]Selenium Documentation — Selenium 4.4 documentation
https://www.selenium.dev/selenium/docs/api/py/api.html

图片
作者:三五七

Python自动化办公——利用Beautiful Soup爬取网页中天气信息
原创 童舒 统计分析与数据挖掘 2022-09-08 16:00 发表于江苏
收录于合集
#Python
58个
“上一节我们学习了如何查看网页的源代码,并在源代码中找到自己想要的信息。这一节我们将学习Beautiful Soup模块,如何利用Beautiful Soup模块让程序自己找到我们想要的信息。这里以爬取某城市的天气信息为例。”


Beautiful Soup模块

 

Beautiful Soup是Python中用于从HTML页面提取信息的模块,在导入模块时,使用的名称是bs4.我们需要提前在cmd中安装这个模块——pip install beautifulsoup4.在导入时直接使用import bs4即可。

通过上一节的学习我们知道HTML是由多个标签,元素等组成的,我们下载下来的HTML文件同样也包含不同的标签和属性。直接看网页源代码貌似很令人头痛,但借助BeautifulSoup就会使其变得简单许多。

使用Beautiful Soup首先要知道它需要传入什么对象,如何将网址转换成Beautiful Soup接收的对象。这里我们可以利用request.get()函数得到网址对应的HTML形式,将其text形式传递给Beautiful Soup,并返回一个Beautiful Soup对象:
import requests,bs4
res = requests.get('https://www.baidu.com/')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,'html.parser')
type(soup)
输出:
bs4.BeautifulSoup

bs4.BeautifulSoup的第二个参数是用来选择解析器的参数,下图包含了不同解析器的优势和劣势,有的时候需要安装解析器,如使用pip install html5lib即可.


用select()方法寻找元素


我们可以根据标签或者属性来找自己想要的信息,下图列出了几种查找方法:


Select()方法会返回一个tag对象的列表,如找到6个符合条件的对象则返回包含6个tag对象的列表,我们可以通过索引来返回某一个想要的对象。不同的选择器也可以进行组合,比如soup.select(div#author)则表明可以匹配在div标签下的id属性为author的元素:<div><p id=’author’>exemple</p></div>

爬取天气信息


下面我们以查找某省市当日气温为例来学习一下!

首先我们先获取到北京市的天气信息的网页:
import bs4,requests
#若不加headers,网页会认为你是机爬虫而阻止访问
headers = { "Accept":"text/html,application/xhtml+xml,application/xml;",
"Accept-Encoding":"gzip",
"Accept-Language":"zh-CN,zh;q=0.8",
"Referer":"http://www.xicidaili.com/",
"User-Agent":"Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/42.0.2311.90 Safari/537.36"
}
res = requests.get('https://www.tianqi.com/beijing/',headers=headers)
soup = bs4.BeautifulSoup(res.text,'html.parser')

这里需要为你的访问加上一个“头”这个headers用来代表你不是爬虫,否则会被阻止访问而得不到网页信息。

接下来我们可以通过观察源文件,找到自己想要信息所在的标签:


我们可以看到,温度信息在div标签下的dd标签中的span标签内,我们可以利用查找标签的形式来找到温度信息:
weather = soup.select('dd span')
len(weather)
输出:
2

这里我们查找的是dd标签下的span标签,结果显示有两个符合条件的对象,因为符合条件的对象较少我们可以查看一下,找到相对应的信息:
weather[0]
输出:
<span><b>晴</b>18 ~ 31℃</span>

在第一个对象中就存有我们想要的信息,我们可以通过get_Text来获取其中的文字信息:
weather[0].getText()
输出:
'晴18 ~ 31℃'

这样就成功获取到了北京市的天气情况。我们通过观察该天气网址,不难看出其是通过城市名的拼音来构建对应城市的天气信息,假如我们需要很多城市的天气情况,可以利用循环得到城市的名称,再将其转换为拼音的格式(xpinyin模块)拼接到网址中,最后利用BeautifulSoup就可以获取到不同城市的天气情况啦!

以上即为本次全部内容,写文不易,如果您觉得我们的推送对您很有帮助,您可以通过赞赏来给予我们超大鼓励!跪谢~

END


参考资料

[1]Python编程快速上手:让繁琐工作自动化/(美)斯维加特(Al Sweigart)著;王海鹏译. -- 北京:人民邮电出版社,2016.7
[2]Beautiful Soup 中文文档
https://beautifulsoup.cn/#id13

 



作者:三五七

“统计分析与数据挖掘”是一个分享以原创为主的数据挖掘、统计软件操作、生信分析、机器学习等内容的文章、教程和学习视频的公众号。创建的原目的是为了敦促学生学习相关知识和进行写作训练。如果您喜欢我们的推送内容,欢迎点赞、转发、在看,您的支持将是我们深入学习的动力!

统计分析与数据挖掘
一周三推,分享以原创为主的数据挖掘、统计软件操作、生信分析、机器学习等内容的文章、教程和学习视频。
246篇原创内容
公众号