python 学习笔记(4)—— webdriver 自动化操作浏览器(基础操作)

安装 web driver:

        使用 driver 前,需要下载与浏览器版本相对应的 driver。如要在 Chrome 浏览器上操作,就要下载Chrome Driver。

几个常用浏览器的参考和下载地址:

Edge Driver:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

Chrome Driver:https://sites.google.com/chromium.org/driver/

        https://googlechromelabs.github.io/chrome-for-testing/

Firefox Driver:https://github.com/mozilla/geckodriver/releases

 

        这里使用Chrome浏览器,下载Chrome Driver。

        下载并安装完成后,将.exe文件拷贝到 python.exe 同级的目录下。

        引入将要使用到的库

from selenium import webdriver# By 里定义了许多常量,用来标识以何种形式来查找元素,如 By.CLASS_NAME 使用类名来查找
from selenium.webdriver.common.by import By# 主要用来等待(确保页面加载、更新完成)
import time

 

        初始化驱动器:

driver = webdriver.Chrome()# 如果没有将driver.exe放到环境变量或python.exe同级目录下,则要参数中指定
# driver = webdriver.Chrome('F:/chromedriver.exe')

 

        打开Chrome浏览器,访问指定的网站:

driver.get('http://www.cwl.gov.cn/fcpz/yxjs/ssq/')
time.sleep(3)            # 等待3秒再继续,确保页面加载完成

 

         然后将窗口最大化:

driver.maximize_window()

 

        观察页面和控制台,锁定目标(阳光开奖)的特征。

 

        找到并点击 阳光开奖 链接,继续等待3秒,确保页面加载更新完成:

# find_element 返回的是第一个匹配的元素
# By.XPATH 使用类似 xPath 的语法来定位页面的元素, 第二个参数是对应的 xPath 内容
driver.find_element(by=By.XPATH, value="//div[@data-alias='ygkj']").click()
time.sleep(3)

 

        此时浏览器会打开一个新的标签页,我们需要将 driver 定位到新的标签页中

# 获取当前打开的几个窗口,返回的是一个列表,每个元素是每个标签页的标识
windows = driver.window_handles# 切换到最新打开的窗口,保证后面能正常获取页面中的元素
driver.switch_to.window(windows[-1])

 

        结合控制台和页面,找到 往期开奖公告 的特征标识,找到该元素并点击:

# 点击往期开奖公告
# By.PARTIAL_LINK_TEXT  使用链接的文本内容来进行搜索,后面的值是目标元素的innerText
driver.find_element(by=By.PARTIAL_LINK_TEXT, value="往期开奖公告").click()
time.sleep(3)

 

         然后尝试在界面执行一个脚本,滚动到页面底部

# 滚动到最底部(不是必须)    
# By.CLASS_NAME 使用类名来查找底部的图片 第二个参数是对应的类名
target = driver.find_element(by=By.CLASS_NAME, value='footer-logo')# 对于指定的元素执行脚本   这里的arguments[0]是第二个参数target
driver.execute_script('arguments[0].scrollIntoView({behavior:"smooth"})', target)
time.sleep(2)

 

        然后找到下一页的按钮,并点击进入下一页:

# 下一页   
# By.ID     指定使用 id 属性来查找元素,第二个参数是id值
# 这里先试用id来找到祖父节点,顺着该节点再继续往下找
paging = driver.find_element(by=By.ID, value='paging')
paging.find_element(by=By.CLASS_NAME, value='layui-laypage-next').click()
time.sleep(2)

 

        在当前界面的右上角,有搜索功能,尝试自动输入指定内容并搜索

 

# 在右上角的输入框中输入内容    使用ID来表示元素
# send_keys    在输入框中键入指定的内容,即输入 2023-5
driver.find_element(By.ID, 'searchInput').send_keys('2023-5')
time.sleep(2)# 点击搜索按钮        先找父级,在从父级找子元素
btnParent = driver.find_element(By.CLASS_NAME, 'input-group-btn')
btnParent.find_element(By.CLASS_NAME, 'btn-default').click()
time.sleep(2)

 

        点击搜索后,会新创建一个标签页,此时需要更新 driver 到新的标签页面。

# 及时切换窗口
windows = driver.window_handles
driver.switch_to.window(windows[-1])

 

        点击第一个结果:

