安裝 web driver:
??????? 使用 driver 前,需要下載與瀏覽器版本相對(duì)應(yīng)的 driver。如要在 Chrome 瀏覽器上操作,就要下載Chrome Driver。
幾個(gè)常用瀏覽器的參考和下載地址:
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 同級(jí)的目錄下。
????????引入將要使用到的庫(kù)
from selenium import webdriver
# By 里定義了許多常量,用來(lái)標(biāo)識(shí)以何種形式來(lái)查找元素,如 By.CLASS_NAME 使用類名來(lái)查找
from selenium.webdriver.common.by import By
# 主要用來(lái)等待(確保頁(yè)面加載、更新完成)
import time
?
????????初始化驅(qū)動(dòng)器:
driver = webdriver.Chrome()
# 如果沒(méi)有將driver.exe放到環(huán)境變量或python.exe同級(jí)目錄下,則要參數(shù)中指定
# driver = webdriver.Chrome('F:/chromedriver.exe')
?
??????? 打開(kāi)Chrome瀏覽器,訪問(wèn)指定的網(wǎng)站:
driver.get('http://www.cwl.gov.cn/fcpz/yxjs/ssq/')
time.sleep(3) # 等待3秒再繼續(xù),確保頁(yè)面加載完成
?
???????? 然后將窗口最大化:
driver.maximize_window()
?
??????? 觀察頁(yè)面和控制臺(tái),鎖定目標(biāo)(陽(yáng)光開(kāi)獎(jiǎng))的特征。
?
??????? 找到并點(diǎn)擊 陽(yáng)光開(kāi)獎(jiǎng) 鏈接,繼續(xù)等待3秒,確保頁(yè)面加載更新完成:
# find_element 返回的是第一個(gè)匹配的元素
# By.XPATH 使用類似 xPath 的語(yǔ)法來(lái)定位頁(yè)面的元素, 第二個(gè)參數(shù)是對(duì)應(yīng)的 xPath 內(nèi)容
driver.find_element(by=By.XPATH, value="http://div[@data-alias='ygkj']").click()
time.sleep(3)
?
??????? 此時(shí)瀏覽器會(huì)打開(kāi)一個(gè)新的標(biāo)簽頁(yè),我們需要將 driver 定位到新的標(biāo)簽頁(yè)中:
# 獲取當(dāng)前打開(kāi)的幾個(gè)窗口,返回的是一個(gè)列表,每個(gè)元素是每個(gè)標(biāo)簽頁(yè)的標(biāo)識(shí)
windows = driver.window_handles
# 切換到最新打開(kāi)的窗口,保證后面能正常獲取頁(yè)面中的元素
driver.switch_to.window(windows[-1])
?
??????? 結(jié)合控制臺(tái)和頁(yè)面,找到 往期開(kāi)獎(jiǎng)公告 的特征標(biāo)識(shí),找到該元素并點(diǎn)擊:
# 點(diǎn)擊往期開(kāi)獎(jiǎng)公告
# By.PARTIAL_LINK_TEXT 使用鏈接的文本內(nèi)容來(lái)進(jìn)行搜索,后面的值是目標(biāo)元素的innerText
driver.find_element(by=By.PARTIAL_LINK_TEXT, value="往期開(kāi)獎(jiǎng)公告").click()
time.sleep(3)
?
???????? 然后嘗試在界面執(zhí)行一個(gè)腳本,滾動(dòng)到頁(yè)面底部:
# 滾動(dòng)到最底部(不是必須)
# By.CLASS_NAME 使用類名來(lái)查找底部的圖片 第二個(gè)參數(shù)是對(duì)應(yīng)的類名
target = driver.find_element(by=By.CLASS_NAME, value='footer-logo')
# 對(duì)于指定的元素執(zhí)行腳本 這里的arguments[0]是第二個(gè)參數(shù)target
driver.execute_script('arguments[0].scrollIntoView({behavior:"smooth"})', target)
time.sleep(2)
?
??????? 然后找到下一頁(yè)的按鈕,并點(diǎn)擊進(jìn)入下一頁(yè):
# 下一頁(yè)
# By.ID 指定使用 id 屬性來(lái)查找元素,第二個(gè)參數(shù)是id值
# 這里先試用id來(lái)找到祖父節(jié)點(diǎn),順著該節(jié)點(diǎn)再繼續(xù)往下找
paging = driver.find_element(by=By.ID, value='paging')
paging.find_element(by=By.CLASS_NAME, value='layui-laypage-next').click()
time.sleep(2)
?
??????? 在當(dāng)前界面的右上角,有搜索功能,嘗試自動(dòng)輸入指定內(nèi)容并搜索:
?
# 在右上角的輸入框中輸入內(nèi)容 使用ID來(lái)表示元素
# send_keys 在輸入框中鍵入指定的內(nèi)容,即輸入 2023-5
driver.find_element(By.ID, 'searchInput').send_keys('2023-5')
time.sleep(2)
# 點(diǎn)擊搜索按鈕 先找父級(jí),在從父級(jí)找子元素
btnParent = driver.find_element(By.CLASS_NAME, 'input-group-btn')
btnParent.find_element(By.CLASS_NAME, 'btn-default').click()
time.sleep(2)
?
??????? 點(diǎn)擊搜索后,會(huì)新創(chuàng)建一個(gè)標(biāo)簽頁(yè),此時(shí)需要更新 driver 到新的標(biāo)簽頁(yè)面。
# 及時(shí)切換窗口
windows = driver.window_handles
driver.switch_to.window(windows[-1])
?
??????? 點(diǎn)擊第一個(gè)結(jié)果:
# 點(diǎn)擊第一個(gè)結(jié)果
items = driver.find_elements(By.CLASS_NAME, 'con-item')
items[0].find_element(By.CLASS_NAME, 'black').click()
?
????????點(diǎn)擊后,同樣會(huì)新開(kāi)一個(gè)標(biāo)簽頁(yè),此時(shí)我們把當(dāng)前這個(gè)搜索結(jié)果的標(biāo)簽頁(yè)關(guān)閉,然后跳轉(zhuǎn)到新的標(biāo)簽頁(yè)中:
# 關(guān)閉當(dāng)前標(biāo)簽頁(yè)并切換到新的窗口
driver.close()
windows = driver.window_handles
driver.switch_to.window(windows[-1])
time.sleep(2)
?
??????? 如果要返回歷史開(kāi)獎(jiǎng)結(jié)果頁(yè)面:
# 返回開(kāi)獎(jiǎng)歷史記錄
driver.switch_to.window(windows[-2])
?
??????? 如果想給開(kāi)獎(jiǎng)結(jié)果截一個(gè)圖(元素截圖):
# 指定元素截圖(只截圖當(dāng)前瀏覽器窗口可見(jiàn)部分)
main = driver.find_element(By.CLASS_NAME, 'main')
main.screenshot('./caipiao_1.png') # 命名并保存
?
??????? 然后可以在當(dāng)前的目錄下查看 caipiao.png 圖片:
完整程序代碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化驅(qū)動(dòng)器
driver = webdriver.Chrome()
# 如果沒(méi)有將driver.exe放到環(huán)境變量或python.exe同級(jí)目錄下,則要參數(shù)中指定
# driver = webdriver.Chrome('F:/chromedriver.exe')
# 訪問(wèn)指定網(wǎng)站
driver.get('http://www.cwl.gov.cn/fcpz/yxjs/ssq/')
driver.maximize_window() # 最大化窗口
time.sleep(3)
# 點(diǎn)擊陽(yáng)光開(kāi)獎(jiǎng) 使用Xpath來(lái)搜索
driver.find_element(by=By.XPATH, value="http://div[@data-alias='ygkj']").click()
time.sleep(3)
# 獲取當(dāng)前打開(kāi)了幾個(gè)窗口
windows = driver.window_handles
# 會(huì)打開(kāi)新的標(biāo)簽頁(yè),因此需要切換到最新打開(kāi)的窗口,保證后面能正常獲取元素
driver.switch_to.window(windows[-1])
# 點(diǎn)擊往期開(kāi)獎(jiǎng)公告 使用鏈接的文本內(nèi)容來(lái)進(jìn)行搜索
driver.find_element(by=By.PARTIAL_LINK_TEXT, value="往期開(kāi)獎(jiǎng)公告").click()
time.sleep(3)
# 滾動(dòng)到最底部
target = driver.find_element(by=By.CLASS_NAME, value='footer-logo')
# 對(duì)于指定的元素執(zhí)行腳本 這里的arguments[0]是第二個(gè)參數(shù)target
driver.execute_script('arguments[0].scrollIntoView({behavior:"smooth"})', target)
time.sleep(2)
# 下一頁(yè) 先試用id來(lái)找到祖父節(jié)點(diǎn),順著該節(jié)點(diǎn)再繼續(xù)往下找
paging = driver.find_element(by=By.ID, value='paging')
paging.find_element(by=By.CLASS_NAME, value='layui-laypage-next').click()
time.sleep(2)
# 在右上角的輸入框中輸入內(nèi)容
driver.find_element(By.ID, 'searchInput').send_keys('2023-5')
time.sleep(2)
# 點(diǎn)擊搜索按鈕
btnParent = driver.find_element(By.CLASS_NAME, 'input-group-btn')
btnParent.find_element(By.CLASS_NAME, 'btn-default').click()
time.sleep(2)
# 及時(shí)切換窗口
windows = driver.window_handles
driver.switch_to.window(windows[-1])
# 點(diǎn)擊第一個(gè)結(jié)果
items = driver.find_elements(By.CLASS_NAME, 'con-item')
items[0].find_element(By.CLASS_NAME, 'black').click()
# 關(guān)閉當(dāng)前標(biāo)簽頁(yè)并切換到新的窗口
driver.close()
windows = driver.window_handles
driver.switch_to.window(windows[-1])
time.sleep(2)
# 返回開(kāi)獎(jiǎng)歷史記錄
driver.switch_to.window(windows[-2])
# 指定元素截圖(只截圖當(dāng)前瀏覽器窗口可見(jiàn)部分)
main = driver.find_element(By.CLASS_NAME, 'main')
main.screenshot('./caipiao_1.png')
input('') # 保持程序運(yùn)行狀態(tài),瀏覽器不會(huì)被關(guān)閉
????????獲取前三頁(yè)的彩票中獎(jiǎng)號(hào)碼,并寫(xiě)入到 Excel 中:
'''
需要安裝 xlwings 來(lái)操作 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)
# 保存結(jié)果
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)
# 遞歸調(diào)用
if current_page < total_pages:
# 下一頁(yè)
driver.find_element(By.CLASS_NAME, 'layui-laypage-next').click()
get_data(total_pages, current_page + 1)
else:
driver.quit() # 停止驅(qū)動(dòng)器,關(guān)閉網(wǎng)頁(yè)
# 創(chuàng)建一個(gè)不顯示、不添加新的工作簿的 Excel 應(yīng)用程序?qū)ο? app = xw.App(visible=False, add_book=False)
# 創(chuàng)建了一個(gè)新的工作簿對(duì)象,并將其賦值給 wb 變量。
wb = app.books.add()
# 獲取第一張表格
sheet_1 = wb.sheets['sheet1']
sheet_1["A1"].value = "時(shí)間" # 設(shè)置A1單元格的內(nèi)容
for i in range(1, 7): # 設(shè)置 B1 ~ H1的內(nèi)容
sheet_1[f"{chr(ord('A') + i)}1"].value = f"紅{i}"
sheet_1[f"{chr(ord('A') + 7)}1"].value = "藍(lán)"
for i in range(len(days)): # 填寫(xiě)內(nèi)容
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() # 關(guān)閉該工作簿對(duì)象
app.quit() # 關(guān)閉應(yīng)用程序
print('successful.')
if __name__ == '__main__':
get_data(total_pages=3, current_page=1)
?參考:
[1] Selenium Python 教程 - 知乎
[2] Python操作Excel的Xlwings教程(一) - 知乎
[3]?xlwings,讓excel飛起來(lái)!
[4]?Python 自動(dòng)化操作 Excel 看這一篇就夠了 - 知乎文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-697686.html
[5] 定位策略 | Selenium文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-697686.html
到了這里,關(guān)于python 學(xué)習(xí)筆記(4)—— webdriver 自動(dòng)化操作瀏覽器(基礎(chǔ)操作)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!