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)。:https://www.jb51.net/article/193111.htm
遇到的問(wèn)題:
1、單純使用webdriver.ActionChains無(wú)法完成下載動(dòng)作,未能操作windows窗口。
2、沒(méi)有找到相關(guān)能直接下載.mhtml的命名接口。
3、pywin32置頂窗口的使用不順利。
解決思路:
1、使用selnium打開(kāi)瀏覽器,不要操作,讓其保持置頂
2、使用pyautogui、pyperclip操作鍵盤、鼠標(biāo)、剪切板進(jìn)行下載文件。
準(zhǔn)備材料:
需要將自動(dòng)化操作的一些圖片截取下來(lái),以作為后期圖片匹配使用。
實(shí)現(xiàn):
1、打開(kāi)爬取好的鏈接,遍歷所有需要下載的頁(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:codepythondata01 爬取微信公眾號(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’datapngsave.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’datapngconfirmsaveas.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’datapngcancle.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 ExplicitSub 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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 前端從瀏覽器的渲染到性能優(yōu)化2. 無(wú)線標(biāo)記語(yǔ)言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁(yè)3. 讀大數(shù)據(jù)量的XML文件的讀取問(wèn)題4. ASP基礎(chǔ)入門第三篇(ASP腳本基礎(chǔ))5. 解析原生JS getComputedStyle6. PHP循環(huán)與分支知識(shí)點(diǎn)梳理7. css代碼優(yōu)化的12個(gè)技巧8. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)9. 利用CSS3新特性創(chuàng)建透明邊框三角10. ASP實(shí)現(xiàn)加法驗(yàn)證碼