# 点击第一个结果
items = driver.find_elements(By.CLASS_NAME, 'con-item')
items[0].find_element(By.CLASS_NAME, 'black').click()

 

        点击后,同样会新开一个标签页,此时我们把当前这个搜索结果的标签页关闭,然后跳转到新的标签页中:

# 关闭当前标签页并切换到新的窗口
driver.close()
windows = driver.window_handles
driver.switch_to.window(windows[-1])
time.sleep(2)

 

        如果要返回历史开奖结果页面:

# 返回开奖历史记录
driver.switch_to.window(windows[-2])

 

        如果想给开奖结果截一个图(元素截图):

# 指定元素截图(只截图当前浏览器窗口可见部分)
main = driver.find_element(By.CLASS_NAME, 'main')
main.screenshot('./caipiao_1.png')    # 命名并保存

 

        然后可以在当前的目录下查看 caipiao.png 图片:

完整程序代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 初始化驱动器
driver = webdriver.Chrome()
# 如果没有将driver.exe放到环境变量或python.exe同级目录下,则要参数中指定
# driver = webdriver.Chrome('F:/chromedriver.exe')# 访问指定网站
driver.get('http://www.cwl.gov.cn/fcpz/yxjs/ssq/')
driver.maximize_window()            # 最大化窗口
time.sleep(3)# 点击阳光开奖  使用Xpath来搜索
driver.find_element(by=By.XPATH, value="//div[@data-alias='ygkj']").click()
time.sleep(3)# 获取当前打开了几个窗口
windows = driver.window_handles
# 会打开新的标签页,因此需要切换到最新打开的窗口,保证后面能正常获取元素
driver.switch_to.window(windows[-1])# 点击往期开奖公告    使用链接的文本内容来进行搜索
driver.find_element(by=By.PARTIAL_LINK_TEXT, value="往期开奖公告").click()
time.sleep(3)# 滚动到最底部
target = driver.find_element(by=By.CLASS_NAME, value='footer-logo')
# 对于指定的元素执行脚本   这里的arguments[0]是第二个参数target
driver.execute_script('arguments[0].scrollIntoView({behavior:"smooth"})', target)
time.sleep(2)# 下一页   先试用id来找到祖父节点,顺着该节点再继续往下找
paging = driver.find_element(by=By.ID, value='paging')
paging.find_element(by=By.CLASS_NAME, value='layui-laypage-next').click()
time.sleep(2)# 在右上角的输入框中输入内容
driver.find_element(By.ID, 'searchInput').send_keys('2023-5')
time.sleep(2)# 点击搜索按钮
btnParent = driver.find_element(By.CLASS_NAME, 'input-group-btn')
btnParent.find_element(By.CLASS_NAME, 'btn-default').click()
time.sleep(2)# 及时切换窗口
windows = driver.window_handles
driver.switch_to.window(windows[-1])# 点击第一个结果
items = driver.find_elements(By.CLASS_NAME, 'con-item')
items[0].find_element(By.CLASS_NAME, 'black').click()# 关闭当前标签页并切换到新的窗口
driver.close()
windows = driver.window_handles
driver.switch_to.window(windows[-1])
time.sleep(2)# 返回开奖历史记录
driver.switch_to.window(windows[-2])# 指定元素截图(只截图当前浏览器窗口可见部分)
main = driver.find_element(By.CLASS_NAME, 'main')
main.screenshot('./caipiao_1.png')input('')               # 保持程序运行状态,浏览器不会被关闭

        获取前三页的彩票中奖号码,并写入到 Excel 中:

