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解析中国天气网的天气数据
Mar 21 Python
python中使用mysql数据库详细介绍
Mar 27 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
利用python实现AR教程
Nov 20 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
浅谈anaconda python 版本对应关系
Oct 07 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 PDOStatement::errorInfo讲解
2019/01/31 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python实现斐波那契递归函数的方法
2014/09/08 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
python如何处理程序无法打开
2020/06/16 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
python openCV自制绘画板
2020/10/27 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
pytorch中index_select()的用法详解
2021/01/06 Python
北大自主招生自荐信
2013/10/19 职场文书
工厂仓管员岗位职责
2014/01/01 职场文书
销售总监岗位职责
2014/01/04 职场文书
2014年党小组工作总结
2014/12/20 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
辞职离别感言
2015/08/04 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS