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读取json文件并将数据插入到mongodb的方法
Mar 23 Python
在Python中操作时间之strptime()方法的使用
Dec 30 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
Jul 06 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
python实现最长公共子序列
May 22 Python
python 除法保留两位小数点的方法
Jul 16 Python
Python字符串逆序输出的实例讲解
Feb 16 Python
对Python _取log的几种方式小结
Jul 25 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
python 生成器和迭代器的原理解析
Oct 12 Python
Python中基础数据类型 set集合知识点总结
Aug 02 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中的boolean(布尔)类型详解
2013/10/28 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
浅谈js闭包理解
2019/03/28 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
浅谈Python中带_的变量或函数命名
2017/12/04 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
小学音乐教学反思
2014/02/05 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
运动会3000米加油稿
2015/07/21 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
MySql新手入门的基本操作汇总
2021/05/13 MySQL
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
最新最全的手机号验证正则表达式
2022/02/24 Javascript