前言
自动化完成目标网页的保存,文件名为标题名,网页可离线打开,并保证不缺损信息。 # 实现方案 使用善于爬网页的python实现 方式1:urllib保存html urllib是一个包含request、error、parse、robotparser四个模块,关乎网络资源请求的包 调用urllib完成版本1 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import urllib.request
def getHtml(url):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request).read()
return response
def saveHtml(file_name, file_content):
with open(file_name.replace('/', '_') + ".html", "wb") as f:
f.write(file_content)
base_url = 'http://www.weain.mil.cn/cggg/zbgg/'
base_path = 'E:\\jkl\\'
for p in range(615675, 615682):
try:
result = getHtml(base_url + str(p) + '.html')
print(base_url + str(p) + '.html')
path = base_path + str(p)
# print(path)
saveHtml(path, result)
p = p+1
except:
continue
print("done")
问题 1.1 反爬 该网站虽然简单,web服务应该还是添加了基本的反爬措施 解决:需要在request时添加浏览器headers,将程序行为掩饰为浏览器行为
1.2 html信息不全 抓下来html文件信息不全,图片损失,网页框架混乱 该方式只适合快速抓取关键字的场景
方式2:Chilkat保存MHTML(mht) MHTML = MIME Encapsulation of Aggregate HTML Documents 将一个多附件网页(图片、flash、Java小程序)存储为单一文档,可用于发送html电子邮件
Chilkat是一个功能强大的有直接提供保存mht格式文件接口的包 调用Chilkat完成版本2 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55# !/usr/bin/python
# -*-coding:utf-8-*-
import sys
import chilkat
import urllib.request
from bs4 import BeautifulSoup
def get_title(url):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
html = urllib.request.urlopen(request).read()
soup = BeautifulSoup(html, 'lxml')
print(soup.find('h1').get_text())
return soup.find('h1').get_text()
mht = chilkat.CkMht()
success = mht.UnlockComponent("Anything for 30-day trial")
if (success != True):
print(mht.lastErrorText())
sys.exit()
base_url = "http://www.weain.mil.cn/cggg/zbgg/"
base_path = "C:\\Users\\x.x-pc\\Desktop\\html_grep\\save\\"
if __name__ == '__main__':
'''
print("Please Input Web Page Index: ")
start = input("please input web page index: ")
print("start >> " + start)
print("end >> " + end)
print(start + " " + end);
sys.exit()
'''
for p in range(615675, 615676):
# try:
target_url = base_url + str(p) + '.html'
save_path = base_path + get_title(target_url) + '.mht'
print(target_url)
print(save_path)
success = mht.GetAndSaveMHT(target_url, save_path)
if (success != True):
print(mht.lastErrorText())
sys.exit()
p = p + 1
# except:
# print("Exception");
# continue
print("done")
问题: 2.1 该方式可以较好的解决问题1.2,但是依然有部分图片信息缺损 与chrome浏览器直接右键保存为mht格式文件信息差距较大
2.2 该网页采用的是动态加载的方式,发布的采购公告信息使用Javascript加载 Chilkat只能抓取到当前页面,无法抓到动态页面 接下来就是想办法抓到动态页面,然后拼接到静态页面 emmm ……
方式3:Selenium Selenium是一个用于Web应用程序测试工具 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。 同时python支持对应的selenium包 selenium直接与chromedriver进行交互,调用chromedriver原生api实现浏览器的操作 可以利用浏览器保存完整的mht文件
问题: 保存网页时默认获取的是html的title字段,导致每个网页该字段都一样 真正的标题则在h1字段,需要修改windows保存窗口的命名栏 而操作windows窗口则超过了selenium的能力范畴
为了解决该问题,先后搜查了如下方式: AutoHotKey、AutoIt 其中AutoHotKey是一款免费的、Windows平台下开放源代码的热键脚本语言 可以通过脚本调用键鼠、系统接口及程序,并创建基于简单语言的图形化界面的执行程序
该工具非常强大,可以自动化完成高重复性操作,可适用于自动化测试、生产中
AutoHotKey可将该语言脚本例化成exe,供python调用 AutoIt则有对应的pyautoit包,最终实现也是调用AutoItX3.dll
pyautogui包可以操作键鼠,不需要调用其他动态库,且使用相对简单,为该问题最后选取的方案 为了提高人机交互,使用tkinter实现了简单的对话框界面。
1 | # -*- coding: utf-8 -*- |