您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-29
后台-插件-广告管理-内容页头部广告(手机)

安装 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 同级的目录下。

        引入将要使用到的库

  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

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索