博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
由网页下载程序(完美下载图片、js、css、修改网页)解析三大网页难题
阅读量:7055 次
发布时间:2019-06-28

本文共 2997 字,大约阅读时间需要 9 分钟。

       百忙之中抽时间编写了这个小程序,功能是:完美保存整个网页,包括:图片、JS脚本、CSS样式,并且修改网页源码进行“本地化”。由于我火星了,竟然不知道浏览器自带这个功能,因此自己动手做了一个,虽然这个程序不大,但是涉及了三大难题(后文将会详细讲解)。

       本来不打算发布源码的,既然浏览器有这个功能,那我就发布一下源码以供大家学习!这个程序的效果和浏览器的效果是完全相同的!而且我对比了一下,获取的js、css、图片一个也不比浏览器获取的少。大家可以参照这个去发挥:做一个网站整站下载器。当然数据库你是绝对下不到的…..

使用说明:

1.填写网页地址然后点转到,这时会激活一键下载,加载网页需要时间,没加载完就点一键下载会有提示,尽量在网速比较好的时候使用!

2.下载完成后会在软件目录下生成一个以网页标题为名称的文件夹,所有必须文件都存放于此,其中以网页标题为名称的HTM文件就是保存的页面,在没有网络的情况下,双击查看的效果和在网络上看是一样的!。

程序截图:

解决的难题:

      1.判断网页加载完成。以前都是已知目的网页,可以用“标志法”判断,但是在这个程序里一切是未知的。所以必须用新方法,这里用了HTML对象的Onload事件,结合webbrowser控件完美实现判断网页加载完成,这是目前最安全、最准确、最可靠的方法!适用于一切环境。

      判断网页加载完成一直是个非常头疼的问题,至少在VB中是这样。网上所说的方法基本上是不行的,好一点的是有时候行、有时候不行。现在我就贴出一个代码,来终结这个问题

'引用“Microsoft HTML Object Library”Dim WithEvents page As HTMLWindow2   '注意要定义成全局的Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)    Set page = Me.WebBrowser1.document.parentWindowEnd SubPrivate Sub page_onload()    Debug.Print "加载完毕"End Sub

     2.获取网页js和css。曾经看到很多人在猪八戒网发帖求人做程序,要求获取网页里所有的js和css。其实这个并不难,百度一下我们可以发现javascript语言提供了这个接口。下面我就演示一下如何利用这个接口获取。

首先用webbrowser控件加载你要提取的网页。

获取js:

strBasicHTM = WebBrowser1.Document.documentElement.outerHTMLWebBrowser1.Navigate "javascript:str='
\n';c=document.scripts;for(i=0;i
';str+=o.src;str+='
\n';};str+='';document.write(str);"While strBasicHTM = WebBrowser1.Document.documentElement.outerHTML '相等说明任务没有执行完毕 DoEvents WendFor lngIndex = 0 To WebBrowser1.Document.links.length - 1 Debug.print WebBrowser1.Document.links.Item(lngIndex).innerText Next

结果图:

     通过上边这段代码webbrowser控件里显示的就是该网页中所有的js路径,这个路径就是网页源码中的路径,不做任何修改。也就是说:如果源码中写的是绝对路径,例如http:/www.xxx.com/x.js,那么返回的就是绝对路径http:/www.xxx.com/x.js;如果是相对路径,例如/js/x.js,那么返回的就是相对路径/js/x.js。

     最后用一个循环获取webbrowser控件中显示的js路径(其实就是获取超链接文本)

还有就是注意一下上边代码中的strBasicHTM变量,这个变量是为了获取webbrowser执行javascript语句前后的变化,以判断是否执行完毕,使程序更加安全。

获取css:

获取css和获取js过程一模一样,只需要把

WebBrowser1.Navigate "javascript:str='
\n';c=document.scripts;for(i=0;i
';str+=o.src;str+='
\n';};str+='';document.write(str);"

改成:

WebBrowser1.Navigate "javascript:str='
\n';c=document.styleSheets;for(i=0;i
';str+=o.href;str+='
\n';};str+='';document.write(str);"

最后说明一点:

javascript没有直接提供获取js文件内容的接口,因此首先要对注册表进行改造:运行regedit,定位到HKEY_CLASSES_ROOT\.js,在它下面增加两个字符串类型的值:

Content Type=application/x-javascript

PerceivedType=text

如果修改的时候不放心,可以参考HKEY_CLASSES_ROOT\.css的缺省设置,它们只是Content Type的值不同。注册表改造是一次性的工作,改完就不用再动。

用代码改就是:

Dim lhwySet lhwy = CreateObject("wscript.shell")lhwy.regwrite "HKEY_CLASSES_ROOT\.js\Content Type", "application/x-javascript"lhwy.regwrite "HKEY_CLASSES_ROOT\.js\PerceivedType", "text"

     3.判断网页编码。先以GB编码保存,然后再读取,如果和保存之前不一样,说明是UTF-8编码,再用UTF-8编码保存。

用GB编码保存:

Open App.Path & "\xx.HTM" For Output As #1    Print #1, strHTMClose #1

用UTF-8编码保存:

'引用Microsoft ActiveX Data Objects 2.8 LibraryDim objStream As New ADODB.StreamDim str As String     With objStream.Type = 2.Mode = 3.Open.Charset = "UTF-8".WriteText strHTM, adWriteLine.SaveToFile App.Path & "\xxHTM", adSaveCreateOverWrite.CloseEnd With

转载地址:http://rkgol.baihongyu.com/

你可能感兴趣的文章
oracle常用查询三
查看>>
码字定式之SQL(6)
查看>>
命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)...
查看>>
【转】Scheme 编程环境的设置
查看>>
异常分类,异常抛出位置
查看>>
需求分析与原型设计
查看>>
敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
查看>>
5.Lvs+Keepalived健康检查
查看>>
Oracle 数据库连接操作符(||)
查看>>
/proc/net/sockstat 里的信息是什么意思?
查看>>
细说业务逻辑(前篇)
查看>>
status bar in .plist,
查看>>
作品展示(2)
查看>>
<转>如何调试makefile
查看>>
代码赏析——史丰收速算
查看>>
oracle恢复误删除表
查看>>
Navicat for MySQL常见命令
查看>>
Threading and Tasks in Chrome
查看>>
七、Maven依赖管理
查看>>
Android 学习
查看>>