python selenium 关于将网页打包为静态网页(mhtml)下载。
时间:2022-07-26
本文章向大家介绍python selenium 关于将网页打包为静态网页(mhtml)下载。,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
需求:单纯的将page.source写入文件的方式,会导致一些图片无法显示,对于google浏览器,直接将页面打包下载成一个mhtml格式的文件,则可以进行离线下载。对应python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。:https://www.cnblogs.com/cycxtz/p/13416245.html 后续
遇到的问题:
1、单纯使用webdriver.ActionChains无法完成下载动作,未能操作windows窗口。
2、没有找到相关能直接下载.mhtml的命名接口。
3、pywin32置顶窗口的使用不顺利。
解决思路:
1、使用selnium打开浏览器,不要操作,让其保持置顶
2、使用pyautogui、pyperclip操作键盘、鼠标、剪切板进行下载文件。
准备材料:
需要将自动化操作的一些图片截取下来,以作为后期图片匹配使用。
实现:
1、打开爬取好的链接,遍历所有需要下载的页面
# 读取文件
filename = r'data/01 爬取微信公众号历史文章/urls 二律背反的一灯如豆-out.xlsx'
df = pd.read_excel(filename,dtype=object)
df = df.reindex(columns=['日期', '标题', '原创', '地址','完成情况','储存地址'])
#df = df.head(5)
dfsel = (df['标题'] !='随文') & (df['完成情况'] != 1)
save_folder = r"I:codepythondata 1 爬取微信公众号历史文章 1 二律背反的一灯如豆" + "\"
# 设置保存格式为 mhtml,减少要操作文件保存下拉框的情况
options = webdriver.ChromeOptions()
options.add_argument('--save-page-as-mhtml')
# 启动浏览器
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver,10)
df.loc[dfsel,"完成情况"],df.loc[dfsel,"储存地址"] = zip(*df[dfsel].apply(download_mhtml_with_not_check, axis=1,args=(driver,wait)))
2、编写相关下载页面函数
# 在timeout秒内,返回中心值,间隔时长time_setp
# 封装一个pyautogui限时查找函数
#
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
主要自动化操作代码:
def download_mhtml_with_not_check(x,driver,wait):
name = ''
try:
url = str(x['地址'])
driver.get(url)
# 获取浏览器标题,用于检测是否是置顶页
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"]')))
#进入下载
pyautogui.hotkey('ctrl', 's')
# 等待一下对话框弹出
time.sleep(1)
bt = finde_gui_element(r'datapngsave.png') #查找保存按键
if bt == None:
return (0,'')
else:
# 根据标题组合成具体路径
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:
# 说明出现重复明明,点击覆盖
pyautogui.hotkey('Tab')
pyautogui.hotkey('Enter')
return (1,name)
bt = finde_gui_element(r'datapngcancle.png',timeout=0.5)
if bt != None:
#还爱,说明出现了一些异常
pyautogui.hotkey('esc')
pyautogui.hotkey('esc')
pyautogui.leftClick(bt)
return (-1,name)
# 加多一个esc防止出现窗口还在
pyautogui.hotkey('esc')
except Exception as e:
print(str(e))
return (-2,name)
return (1,name)
最后写入excel:
通过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、通过autogui操作,难免会遇到弹窗的情况,需要增加活动窗体置顶,但是一直没有找到有效的方法。
- Win平台Web访问白名单设置脚本(IP安全性原则)
- NYOJ-------表达式求值
- HDUOJ----1181 变形课
- 正确的Win主机网站伪静态设置方法
- HDUOJ----(1084)What Is Your Grade?
- HDUOJ------(1272)小希的迷宫
- HDUOJ ---1269迷宫城堡
- HDUOJ---1213How Many Tables
- hduoj----(1033)Edge
- HDUOJ----(1031)Design T-Shirt
- HDUOJ----(1030)Delta-wave
- 身份切换脚本,免登入切换权限的利器
- HDUOJ---What Are You Talking About
- HDUOJ-----(1251)统计难题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ggplot2 核密度图和直方图
- 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器
- ggplot_QQ图和ECDF
- tidyverse evaluation
- 下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
- Tidyverse补充
- 抖音关键词热度搜索小程序(附源码)
- python自定义函数基础
- Python-科学计算-pandas-13-列名/删除列/替换nan
- python小程序,45行代码实现可切换版代码雨(附源码)
- R海拾遗-stringr
- stringr2
- Kubernetes 无状态应用的一般特征
- 一段简单的代码,能让所有GIF图实现时光倒流
- 你喜欢的女主播颜值多少分,今天带你测试虎牙直播女主播的颜值