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框架中的缓存控制
Jul 24 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Python格式化输出%s和%d
May 07 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
python 实现视频流下载保存MP4的方法
Jan 09 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
Python tkinter常用操作代码实例
Jan 03 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 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
杏林同学录(八)
2006/10/09 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
菜单效果
2006/10/14 Javascript
javascript之ESC(第二类混淆)
2007/05/06 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
讲解python参数和作用域的使用
2013/11/01 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
python开发入门——列表生成式
2020/09/03 Python
浅析Python 责任链设计模式
2020/09/11 Python
行政管理专业推荐信
2013/11/02 职场文书
大学军训感言600字
2014/02/25 职场文书
宾馆客房管理制度
2015/08/06 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android