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


    安装 web driver:

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

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

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

    Chrome Driverhttps://sites.google.com/chromium.org/driver/

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

    Firefox Driverhttps://github.com/mozilla/geckodriver/releases

     

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

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

            引入将要使用到的库

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

     

            初始化驱动器:

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

     

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

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

     

             然后将窗口最大化:

    driver.maximize_window()

     

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

     

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

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

     

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

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

     

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

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

     

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

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

     

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

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

     

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

     

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

     

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

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

     

            点击第一个结果:

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

     

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

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

     

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

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

     

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

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

     

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

    完整程序代码:

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

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

    1. '''
    2. 需要安装 xlwings 来操作 Excel
    3. pip install xlwings
    4. '''
    5. from selenium import webdriver
    6. from selenium.webdriver.common.by import By
    7. from time import sleep
    8. import xlwings as xw
    9. driver = webdriver.Chrome()
    10. driver.get('http://www.cwl.gov.cn/ygkj/kjgg/')
    11. sleep(2)
    12. driver.find_element(By.CLASS_NAME, 'ygkj_wqkjgg_nav').click()
    13. sleep(2)
    14. # 保存结果
    15. days = []
    16. qiu_list = []
    17. def get_data(total_pages, current_page, file_name = 'data'):
    18. tbody = driver.find_element(By.TAG_NAME, 'tbody')
    19. trs = tbody.find_elements(By.TAG_NAME, 'tr')
    20. for tr in trs:
    21. tds = tr.find_elements(By.TAG_NAME, 'td')
    22. days.append(tds[1].text)
    23. qiu_items = tr.find_elements(By.CLASS_NAME, 'qiu-item')
    24. nums = []
    25. for item in qiu_items:
    26. nums.append(item.text)
    27. qiu_list.append(nums)
    28. # 递归调用
    29. if current_page < total_pages:
    30. # 下一页
    31. driver.find_element(By.CLASS_NAME, 'layui-laypage-next').click()
    32. get_data(total_pages, current_page + 1)
    33. else:
    34. driver.quit() # 停止驱动器,关闭网页
    35. # 创建一个不显示、不添加新的工作簿的 Excel 应用程序对象
    36. app = xw.App(visible=False, add_book=False)
    37. # 创建了一个新的工作簿对象,并将其赋值给 wb 变量。
    38. wb = app.books.add()
    39. # 获取第一张表格
    40. sheet_1 = wb.sheets['sheet1']
    41. sheet_1["A1"].value = "时间" # 设置A1单元格的内容
    42. for i in range(1, 7): # 设置 B1 ~ H1的内容
    43. sheet_1[f"{chr(ord('A') + i)}1"].value = f"红{i}"
    44. sheet_1[f"{chr(ord('A') + 7)}1"].value = "蓝"
    45. for i in range(len(days)): # 填写内容
    46. sheet_1[f"A{2 + i}"].value = days[i]
    47. sheet_1[f"B{2 + i}:{chr(ord('B') + 7)}{2 + i}"].value = qiu_list[i]
    48. wb.save(f"./{file_name}.xlsx") # 保存xlsx
    49. wb.close() # 关闭该工作簿对象
    50. app.quit() # 关闭应用程序
    51. print('successful.')
    52. if __name__ == '__main__':
    53. get_data(total_pages=3, current_page=1)

     参考:

    [1] Selenium Python 教程 - 知乎

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

    [3] xlwings,让excel飞起来!

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

    [5] 定位策略 | Selenium

  • 相关阅读:
    Docker下安装oracle11g数据库(Win10)
    设计模式(三):抽象工厂模式
    如何将WGS分析成本降低30% 【内含Sentieon免费攻略】
    springcloud--riboon快速搭建
    Linux内核顶层Makefile的make过程说明一
    Java操作Redis以及Redis线程池的用法
    oracle分组排序去重
    Python 连接 ES 的 API 用例:获取满足条件的索引列表
    DelphiWebMVC对VUE导出包的支持
    Gitlab部署
  • 原文地址:https://blog.csdn.net/hao_13/article/details/132701205