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的Django框架使用的一些实用建议
Apr 03 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
java判断三位数的实例讲解
Jun 10 Python
python画图的函数用法以及技巧
Jun 28 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
javascript 常用功能总结
2012/03/18 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
js随机生成一个验证码
2017/06/01 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
vue组件之间的数据传递方法详解
2019/04/19 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
Python中协程用法代码详解
2018/02/10 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
本科生职业生涯规划书范文
2014/01/21 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
货款欠条范本
2015/07/03 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python