Python selenium如何打包靜態(tài)網(wǎng)頁(yè)并下載
需求:?jiǎn)渭兊膶age.source寫入文件的方式,會(huì)導(dǎo)致一些圖片無(wú)法顯示,對(duì)于google瀏覽器,直接將頁(yè)面打包下載成一個(gè)mhtml格式的文件,則可以進(jìn)行離線下載。對(duì)應(yīng)python selenium 微信公眾號(hào)歷史文章隨手一點(diǎn)就返回首頁(yè)?郁悶之下只好將他們都下載下來(lái)。:http://chabaoo.cn/article/193111.htm
遇到的問(wèn)題:
1、單純使用webdriver.ActionChains無(wú)法完成下載動(dòng)作,未能操作windows窗口。
2、沒(méi)有找到相關(guān)能直接下載.mhtml的命名接口。
3、pywin32置頂窗口的使用不順利。
解決思路:
1、使用selnium打開瀏覽器,不要操作,讓其保持置頂
2、使用pyautogui、pyperclip操作鍵盤、鼠標(biāo)、剪切板進(jìn)行下載文件。
準(zhǔn)備材料:
需要將自動(dòng)化操作的一些圖片截取下來(lái),以作為后期圖片匹配使用。

實(shí)現(xiàn):
1、打開爬取好的鏈接,遍歷所有需要下載的頁(yè)面
# 讀取文件
filename = r'data/01 爬取微信公眾號(hào)歷史文章/urls 二律背反的一燈如豆-out.xlsx'
df = pd.read_excel(filename,dtype=object)
df = df.reindex(columns=['日期', '標(biāo)題', '原創(chuàng)', '地址','完成情況','儲(chǔ)存地址'])
#df = df.head(5)
dfsel = (df['標(biāo)題'] !='隨文') & (df['完成情況'] != 1)
save_folder = r"I:\code\python\data\01 爬取微信公眾號(hào)歷史文章\01 二律背反的一燈如豆" + "\\"
# 設(shè)置保存格式為 mhtml,減少要操作文件保存下拉框的情況
options = webdriver.ChromeOptions()
options.add_argument('--save-page-as-mhtml')
# 啟動(dòng)瀏覽器
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver,10)
df.loc[dfsel,"完成情況"],df.loc[dfsel,"儲(chǔ)存地址"] = zip(*df[dfsel].apply(download_mhtml_with_not_check, axis=1,args=(driver,wait)))
2、編寫相關(guān)下載頁(yè)面函數(shù)
# 在timeout秒內(nèi),返回中心值,間隔時(shí)長(zhǎng)time_setp # 封裝一個(gè)pyautogui限時(shí)查找函數(shù) # def finde_gui_element(png,timeout = 5,time_setp=0.2): i = 1 if timeout <=0 : timeout = 5 if time_setp <=0 : time_setp = 0.2 while True: if i > timeout/time_setp: return None center = pyautogui.locateCenterOnScreen(png,grayscale=False,confidence=0.9) if center == None: time.sleep(0.2) else: return center i = i + 1
主要自動(dòng)化操作代碼:
def download_mhtml_with_not_check(x,driver,wait):
name = ''
try:
url = str(x['地址'])
driver.get(url)
# 獲取瀏覽器標(biāo)題,用于檢測(cè)是否是置頂頁(yè)
wait.until(EC.presence_of_element_located((By.XPATH,'//h2[@id="activity-name"]')))
title = driver.find_element_by_xpath('//h2[@id="activity-name"]').text
print('no:',x.name,'url:',url,'title:',title)
wait.until(EC.presence_of_element_located((By.XPATH,'//div[@id="page-content"]')))
#進(jìn)入下載
pyautogui.hotkey('ctrl', 's')
# 等待一下對(duì)話框彈出
time.sleep(1)
bt = finde_gui_element(r'data\png\save.png') #查找保存按鍵
if bt == None:
return (0,'')
else:
# 根據(jù)標(biāo)題組合成具體路徑
name = save_folder + ' ' + title + '.mhtml'
#print(name)
pyperclip.copy(name)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.1)
pyautogui.hotkey('Enter')
# 檢查是否彈出另存為
bt = finde_gui_element(r'data\png\confirmsaveas.png',timeout=0.5)
if bt != None:
# 說(shuō)明出現(xiàn)重復(fù)明明,點(diǎn)擊覆蓋
pyautogui.hotkey('Tab')
pyautogui.hotkey('Enter')
return (1,name)
bt = finde_gui_element(r'data\png\cancle.png',timeout=0.5)
if bt != None:
#還愛(ài),說(shuō)明出現(xiàn)了一些異常
pyautogui.hotkey('esc')
pyautogui.hotkey('esc')
pyautogui.leftClick(bt)
return (-1,name)
# 加多一個(gè)esc防止出現(xiàn)窗口還在
pyautogui.hotkey('esc')
except Exception as e:
print(str(e))
return (-2,name)
return (1,name)
最后寫入excel:

通過(guò)vba代碼,將單元格地址添加上超鏈接:
Option Explicit
Sub add_hype()
Dim ws As Worksheet, arr As Variant, i As Long
Set ws = ThisWorkbook.Worksheets(1)
arr = ws.UsedRange.Value
ws.Cells.Hyperlinks.Delete
For i = 2 To UBound(arr)
If CStr(arr(i, 2)) = "隨文" Then
Else
If CStr(arr(i, 5)) = "1" Then
ws.Hyperlinks.Add Anchor:=ws.Cells(i, 6), Address:=CStr(arr(i, 6))
End If
End If
Next i
End Sub
完成。
不足之處:
1、通過(guò)autogui操作,難免會(huì)遇到彈窗的情況,需要增加活動(dòng)窗體置頂,但是一直沒(méi)有找到有效的方法。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python散列表(Hash Table)的實(shí)現(xiàn)示例
散列表是一種常用于實(shí)現(xiàn)關(guān)聯(lián)數(shù)組或映射的數(shù)據(jù)結(jié)構(gòu),本文我們將深入講解Python中的散列表,包括散列函數(shù)、沖突解決方法、散列表的實(shí)現(xiàn)和應(yīng)用場(chǎng)景,感興趣的可以了解一下2024-01-01
Python報(bào)錯(cuò)ImportError:?IProgress?not?found.?Please?update
在使用Jupyter Notebook或JupyterLab進(jìn)行交互式編程時(shí),我們可能會(huì)遇到各種導(dǎo)入錯(cuò)誤,本文就來(lái)介紹一下Python報(bào)錯(cuò)ImportError:?IProgress?not?found.?Please?update?jupyter?and?ipywidgets解決,感興趣的可以了解一下2024-06-06
Python序列的推導(dǎo)式實(shí)現(xiàn)代碼
推導(dǎo)式是可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列(的一種結(jié)構(gòu)體),是python的一種獨(dú)有特性,在python中共有三種推導(dǎo),列表推導(dǎo)式和字典推導(dǎo)式,集合推導(dǎo)式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-07-07
Python導(dǎo)入其他文件夾中函數(shù)的實(shí)現(xiàn)方法
本文主要介紹了Python導(dǎo)入其他文件夾中函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程
APScheduler的全稱是Advanced?Python?Scheduler,它是一個(gè)輕量級(jí)的?Python定時(shí)任務(wù)調(diào)度框架,下面這篇文章主要給大家介紹了關(guān)于python定時(shí)任務(wù)apscheduler的詳細(xì)使用教程,需要的朋友可以參考下2022-02-02
只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片
第一次寫文章,技術(shù)不成熟之處望各位大神輕噴,今天教大家只用50行Python代碼爬取網(wǎng)絡(luò)美女圖片是怎么操作的,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助哦,需要的朋友可以參考下2021-06-06
Python用K-means聚類算法進(jìn)行客戶分群的實(shí)現(xiàn)
這篇文章主要介紹了Python用K-means聚類算法進(jìn)行客戶分群的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
tensorflow+k-means聚類簡(jiǎn)單實(shí)現(xiàn)貓狗圖像分類的方法
這篇文章主要介紹了tensorflow+k-means聚類簡(jiǎn)單實(shí)現(xiàn)貓狗圖像分類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Python通過(guò)屬性手段實(shí)現(xiàn)只允許調(diào)用一次的示例講解
下面小編就為大家分享一篇Python通過(guò)屬性手段實(shí)現(xiàn)只允許調(diào)用一次的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

