小偷小偷入库采集入库
2018-09-06 11:39
XMLHTTP应用参考
一、使用步骤:
1、创建XMLHTTP对象//需MSXML4.0支持
2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样,可以用GET方法或POST方法指向服务端的服务网页。
3、发送指令。
4、等待并接收服务端返回的处理结果。
5、释放XMLHTTP对象
二、XMLHTTP方法:
1、XMLHTTP对象
备注:客户机可以使用XMLHTTP对象发送任意的HTTP请求,接受HTTP应答,还可以对应答的XML文档进行解析。
Open方法:初始化一个Msxml2.XMLHTTP请求,指定HTTP请求方式、URL以及鉴定信息。
Open(bstrMethod,bstrUrl,varAsync,bstrUser,bstrPassword)
bstrMethod:数据传送方式,即GET或POST。
bstrUrl:服务网页的URL。
varAsync:是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
bstrUser:用户名,可省略。
bstrPassword:用户口令,可省略。
Send方法:发送HTTP请求到服务器,返回应答。
语法:
oXMLHttpRequest.send(varBody)
说明:此方法是否同步取决于Open方法的varAsync参数。如果设为True则为同步,调用立刻返回,如果设为False调用直到整个应答被接收了才返回。
setRequestHeader(bstrHeader,bstrvalue)
bstrHeader:HTTP头(header)
bstrvalue:HTTP头(header)的值
如果Open方法定义为POST,可以定义表单方式上传:
xmlhttp.setRequestHeader(Content-Type,application/x-)
三、XMLHTTP属性:
onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
responseBody:结果返回为无符号整数数组。
responseStream:结果返回为IStream流。
responseText:结果返回为字符串。
responseXML:结果返回为XML格式数据。
四、示例:
<scriptlanguage=javascript>
functiongetDatal(url){
varxmlhttp=newActiveXObject(MSXML2.XMLHTTP.4.0;//创建XMLHTTPRequest对象,需MSXML4.0支持[MSXML2.XMLHTTP.4.0,MSXML2.DOMDocument.4.0]
xmlhttp.open(GET,url,false,,;//使用HTTPGET初始化HTTP请求
xmlhttp.send(;//发送HTTP请求并获取HTTP响应
returnxmlhttp.responseXML;//获取XML文档
}
</script>
现在网上流行的小偷程序比较多,有新闻类小偷,音乐小偷,下载小偷,那么它们是如何做的呢,下面我来做个简单介绍,希望对各位站长有所帮助。
(一)原理
小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页。比如新闻小偷程序,很多都是调用了sina的新闻网页,并且对其中的html进行了一些替换,同时对广告也进行了过滤。用小偷程序的优点有:无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点有:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。
(二)事例
下面就XMLHTTP在ASP中的应用做个简单说明
代码:<%
常用函数
1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
functiongetHTTPPage(url)
dimHttp
setHttp=server.createobject(MSXML2.XMLHTTP
Http.openGET,url,false
Http.send()
ifHttp.readystate<>4then
exitfunction
endif
getHTTPPage=bytesToBSTR(Http.responseBody,GB2312
sethttp=nothing
iferr.number<>0thenerr.Clear
endfunction
2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
FunctionBytesToBstr(body,Cset)
dimobjstream
setobjstream=Server.CreateObject(adodb.stream
objstream.Type=1
objstream.Mode=3
objstream.Open
objstream.Writebody
objstream.Position=0
objstream.Type=2
objstream.Charset=Cset
BytesToBstr=objstream.ReadText
objstream.Close
setobjstream=nothing
EndFunction
下面试着调用的html内容
DimUrl,Html
Url=
Html=getHTTPPage(Url)
Response.writeHtml
%>
------------------------------------------------------
代码:
代码]用XMLHTTP读取远程文件
<%
Response.Buffer=True
DimobjXMLHTTP,xml
Setxml=Server.CreateObject(Microsoft.XMLHTTP
xml.OpenGET,
xml.Send
Addaheadertogiveitafilename:
Response.AddHeaderContent-Disposition,_
attachment;filename=mitchell-pres.zip
Specifythecontenttypetotellthebrowserwhattodo:
Binarywritethebytestothebrowser
Response.BinaryWritexml.responseBody
Setxml=Nothing
%>
-------------------------------------
如何写ASP入库小偷程序
入库小偷的原理也很简单:就是用XMLHTTP远程读取网页的内容,然后根据需要,对读到的内容进行加工(过滤,替换,分类),最后得到自己需要的数据,加入到数据库中。
首先:我们先用XMLHTTP读取远程网页(我的另一片文章中有介绍)。
其次:对内容进行过滤,这个是比较关键的步骤,比如说,我要从远程网页上提取出所有url连接,我应该怎么做呢?
代码:
‘这里用的是正则式
SetobjRegExp=NewRegexp建立对象
objRegExp.IgnoreCase=True大小写忽略
objRegExp.Global=True全局为真
objRegExp.Pattern=匹配字段
setmm=objRegExp.Execute(str)执行查找,str为输入参数
ForEachMatchinmm进入循环
Response.write(Match.Value)输出url地址
next
然后,我们需要根据需要做一些替换功能,把不必要的数据替换掉,这个比较简单,用Replace函数即可。
最后,进行数据库操作
-------------------------------
一个例子
代码:
<%
OnErrorResumeNext
Server.ScriptTimeOut=9999999
FunctiongetHTTPPage(Path)
t=GetBody(Path)
getHTTPPage=BytesToBstr(t,GB2312
Endfunction
首先,进行小偷程序的一些初始化设置,以上代码的作用分别是忽略掉所有非致命性错误,把小偷程序的运行超时时间设置得很长(这样不会出现运行超时的错误),转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码。
FunctionGetBody(url)
onerrorresumenext
SetRetrieval=CreateObject(Microsoft.XMLHTTP
WithRetrieval
.OpenGet,url,False,,
.Send
GetBody=.ResponseBody
EndWith
SetRetrieval=Nothing
EndFunction
然后调用XMLHTTP组件创建一个对象并进行初始化设置。
FunctionBytesToBstr(body,Cset)
dimobjstream
setobjstream=Server.CreateObject(adodb.stream
objstream.Type=1
objstream.Mode=3
objstream.Open
objstream.Writebody
objstream.Position=0
objstream.Type=2
objstream.Charset=Cset
BytesToBstr=objstream.ReadText
objstream.Close
setobjstream=nothing
EndFunction
FunctionNewstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
ifNewstring<=0thenNewstring=Len(wstr)
EndFunction
处理抓取回来的数据需要调用adodb.stream组件并进行初始化设置。%>
以下即为页面显示部分
<%
Dimwstr,str,url,start,over,city
定义一些需要使用到的变量
city=Request.QueryString(id)
程序传回的ID变量(即用户选择的城市)赋给id
url=
这里设置需要抓取的页面地址,当然你也可以直接指定某个地址而不使用变量
wstr=getHTTPPage(url)
获取指定页面的全部数据
start=Newstring(wstr,<html>)
这里设置需要处理的数据的头部,这个变量应视不同情况而设置,具体内容可以通过查看需要抓取的页面的源代码来确定。因为在这个程序里我们需要抓取整个页面,所以设置为页面全部抓取。注意,设置的内容必须是页面内容唯一的,不可以重复。
over=Newstring(wstr,</HTML>)
和start相对应的就是需要处理的数据的尾部,同样的,设置的内容必须是页面中唯一的。
body=mid(wstr,start,over-start)
设置显示页面的范围
下面就是动用乾坤挪移***的时候了,通过replace可以用一些字符替换掉数据中指定的字符。
body=replace(body,skin1,天气预报-斯克网络)
body=replace(body,
本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换操作。
response.writebody
引用:远程获取内容,并将内容存在本地电脑上,包括任何文件
<%
----------远程获取内容,并将内容存在本地电脑上,包括任何文件!----------
OnErrorResumeNext
Setthecontenttypetothespecifictypethatyouaresending.
Response.ContentType=IMAGE/JPEG
-------------------------------定义输出格式-----------------------------
Path=request.querystring(p)
sPath=Path
ifleft(lcase(path),7)<>
-------------如果前面没有http就是本地文件,交给LocalFile处理------------
LocalFile(path)
else
--------------------否则为远程文件,交给RemoteFile处理------------------
RemoteFile(Path)
endif
Response.Writeerr.Description
subLocalFile(Path)
-------------------如果为本地文件则简单的跳转到该页面-------------------
Response.RedirectPath
EndSub
SubRemoteFile(sPath)
-------------------------处理远程文件函数------------------------------
FileName=GetFileName(sPath)
-------------GetFileName为把地址转换为合格的文件名过程-------------
FileName=Server.MapPath(/UploadFile/Cache/&FileName)
SetobjFso=Server.CreateObject(Scripting.FileSystemObject)
Response.WritefileName
ifobjFso.FileExists(FileName)Then
--------------检查文件是否是已经访问过,如是,则简单跳转------------
Response.Redirect/uploadfile/cache/&GetFileName(path)
Else
----------------否则的话就先用GetBody函数读取----------------------
Response.WritePath
t=GetBody(Path)
-----------------用二进制方法写到浏览器上--------------------------
Response.BinaryWritet
Response.Flush
-----------------输出缓冲------------------------------------------
SaveFilet,GetFileName(path)
------------------将文件内容缓存到本地路径,以待下次访问-----------
Endif
SetobjFso=Nothing
EndSub
FunctionGetBody(url)
-----------------------本函数为远程获取内容的函数---------------------
onerrorresumenext
Response.Writeurl
SetRetrieval=CreateObject(Microsoft.XMLHTTP)
----------------------建立XMLHTTP对象-----------------------------
WithRetrieval
.OpenGet,url,False,,
------------------用Get,异步的方法发送-----------------------
.Send
GetBody=.ResponseText
GetBody=.ResponseBody
------------------函数返回获取的内容--------------------------
EndWith
SetRetrieval=Nothing
response.Writeerr.Description
EndFunction
FunctionGetFileName(str)
-------------------------本函数为合格化的文件名函数-------------------
str=Replace(lcase(str),
str=Replace(lcase(str),//,/)
str=Replace(str,/,)
str=replace(str,vbcrlf,)
GetFileName=str
EndFunction
subSaveFile(str,fName)
-------------------------本函数为将流内容存盘的函数-------------------
onerrorresumenext
SetobjStream=Server.CreateObject(ADODB.Stream)
--------------建立ADODB.Stream对象,必须要ADO2.5以上版本---------
objStream.Type=adTypeBinary
-------------以二进制模式打开-------------------------------------
objStream.Open
objstream.writestr
--------------------将字符串内容写入缓冲--------------------------
response.Writefname
objstream.SaveToFilec:\inetpub\myweb\uploadfile\cache\&fName,adSaveCreateOverWrite
--------------------将缓冲的内容写入文件--------------------------
response.BinaryWriteobjstream.Read
objstream.Close()
setobjstream=nothing
-----------------------关闭对象,释放资源-------------------------
response.Writeerr.Description
Endsub
%>