专栏首页源懒由码python selenium 关于将网页打包为静态网页(mhtml)下载。

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:\code\python\data\01 爬取微信公众号历史文章\01 二律背反的一灯如豆" + "\\"
# 设置保存格式为 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'data\png\save.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'data\png\confirmsaveas.png',timeout=0.5)
            if bt != None:
                # 说明出现重复明明,点击覆盖
                pyautogui.hotkey('Tab')
                pyautogui.hotkey('Enter')
                return (1,name)
            bt = finde_gui_element(r'data\png\cancle.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操作,难免会遇到弹窗的情况,需要增加活动窗体置顶,但是一直没有找到有效的方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pandas系列 - (二)关于两期时点数据的比较

    统计数据来说,有时点数据和时期数据。通常情况下,会进行两期数据的比较,现整理一个两期数据比较的场景应用。主要流程分为:

    forxtz
  • 关于pandas.eval使用的一些问题。

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.eval...

    forxtz
  • pandas系列 - (一)明细数据汇总简单场景应用

    官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html

    forxtz
  • Mybatis入门

    发现一个非常好的Mybatis详细教程,地址:https://www.w3cschool.cn/mybatis/

    SuperHeroes
  • 中国天文学家研究出新方法,首次实现对类星体几何距离的测量

    据了解,这一测量方法是由中国科学院高能物理研究所王建民研究员领导的团队发展的,这是一种全新的几何测距方法,通过模拟综合分析GRAVITY干涉数据,以及丽江2.4...

    镁客网
  • alloc_page分配内存空间--Linux内存管理(十七)

    在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法.

    233333
  • Java基础-08(02)总结帮助文档,代码块,继承

    (9)两个面试题: A:Override和Overload的区别?Overload是否可以改变返回值类型? B:this和super的区别和各自的作用? ...

    Java帮帮
  • CentOS 7.2 三行命令安装图像化界面

    安装图像插件 yum groupinstall "GNOME Desktop" "Graphical Administration Tools" -y

    蒋小爱
  • 微信开发系列之五 - 将SAP UI5应用嵌入到微信中

    If you have your UI5 application already running smoothly on some cloud platform...

    Jerry Wang
  • Go 语言并发编程系列(十)—— sync 包系列:互斥锁和读写锁

    我们前面反复强调,在 Go 语言并发编程中,倡导「使用通信共享内存,不要使用共享内存通信」,而这个通信的媒介就是我们前面花大量篇幅介绍的通道(Channel),...

    学院君

扫码关注云+社区

领取腾讯云代金券