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

news2024/11/26 22:29:27

安装 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 来操作 Excel
    pip install xlwings
'''

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import xlwings as xw

driver = 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")              # 保存xlsx
        wb.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.coloradmin.cn/o/978432.html

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

相关文章

C++内存区堆和栈

在C中&#xff0c;内存分成5个区&#xff0c;堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆&#xff0c;就是那些…

《Linux从练气到飞升》No.21 Linux简单实现一个shell

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

​​​​​​​光伏智慧设施休息区

随着人们环保意识的日益增强&#xff0c;光伏智慧景观渐渐出现在大众的视野&#xff0c;成为低碳城镇建设的新景观、新亮点。打造光伏智慧设施休息区&#xff0c;既能满足游客休息纳凉&#xff0c;还能设置手机相机等充电区域。此设备组还可提供夜间照明灯、音乐广播、多媒体广…

flask中的操作数据库的插件Flask-SQLAlchemy

1、ORM 框架 Web 开发中&#xff0c;一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了&#xff0c;也称 SQL 数据库。另外&#xff0c;文档数据库&#xff08;如 mongodb&#xff09;、键值对数据库&#xff08;如 redis&#xff09;近几年也逐渐在 w…

普通平衡树 Splay

Splay 简介 Splay&#xff08;伸展树&#xff09;&#xff0c;又叫做分裂树&#xff0c;是一种自调整形式的二叉查找树&#xff0c;满足二叉查找树的性质&#xff1a;一个节点左子树的所有节点的权值&#xff0c;均小于这个节点的权值。且其右子树所有节点的权值&#xff0c;均…

IEC 62368-1:2023(第4版)《音频视频、信息和通信设备 第1部分安全要求》标准发布,IEC 62368-1第四版标准更新与变化

2023年05月26日&#xff0c;IEC 62368-1:2023 《音频视频、信息和通信设备 第1部分安全要求》第4版标准正式发布&#xff0c;2023年08月18日&#xff0c;IECEE又发布了TRF模板&#xff0c;为新版标准的实施和应用做好了准备. 下载地址 &#xff1a; https://download.csdn.net…

【个人博客系统网站】项目的发布 · 通过公网IP访问我们的网站 · 思考总结

【JavaEE】进阶 个人博客系统&#xff08;6&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;6&#xff09;1. 项目发布1.1 后端代码修改1.1.1 数据库密码1.1.2 端口号修改1.1.3 文件保存地址修改1.1.4 静态资源映射修改 1.2 云服务器1.2.1 建库建表1.2.2 必要…

算法通关村第十三关——溢出问题处理模板

前言 溢出问题是面试当中输出涉及到数字的一个需要特别注意的地方&#xff0c;典型的题目有三个&#xff1a;数字反转&#xff0c;将字符串转成数字和回文数。 1.整数反转 力扣7题&#xff0c;给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。…

Vue + Element UI 前端篇(十五):嵌套外部网页

Vue Element UI 实现权限管理系统 前端篇&#xff08;十五&#xff09;&#xff1a;嵌套外部网页 嵌套外部网页 在有些时候&#xff0c;我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面&#xff0c;接口文档页面等。 这个时候就要求我们的导航菜…

Intel OneAPI黑客松记录

题目&#xff1a; 生成2048*2048个随机单精度实数; 实现两维Real to complex FFT参考代码; 使用OneMKL计算两维Real to complex FFT; 对两维FFT输出数据进行全数据比对&#xff1b; 平均性能数据比对,输出FFT参考代码平均运行时间和oneMKL FFT平均运行时间。 代码&#x…

12 - 多线程之锁优化(上):深入了解Synchronized同步锁的优化方法

在并发编程中&#xff0c;多个线程访问同一个共享资源时&#xff0c;我们必须考虑如何维护数据的原子性。在 JDK1.5 之前&#xff0c;Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁&#xff0c;锁的获取和释放是由 JVM 隐式实…

序列化二叉树

解题思路一&#xff1a; import java.util.*; /* public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {int index -1;String Serialize(TreeNode root) {StringBuffer resul…

Jenkins介绍

Jenkins介绍 持续集成、持续部署的工具很多&#xff0c;其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务&#xff0c;并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作&#xff0c;安装成本较高&#xff0…

FreeRTOS源码分析-14 操作系统多任务核心

1 列表及列表项概念及其应用 1.1 freeRTOS列表介绍 任务调度列表介绍 其他组件列表介绍 1.2 列表及列表项的定义 双向链表结构 1&#xff1a;插入与删除效率高&#xff0c;只要操作一次就能完成 2&#xff1a;对数据的管理更加灵活与便捷&#xff0c;有利于编写逻辑清晰的…

MyBatisPlus入门篇2 - 条件查询、查询投影、查询条件、id生成策略、多记录操作、逻辑删除

目录 1.条件查询、多条件查询 MyBatisPlus将书写复杂的SQL查询条件进行了封装&#xff0c;使用编程的形式完成查询条件的组合。 Test void testGetByCondition() {// 方式一&#xff1a;按条件查询QueryWrapper<User> qw new QueryWrapper<User>();qw.lt("…

解决虚拟机克隆后IP和命名冲突问题

目录 解决IP冲突问题 解决命名冲突 解决IP冲突问题 克隆后的虚拟机和硬件地址和ip和我们原虚拟机的相同&#xff0c;我们需要重新生成硬件地址和定义ip&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;进入 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件…

【MySQL】7、MHA高可用配置及故障切换

MHA概述 MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA用来解决MySQL单点故障问题&#xff1b; MySQL故障切换过程中&#xff0c;能30秒内自动完成故障切换&#xff0c;并保证数据的一致性&#xff0c;实…

远程工作面试:特殊情况下的面试技巧

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Python批处理(一)提取txt中数据存入excel

Python批处理&#xff08;一&#xff09;提取txt中数据存入excel 问题描述 现从冠层分析软件中保存了叶面积指数分析的结果&#xff0c;然而软件保存格式为txt&#xff0c;且在不同的文件夹中&#xff0c;每个文件夹的txt文件数量不固定&#xff0c;但是txt文件格式固定。现需…

Java多线程父线程向子线程传值解决方案

目录 1 背景2 ThreadLocalTaskDecorator3 RequestContextHolderTaskDecorator4 MDCTaskDecorator5 InheritableThreadLocal5.1 源码分析5.2 InheritableThreadLocal存在的问题 6 TransmittableThreadLocal 1 背景 在实际开发过程中我们需要父子之间传递一些数据&#xff0c;比…