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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
python实现简单socket通信的方法
Apr 19 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
python生成任意频率正弦波方式
Feb 25 Python
Python中time标准库的使用教程
Apr 13 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+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python单链表简单实现代码
2016/04/27 Python
python数据封装json格式数据
2018/03/04 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
降低python版本的操作方法
2020/09/11 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
python实现代码审查自动回复消息
2021/02/01 Python
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
董事长秘书岗位职责
2013/11/29 职场文书
科研课题实施方案
2014/03/18 职场文书
保护环境倡议书300字
2014/05/19 职场文书
图书室标语
2014/06/21 职场文书
小学生校园广播稿
2014/09/28 职场文书
老兵退伍标语
2014/10/07 职场文书
个人职业及收入证明
2014/10/13 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
Python实现仓库管理系统
2022/05/30 Python