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实现的径向基(RBF)神经网络示例
Feb 06 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
Python 打印中文字符的三种方法
Aug 14 Python
python读取各种文件数据方法解析
Dec 29 Python
python生成随机红包的实例写法
Sep 02 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
一文读懂Python 枚举
Aug 25 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 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全排列递归算法代码
2012/10/09 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
php文件上传的两种实现方法
2016/04/04 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python 爬取疫情数据的源码
2020/02/09 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
出国留学担保书
2014/05/20 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
结婚老公保证书
2015/02/26 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
TS 类型收窄教程示例详解
2022/09/23 Javascript