Python selenium如何打包静态网页并下载


Posted in Python onAugust 12, 2020

需求:单纯的将page.source写入文件的方式,会导致一些图片无法显示,对于google浏览器,直接将页面打包下载成一个mhtml格式的文件,则可以进行离线下载。对应python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。:https://3water.com/article/193111.htm

遇到的问题:

1、单纯使用webdriver.ActionChains无法完成下载动作,未能操作windows窗口。

2、没有找到相关能直接下载.mhtml的命名接口。

3、pywin32置顶窗口的使用不顺利。

解决思路:

1、使用selnium打开浏览器,不要操作,让其保持置顶

2、使用pyautogui、pyperclip操作键盘、鼠标、剪切板进行下载文件。

准备材料:

需要将自动化操作的一些图片截取下来,以作为后期图片匹配使用。

Python selenium如何打包静态网页并下载

实现:

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:

Python selenium如何打包静态网页并下载

通过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操作,难免会遇到弹窗的情况,需要增加活动窗体置顶,但是一直没有找到有效的方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python实现换行符转换的脚本的教程
Apr 16 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
在python中实现强制关闭线程的示例
Jan 22 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
详解【python】str与json类型转换
Apr 29 Python
python的pstuil模块使用方法总结
Jul 26 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 #Python
PyQt5 QDockWidget控件应用详解
Aug 12 #Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 #Python
基于python requests selenium爬取excel vba过程解析
Aug 12 #Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 #Python
Python自动发送和收取邮件的方法
Aug 12 #Python
Selenium webdriver添加cookie实现过程详解
Aug 12 #Python
You might like
php简单统计字符串单词数量的方法
2015/06/19 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
node.js超时timeout详解
2014/11/26 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
python+django快速实现文件上传
2016/10/24 Python
Python实现多线程的两种方式分析
2018/08/29 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
银行求职推荐信范文
2013/11/30 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
员工生日会策划方案
2014/06/14 职场文书
幼师自荐信范文
2015/03/06 职场文书