'''需要安装 xlwings 来操作 Excelpip install xlwings
'''from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import xlwings as xwdriver = webdriver.Chrome()
driver.get('http://www.cwl.gov.cn/ygkj/kjgg/')
sleep(2)driver.find_element(By.CLASS_NAME, 'ygkj_wqkjgg_nav').click()
sleep(2)# 保存结果
days = []
qiu_list = []def get_data(total_pages, current_page, file_name = 'data'):tbody = driver.find_element(By.TAG_NAME, 'tbody')trs = tbody.find_elements(By.TAG_NAME, 'tr')for tr in trs:tds = tr.find_elements(By.TAG_NAME, 'td')days.append(tds[1].text)qiu_items = tr.find_elements(By.CLASS_NAME, 'qiu-item')nums = []for item in qiu_items:nums.append(item.text)qiu_list.append(nums)# 递归调用if current_page < total_pages:# 下一页driver.find_element(By.CLASS_NAME, 'layui-laypage-next').click()get_data(total_pages, current_page + 1)else:driver.quit()       # 停止驱动器,关闭网页# 创建一个不显示、不添加新的工作簿的 Excel 应用程序对象app = xw.App(visible=False, add_book=False)# 创建了一个新的工作簿对象,并将其赋值给 wb 变量。wb = app.books.add()# 获取第一张表格sheet_1 = wb.sheets['sheet1']sheet_1["A1"].value = "时间"              # 设置A1单元格的内容for i in range(1, 7):                       # 设置 B1 ~ H1的内容sheet_1[f"{chr(ord('A') + i)}1"].value = f"红{i}"sheet_1[f"{chr(ord('A') + 7)}1"].value = "蓝"for i in range(len(days)):                  # 填写内容sheet_1[f"A{2 + i}"].value = days[i]sheet_1[f"B{2 + i}:{chr(ord('B') + 7)}{2 + i}"].value = qiu_list[i]wb.save(f"./{file_name}.xlsx")              # 保存xlsxwb.close()                                  # 关闭该工作簿对象app.quit()                                  # 关闭应用程序print('successful.')if __name__ == '__main__':get_data(total_pages=3, current_page=1)

 参考:

[1] Selenium Python 教程 - 知乎

[2] Python操作Excel的Xlwings教程(一) - 知乎

[3] xlwings,让excel飞起来!

[4] Python 自动化操作 Excel 看这一篇就够了 - 知乎

[5] 定位策略 | Selenium

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码学入门——环游密码世界

文章目录 参考书目一、基本概念1.1 本书主要角色1.2 加密与解密 二、对称密码与公钥密码2.1 密钥2.2 对称密码和公钥密码2.3 混合密码技术 三、其他密码技术 参考书目 图解密码技术 第三版 一、基本概念 1.1 本书主要角色 1.2 加密与解密 加密 解密 密码破译 二、对称密…

Ansible之playbook详解和应用实例

目录 一、playbook简介 1.什么是playbook 2.playbook组成 二、应用实例 1.使用playbook安装启用httpd服务 2.使用playbook安装启用nginx服务 三、ansible-playbook其他用法 1.检查yaml文件的语法是否正确 2.检查tasks任务 3.检查指定的主机 4.指定从某个task开始运行…

Playwright for Python:断言

一、支持的断言 Playwright支持以下几种断言&#xff1a; 断言描述expect(locator).to_be_checked()复选框被选中expect(locator).to_be_disabled()元素是禁用状态expect(locator).to_be_editable()元素是可编辑状态expect(locator).to_be_empty()容器是空的expect(locator).…

Python列表排序

介绍一个关于列表排序的sort方法&#xff0c;看下面的案例&#xff1a; """ 列表的sort方法来对列表进行自定义排序 """# 准备列表 my_list [["a", 33], ["b", 55], ["c", 11]]# 排序&#xff0c;基于带名函数 …

Build阶段-Maven安装配置

构建Java项目的工具一般有两种选择&#xff0c;一个是Maven&#xff0c;一个是Gradle。 这里我们选择Maven作为项目的编译工具。 具体安装Maven流程不做阐述&#xff0c;但是需要确保配置好Maven仓库私服以及JDK编译版本

亚马逊云科技 云技能孵化营——我的云技能之旅

文章目录 每日一句正能量前言活动流程后记 每日一句正能量 不能在已经获得足够多的成功时&#xff0c;还对自己的能力保持怀疑&#xff0c;露出自信的微笑&#xff0c;走出自信的步伐&#xff0c;做一个自信的人&#xff01; 前言 亚马逊云科技 (Amazon Web Services) 是全球云…

镜像的基本命令(docker)

文章目录 前言一、docker命令介绍1、帮助命令2、显示镜像3、搜索镜像4、下载镜像5、删除镜像 总结 前言 本文主要介绍docker中与镜像相关的一些命令&#xff0c;是对狂神课程的一些总结&#xff0c;作为一个手册帮助博主和使用docker的同学们来查找和回忆。 实验环境&#xf…

【买华为云产品,返CSDN余额红包】,快来薅羊毛!

华为云828营销季火热进行中&#xff0c;9月15日前首次购买华为云产品官网任意一款产品&#xff0c;可获得相应比例的CSDN红包。 热门产品云服务器、域名、商标、主机安全等产品都在其中&#xff0c;任君挑选。 活动优惠价购买后还是获得相应比例余额红包&#xff0c;实际付费金…

