用到的工具有chromedriver,pywin32和selenium。chromedriver安装配置过程自行百度,需要注意的是chromedriver和chrome的版本号需要一一对应,否则会出现不必要的报错。
1、以新浪的一条新闻网址为例
代码语言:javascript复制news_url = "http://news.youth.cn/sz/201812/t20181218_11817816.htm"
driver.get(news_url)
2、需要明确的是,我们现在要保存的是一个完整的网页,不是单独的html文档,还要包括JavaScript和CSS等内容,换句话说,也就是离线网页,断网之后还可以正常打开。经过多次采坑之后发现chrome可以直接保存为一个单独的mhtml文档,但是chrome是默认关闭状态,这时候我们就需要在webdriver中打开这个设置。
代码语言:javascript复制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的键盘模拟控制可以实现。
代码语言:javascript复制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格式
- mozilla-archive-format安装地址
优点:单文件,体积小(大概是mhtml的六分之一)。 缺点:只有firefox 才能打开。
ScrapBook 插件 方案
- firefox中 下载 ScrapBook 插件
- 在网空白处点击右键,“获取页面”
- scrapbook安装地址
优点:便于管理,兼容性好(直接就是html文件),支持分类保存,支持查找
参考:https://www.jianshu.com/p/29a0adc044d5 https://blog.csdn.net/feng______/article/details/52790204