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

05-01 2016阅读 0评论

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

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

        引入将要使用到的库

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()

 

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

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

 

        找到并点击 阳光开奖 链接,继续等待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])

 

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

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

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

 

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

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

# 滚动到最底部(不是必须)    
# 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)

 

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

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

# 下一页   
# 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)

 

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

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

 

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

# 在右上角的输入框中输入内容    使用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])

 

        点击第一个结果:

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

# 点击第一个结果
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 图片:

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

完整程序代码:

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  

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

 参考:

[1] Selenium Python 教程 - 知乎

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

[3] xlwings,让excel飞起来!

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

[5] 定位策略 | Selenium


免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,2016人围观)

还没有评论,来说两句吧...

目录[+]