【Redis专题】Redis持久化、主从与哨兵架构详解

目录 前言课程目录一、Redis持久化1.1 RDB快照&#xff08;Snapshot&#xff09;&#xff1a;二进制文件基本介绍开启/关闭方式触发方式bgsave的写时复制&#xff08;COW&#xff0c;Copy On Write&#xff09;机制优缺点 1.2 AOF&#xff08;append-only file&#xff09;&…

win11安装jdk

Windows11JDK20安装及环境变量配置 - 简书 Java学习--Win11配置环境变量-腾讯云开发者社区-腾讯云 电脑上安装多个JDK版本时如何自由切换_安装多版本jdk_有青枫林的博客-CSDN博客 Windows同时安装两个版本JDK&#xff0c;并实现动态切换JAVA8或者JAVA11 【无标题】windows1…

Gateway的服务网关

Gateway服务网关 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由 权限控制 限流 架构如下&#xff1a; gateway使用 引入依赖 创建gateway服务&#xff0c;引入依赖 <!--网关--> <dependency>…

七、SSM 框架整合

目前已经学习了 MyBatis 框架&#xff0c;Spring 框架&#xff0c;以及Spring MVC 框架。现阶段学习将这三个框架整合到一起&#xff0c;实现简单的前后端交互的曾删改差功能页面。 Mybatis 框架主要负责数据库的操作问题&#xff0c;以及数据回显。该框架将 SQL 与 Jav…

JDK7多线程并发环境HashMap死循环infinite loop,CPU拉满100%,Java

JDK7多线程并发环境HashMap死循环infinite loop&#xff0c;CPU拉满100%&#xff0c;Java HashMap底层数据实现是数组链表&#xff0c;链表在哈希碰撞后装入新数据&#xff0c;像是一个桶。 HashMap在JDK7的实现中&#xff0c;并发环境存在死循环infinite loop问题。导致的结果…

异常-java

目录 一、异常的概念和体系结构 1.1 异常的概念 1.2 异常的体系结构 1.3 异常的分类 二、异常的处理 2.1 防御式编程 2.2 异常抛出 2.3 异常捕获 2.4 异常处理流程 三、自定义异常类 一、异常的概念和体系结构 1.1 异常的概念 程序员在开发过程中&#xff0c;想要将代码写得…

Centos7 + Apache Ranger 2.4.0 部署

一、Ranger简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。 1、组件列表 # Service Name Liste…

Springboot - 13.spring-boot-starter-security集成

&#x1f440;Spring Boot Starter Security 中文文档 Spring Security中文文档 &#x1f440;Spring Boot Starter Security 运行流程 当然可以。首先&#xff0c;我们会将用户存储和认证的流程融入整个Spring Boot Starter Security的使用流程中。以下是当你使用Spring Bo…

Excel VSTO开发4 -其他事件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 4 其他事件 针对插件的事件主要有Startup、Shutdown这两个事件&#xff0c;在第2节中已经讲解。在开发窗口中&#xff0c;选择对象…

“谁天生是项目经理?四大特质决定你的机会“

大家好&#xff0c;我是老原。 但其实不少刚开始尝试项目管理的人&#xff0c;包括老原自己也曾经遇到过这样的问题&#xff1a; ▪ 自己没权没势&#xff0c;大家凭什么听我的&#xff1f; ▪ 资源受限&#xff0c;如何向老板争取更多资源&#xff1f; ▪ 怎样才能推进多方…

WebAssembly 在云原生中的实践指南

1 WebAssembly 介绍 WebAssembly&#xff08;Wasm&#xff09;是一种通用字节码技术&#xff0c;它可以将其他编程语言&#xff08;如 Go、Rust、C/C 等&#xff09;的程序代码编译为可在浏览器环境直接执行的字节码程序。 WebAssembly 的初衷之一是解决 JavaScript 的性能问…

【月报】Aavegotchi 开发进度更新 - 2023 年 8 月

嗨&#xff0c;Gotchigang&#xff01;2023 年的进程已经过了一半&#xff0c;我们团队一直在努力推动 Aavegotchi 生态系统迈向新的高度&#xff01;在本月的开发更新中&#xff0c;我们将分享在以下方面取得的进展&#xff1a; ● Gotchi 游戏 ● Gotchichain ● Aavegotc…