用XML组件生成静态首页
了解asp的人应该都知道asp是一种解释执行的脚本程序语言,而脚本程序的执行效率往往都是很低的,如果站点的访问量相对较高的话服务器就会非常消耗资源,表现的结果就是站点访问速度急速下降.解决的方法,除了优化程序提高执行效率,还有一个方法就是将网站内的访问量大的页面定时的生成静态html文件,这样可以非常有效的解决访问速度问题,当然前提是你的服务器速度也要不是很慢了,不然怎么弄都是没有效果的. 下面我介绍一种利用Msxml2.ServerXMLHTTP组件来抓取您所要生成静态的网页,然后再利用fso,或者ado来写入文件的一种方法,需要注意的是本文例子全部采用utf-8编码,如果改为gb2312需要做相应属性的修改! 先给处下面的函数:
<!--'相关问题可访问http://www.knowsky.com
Function GetURL(URL)
'下载主函数
const TimeInterval=60
'设定时间间隔
'如果下载时间很慢,就写成120秒
'Response.LCID=2052
const lResolve=6
'解析域名超时时间,秒
const lConnect=6
'连接站点超时时间,秒
const lSend=6
'发送数据请求超时时间,秒
const lReceive=40
'下载数据超时时间,秒
on error resume Next
Dim http
Set http = Server.CreateObject("Msxml2.ServerXMLHTTP")
http.setTimeouts lResolve*1000,lConnect*1000,lSend*1000,lReceive*1000
http.Open "GET",URL,False
http.Send
Select Case http.readyState
Case 0
GetURL="对象初始化失败"
Err.Clear
set http=nothing
Exit Function
Case 1
GetURL="域名分析超时/连接站点超时"
Err.Clear
set http=nothing
Exit Function
Case 2
GetURL="发送数据请求超时,是不是服务器出故障了"
Err.Clear
set http=nothing
Exit Function
Case 3
GetURL="数据下载超时/等待反馈时间超时"
Err.Clear
set http=nothing
Exit Function
Case 4
'下载成功
End Select
If http.status<>200 then
GetURL="下载失败"&Err.description
Err.Clear
set http=nothing
Exit Function
END IF
If http.status="200" then
GetURL=http.ResponseText
'GetURL=SaveFile()
End If
set http=nothing
End Function
-->
主要功能是抓取地址参数的网页文件的内容 使用方法varia=GetURL("http://www.supersha.cn"),如果是本地测试地址可以写成http://localhost/default.asp 使用此函数需要注意的是Response.LCID=2052属性在windows server 2000下不被支持,不过问题不大只要注释掉即可正常使用! 还有一些超时属性可以根据需要自定义,但注意不要设置的时间太短,否则如果文件大或者地址访问速度较慢就容易抓取失败! 这让我们就可以利用此函数来抓取你想要生成的网页文件内容了.将内容存入变量,等着写入文件吧!
下面给出这个类,用来将刚刚利用函数抓取的内容写入相应文件,这样就大功告成了! 直接生成你所要生成的网页吧,非常方便而且不用修改原来的文件!
Class Htmlmaker
'相关问题请参看 http://www.knowsky.com
'/*************************
'/ 属性设置说明
'/ foldename "文件夹名"
'/ 如果不设置,将自动生成[年月日]时间格式的文件夹名
'/ Filename "文件名"(含前后缀)
'/ 如果不设置,将自动生成[时分秒]时间格式的文件名,后缀为.html
'/ Htmlstr "生成的代码内容"
'/*************************
Private HtmlFolder,HtmlFilename,HtmlContent
Public property let foldename(str)
HtmlFolder=str
End property
Public property let Filename(str)
HtmlFilename=str
End property
Public property let Htmlstr(str)
HtmlContent=str
End property
'/*************************
'/ 文件名转换日期函数
'/*************************
Private Function Datename1(timestr)
dim s_year,s_month,s_day
s_year=year(timestr)
if len(s_year)=2 then s_year="20"&s_year
s_month=month(timestr)
if s_month<10 then s_month="0"&s_month
s_day=day(timestr)
if s_day<10 then s_day="0"&s_day
Datename1=s_year & s_month & s_day
End Function
Private Function Datename2(timestr)
dim s_hour,s_minute,s_ss
s_hour=hour(timestr)
if s_hour<10 then s_hour="0"&s_hour
s_minute=minute(timestr)
if s_minute<10 then s_minute="0"&s_minute
s_ss=second(timestr)
if s_ss<10 then s_ss="0"&s_ss
Datename2 = s_hour & s_minute & s_ss
End Function
'/*************************
'/ 初试化
'/*************************
Private Sub class_initialize()
HtmlFolder=Datename1(now)
HtmlFilename=Datename2(now)&".html"
HtmlC
End Sub
Private Sub class_terminate()
End Sub
'/*************************
'/ Html文件生成
'/*************************
Public Sub Htmlmake()
' On Error Resume Next
dim filepath,fso,fout
filepath = HtmlFolder&"/"&HtmlFilename
Set fso = Server.CreateObject("Scripting.FileSystemObject")
If fso.FolderExists(Server.MapPath(HtmlFolder)) Then
Else
fso.CreateFolder(Server.MapPath(HtmlFolder))
End If
' Set fout = fso.CreateTextFile(Server.MapPath(filepath),true)
' fout.WriteLine HtmlContent
' fout.close
dim objFSO,adTypeText,adSaveCreateOverWrite,Charsett,objAdoStream
Charsett = "utf-8"
set objAdoStream = Server.CreateObject("ADODB.Stream")
adTypeText = 2
adSaveCreateOverWrite = 2
objAdoStream.Type = adTypeText
objAdoStream.Open
objAdoStream.Charset = Charsett
objAdoStream.WriteText(HtmlContent)
objAdoStream.SaveToFile Server.MapPath(filepath),2
objAdoStream.Close
End Sub
'/*************************
'/ Html文件删除
'/*************************
Public Sub Htmldel()
dim filepath,fso
filepath = HtmlFolder&"/"&HtmlFilename
Set fso = CreateObject("Scripting.FileSystemObject")
if fso.FileExists(Server.MapPath(filepath)) then
fso.DeleteFile(Server.mappath(filepath))
end if
Set fso = nothing
End Sub
End class
下面为了让大家更好的学习给出具体的举一个实例:
我们有一个网站地址是 http://www.knowsky.com/
我们要将其首页也就是default.asp生成静态的htm文件
我们先建立个文件:makeindex.asp
<!--#include file="function_class.asp"-->
<%
dim indexhtmlstr
indexhtmlstr=GetURL("http://www.supersha.cn/index.asp")
dim indexfilename
indexfilename="index.htm"
dim actionstat
if len(indexhtmlstr) <200 then
acti&indexfilename&"文件时遇到"&indexhtmlstr&"错误"
else
dim myhtml
set myhtml= new Htmlmaker
myhtml.foldename = "../.."
myhtml.Filename = indexfilename
myhtml.Htmldel
myhtml.Htmlstr = indexhtmlstr
myhtml.Htmlmake
set myhtml=nothing
acti&indexfilename&"文件"
end if
response.write actionstat
%>
文件function_class.asp的内容主要包括前面给出的函数和生成文件的类就可以了!
运行makeindex.asp就可以生成htm文件了!
================================================================================================
asp利用xmlhttp抓取特定网页内容例子
asp利用xmlhttp抓取特定网页内容例子
asp抓取网页。偶要实现实实更新天气预报。利用了XMLHTTP组件,抓取网页的指定部分。很多小偷查询都是使用这个方法来实现的。
需要分件html源代码
此例中的被抓取的html源代码如下
<p align=left>2004年8月24日星期二;白天:晴有时多云南风3—4级;夜间:晴南风3—4级;气温:最高29℃最低19℃ </p>
而程序中是从以2004年8月24日为关键字搜索,直到</p>结速
而抓取的内容就变成了"2004年8月24日星期二;白天:晴有时多云南风3—4级;夜间:晴南风3—4级;气温:最高29℃最低19℃ "
干干净净的了。记录一下。
<%
'中国asp之家
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312")
End function
Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring<=0 then Newstring=Len(wstr)
End Function
%>
<html>
<BODY bgColor=#ffffff leftMargin=0 topMargin=0 MARGINHEIGHT=0 MARGINWIDTH=0>
<!-- 开始 -->
<%
Dim wstr,str,url,start,over,dtime
dtime=Year(Date)&"年"&Month(Date)&"月"&Day(Date)&"日"
url="http://www.qianhuaweb.com/"
wstr=getHTTPPage(url)
start=Newstring(wstr,dtime)
over=Newstring(wstr,"</p>")
body=mid(wstr,start,over-start)
response.write "<MARQUEE οnmοuseοver=this.stop(); οnmοuseοut=this.start();>"&body&"</marquee>"
%>
<!-- 结束 -->
</body></html>
==============================================================================================
XmlHttp对象及其应用
XmlHttp对象及其应用
XmlHttp对象及其应用
关键词:Http协议,Xml,Web服务器
简介:XmlHttp对象是微软的MSXML库中的一个对象,通过这个对象我们能够通过Http协议
向远程的Web服务器发送数据,并能够接收Web服务器返回回来的数据。
1、什么是XmlHttp?
XmlHttp是一个COM对象,位于微软的MSXML对象库中,我们也可以简单的把它理解为一系列的API,总之它为我们提供了很多的方法。
从单词本身的意义上看,该对象肯定与Xml有关,也与Http协议有关,这是对的。以至于我当初的理解就是,该对象只能通过Http协议发送和接收Xml数据。
其实,不仅如此,XmlHttp对象还能够通过Http协议向一些Web应用(不但Web Server,还可以是Web Service 甚至一些数据库接口)发送和接收一些文本数据甚至二进制的数据。
所以在现在的应用当中,如果要作基于Http协议的开发,我们通常会使用它。
2、XmlHttp对象的基本用法。
XmlHttp对象包括以下几个主要的方法:
open
Open方法通过相关的参数,初始化一个Http请求,Open方法的参数如下
XmlHttp.Open(strMethod, strUrl, varAsync, strUser, strPassword) strMethod参数决定该次Http请求的执行方式,包括Get,Post,Head等等,具体可参考Http 1.1协议
strUrl 是发起Http请求的Url地址
varAsync 同步异步方式,这是一个可选参数,但是默认是True,也就是异步方式,也就是说程序不会等到
该Http请求结束就继续往下执行了。
strUser和strPassword 这两个参数也是可选的,是在请求一些需要验证的Url时需要的
setRequestHeader
该方法可以确定需要传输的Http Header信息,包含两个参数,一个是Header 名字,一个是值
比如 setRequestHeader("Host:","www.supersha.cn")
send
在经过Open方法初始化一个Http请求,和经过setRequestHeader方法设置好头信息(当然这一步经常是不需要的)
以后,就可以通过send方法,向服务器具体说就是那个Url地址发起Http请求了。
getAllResponseHeaders
该方法能够得到所有返回的Http头信息
abort
该方法取消和终止当前的Http请求。
那在发完了Http请求之后,我们怎么能够得到该请求的返回信息呢? 用下面这几个属性吧,注意这些属性都是只读的, 也就是说你不能够给他们赋值。
ResponseText
该属性返回Http请求的全部文本信息,而并不处理这些信息,注意默认是以UTF-8编码返回的,这也是为什么在显示中文时,我们还需要做一些处理。
ResponseBody
ResponseXml
如果你请求的Url是个标准的XML文件的话,那么就可以用该属性,配合XMLDOM对象就可以处理Xml了。 这里需要注意的是,如果你是通过程序生成的Xml(比如现在好多的RSS),那么你必须在输出时指定头信息为text/xml
在Asp中用Response.ContentType方法, 否则ResponseXML将会是空值。
ResponseStream
以二进制数据的方式返回数据,用这个方法就可以直接下载文件了。
说了这么多,下面是一个最简单的XmlHttp对象的使用方法,这是在Asp中使用的:
<%
Dim objXMLHTTP
set objXMLHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objXMLHTTP.Open "GET", "http://www.supersha.cn", false
objXMLHTTP.Send
Response.Write "<xmp>"
Response.Write objXMLHTTP.ResponseText
Response.Write "</xmp>"
%>
3、应用举例之一--无刷新的数据显示
其实网上所说的无刷新数据显示,并不是不刷新,而是局部刷新。
以前我们做聊天室的时候,每隔几秒钟刷新一下整个页面,这样看起来很不舒服。
记得以前为北京市交管局做了一套《路口违章数据的自动回传和实时监控系统》,在一个IE浏览器里
分四个窗口,每个窗口显示一个路口的实时图像,这就要求每1秒钟各个小窗口要独自刷新图片(图片
是通过电话线从路口的工控机上传回来的),最后就是用XmlHttp对象实现的,效果还非常不错。
这里就不写代码了,主要依靠客户端的XmlHttp对象和Javascript来实现,大体思路是这样
<script language="javascript">
function getUrl() //取数据
{
var objXml = new ActiveXObject("Microsoft.XMLHTTP");
....
//取回数据之后在页面上显示
document.aaa.innerText=
}
setTimeOut(getUrl,1000);
</script>
4、应用举例之二--获取其它网站的数据
用XmlHttp来获取其它网站的数据,是我们现在用到的最多的,比如一些新闻小偷啦、天气预报小偷啦股票查询、车次查询啦等等,总之就是从他人的网站上获取数据。
这里,给大家一段写好的函数,可以直接拿过来使用,比如我想要抓取 http://www.toprosoft.com 的首页,在Asp中就可以这样
<%=OpenUrl("http://www.supersha.cn")%>
另外的例子,就是我写的一个《抓取动网论坛 Email 地址的一段代码 》文章,
大家在这里可以找到,http://blog.csdn.net/cqq/archive/2005/07/20/429923.aspx
Function OpenUrl(strUrl)
Dim xmlhttp
on Error Resume Next
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "GET",(strUrl ),false
xmlhttp.send
OpenUrl=bytes2BSTR(xmlhttp.ResponseBody)
Set xmlhttp = Nothing
End Function
Function bytes2BSTR(vIn)
Dim i
Dim strReturn
Dim ThisCharCode
Dim NextCharCode
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function