[492]selenium保存静态网页

用到的工具有chromedriver,pywin32和selenium。chromedriver安装配置过程自行百度,需要注意的是chromedriver和chrome的版本号需要一一对应,否则会出现不必要的报错。

1、以新浪的一条新闻网址为例

news_url = "http://news.youth.cn/sz/201812/t20181218_11817816.htm"
driver.get(news_url)

2、需要明确的是,我们现在要保存的是一个完整的网页,不是单独的html文档,还要包括JavaScript和CSS等内容,换句话说,也就是离线网页,断网之后还可以正常打开。经过多次采坑之后发现chrome可以直接保存为一个单独的mhtml文档,但是chrome是默认关闭状态,这时候我们就需要在webdriver中打开这个设置

options = webdriver.ChromeOptions()
options.add_argument('--save-page-as-mhtml')
driver = webdriver.Chrome(chrome_options=options)

3、接下来就要开始保存网页了,通常保存一个网页我们需要进行Ctrl+A,Ctrl+S,然后Enter三步操作,这些操作我们可以通过Actionchains来做,踩坑现场发现这个selenium的键盘操作是直接发送到webdriver的界面,而不是控制弹出浮动窗口(右键窗口)。多次尝试之后,发现pywin32的键盘模拟控制可以实现。

win32api.keybd_event(17, 0, 0, 0)           # 按下ctrl
win32api.keybd_event(65, 0, 0, 0)           # 按下a
win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放a
win32api.keybd_event(83, 0, 0, 0)           # 按下s
win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放s
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放ctrl
time.sleep(2)
win32api.keybd_event(13, 0, 0, 0)           # 按下enter
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放enter
  • code
# -*- coding: utf-8 -*-
from selenium import webdriver
import time,win32con,win32api
from ctypes import *
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from pykeyboard import PyKeyboard
from pymouse import *


# 测试网址
# news_url = "http://news.youth.cn/sz/201812/t20181218_11817816.htm"
news_url = 'https://blog.csdn.net/xc_zhou/article/details/82224908'

options = webdriver.ChromeOptions()
prefs = {
    "download.prompt_for_download": False,
    'download.default_directory': 'C:/Users/Administrator/Desktop/1/',#下载目录
    "plugins.always_open_pdf_externally": True,
    'profile.default_content_settings.popups': 0,#设置为0,禁止弹出窗口
    # 'profile.default_content_setting_values.images': 2,#禁止图片加载
}
options.add_experimental_option('prefs', prefs)

#chrome可以直接保存为一个单独的mhtml文档,但是chrome是默认关闭状态
# 打开另存为mhtml功能
options.add_argument('--save-page-as-mhtml')

executable_path = "../source/chromedriver_win2.43/chromedriver.exe"
driver = webdriver.Chrome(executable_path=executable_path, chrome_options=options)
driver.get(news_url)
#拉动下拉滚动条,下拉800,csdn网页阅读更多按钮要在当前屏幕显示,不然下边点击操作会报错
driver.execute_script("window.scroll(0, 800);")
time.sleep(1)
driver.find_element_by_xpath('//main//a[@id="btn-readmore"]').click()
#--------------------------方法1-------------------------------------
##有些网站需要点击一下页面,才能进行保存,比如csdn
# #鼠标移动到某一位置,左键点击一下
# windll.user32.SetCursorPos(100, 100)#坐标值
# time.sleep(0.05)
# win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
# win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
# # # 模拟键盘操作
# win32api.keybd_event(17, 0, 0, 0)           # 按下ctrl
# win32api.keybd_event(65, 0, 0, 0)           # 按下a
# win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放a
# win32api.keybd_event(83, 0, 0, 0)           # 按下s
# win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放s
# win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放ctrl
# #加上休眠时间等待弹框的出现
# time.sleep(2)
# win32api.keybd_event(13, 0, 0, 0)           # 按下enter
# win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放enter
# #如果文件已存在,会在弹出一个提示框,提示是否要替换,默认是否选项,
# #按下键盘小箭头左移,选择是,然后再次按下enter,
# time.sleep(2)#加上休眠时间等待弹框的出现
# win32api.keybd_event(37, 0, 0, 0)           # 按下小箭头左移
# win32api.keybd_event(37, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放小箭头左移
# time.sleep(0.5)
# win32api.keybd_event(13, 0, 0, 0)           # 按下enter
# win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)    # 释放enter

#--------------------------方法2-------------------------------------
#鼠标操作
m = PyMouse()
'''
m.click(x,y,button,n) –鼠标点击
x,y –是坐标位置
buttong -1表示左键,2表示点击右键
n –点击次数,默认是1次,2表示双击
'''
#有些网站需要点击一下页面,才能进行保存,比如csdn
m.click(100,100,1,1)
# #键盘操作
k = PyKeyboard()
k.press_key(k.control_key)#按下ctrl键
# k.press_key('a') #按下a键
# k.release_key('a')#释放a键
k.press_key('s')
k.release_key('s')
k.release_key(k.control_key)
#加上休眠时间等待弹框的出现
time.sleep(2)
k.press_key(k.enter_key)
k.release_key(k.enter_key)
#如果文件已存在,再次按下enter,默认是否选项,即不重复下载
time.sleep(2)
# k.tap_key(k.numpad_keys[5],3) #–点击小键盘5,3次
k.tap_key(k.left_key)# 点击小箭头左移
time.sleep(1)
k.press_key(k.enter_key)
k.release_key(k.enter_key)

# 预估下载时间,后期根据实际网速调整
time.sleep(5)
# 关闭webdriver
driver.close()

mhtml 格式 方案

chrome中

  • chrome://flags
  • 搜索mhtml
  • 变为启用
  • 然后 Ctrl+s

优点:单文件,兼容性好

maff 格式方案

  • firefox中 下载 Mozilla Archive Format 插件
  • Ctrl+s
  • 就可保存为 maff格式

优点:单文件,体积小(大概是mhtml的六分之一)。
缺点:只有firefox 才能打开。

ScrapBook 插件 方案

  • firefox中 下载 ScrapBook 插件
  • 在网空白处点击右键,“获取页面”

优点:便于管理,兼容性好(直接就是html文件),支持分类保存,支持查找

参考:https://www.jianshu.com/p/29a0adc044d5
https://blog.csdn.net/feng______/article/details/52790204

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值