打印本页〗〖打印选项
ASP小偷程序的设计思路
首先介绍几种设计好的函数



’本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换操作。
’==============================================

’一个采集入库生成本地文件的几个FUCTION


’--------------------------------------------------------------------------------
’*****************************************************************
’ function
’ 作用 :利用流保存文件
’ 参数 :from(远程文件地址),tofile(保存文件位置)
’*****************************************************************
Private Function SaveFiles(byref from,byref tofile)
Dim Datas
Datas=GetData(from,0)
Response.Write "保存成功:<font color=red>"&formatnumber(len(Datas)/1024*2,2)&"</font>Kb"
response.Flush
if formatnumber(len(Datas)/1024*2,2)>1 then
ADOS.Type = 1
ADOS.Mode =3
ADOS.Open
ADOS.write Datas
ADOS.SaveToFile server.mappath(tofile),2
ADOS.Close()
else
Response.Write "保存失败:<font color=red>文件大小"&formatnumber(len(imgs)/1024*2,2)&"Kb,小于1K</font>"
response.Flush
end if
end function

’*****************************************************************
’ function(私有)
’ 作用 :利用fso检测文件是否存在,存在返回true,不存在返回false
’ 参数 :filespes(文件位置)
’*****************************************************************
Private Function IsExists(byref filespec)
If (FSO.FileExists(server.MapPath(filespec))) Then
IsExists = True
Else
IsExists = False
End If
End Function
’*****************************************************************
’ function(私有)
’ 作用 :利用fso检测文件夹是否存在,存在返回true,不存在返回false
’ 参数 :folder(文件夹位置)
’*****************************************************************
Private Function IsFolder(byref Folder)
If FSO.FolderExists(server.MapPath(Folder)) Then
IsFolder = True
Else
IsFolder = False
End If
End Function

’*****************************************************************
’ function(私有)
’ 作用 :利用fso创建文件夹
’ 参数 :fldr(文件夹位置)
’*****************************************************************
Private Function CreateFolder(byref fldr)
Dim f
Set f = FSO.CreateFolder(Server.MapPath(fldr))
CreateFolder = f.Path
Set f=nothing
End Function

’*****************************************************************
’ function(公有)
’ 作用 :保存文件,并自动创建多级文件夹
’ 参数 :fromurl(远程文件地址),tofiles (保存位置)
’*****************************************************************
Public Function SaveData(byref FromUrl,byref ToFiles)
ToFiles=trim(Replace(ToFiles,"//","/"))
flName=ToFiles
fldr=""
If IsExists(flName)=false then
GetNewsFold=split(flName,"/")
For i=0 to Ubound(GetNewsFold)-1
if fldr="" then
fldr=GetNewsFold(i)
else
fldr=fldr&"\"&GetNewsFold(i)
end if
If IsFolder(fldr)=false then
CreateFolder fldr
End if
Next
SaveFiles FromUrl,flName
End if
End function
’*****************************************************************
’ function(公有)
’ 作用 :取得远程数据
’ 参数 :url(远程文件地址),getmode (模式:0为二进制,1为中文编码)

’*****************************************************************
Public Function GetData(byref url,byref GetMode)
’on error resume next
SourceCode = OXML.open ("GET",url,false)
OXML.send()
if OXML.readystate<>4 then exit function
if GetMode=0 then
GetData = OXML.responseBody
else
GetData = BytesToBstr(OXML.responseBody)
end if
if err.number<>0 then err.Clear
End Function

’*****************************************************************
’ function(公有)
’ 作用 :格式化远程图片地址为本地位置
’ 参数 :imgurl(远程图片地址),imgfolder (本地图片目录),fristname(加入的前缀名称)
’*****************************************************************
Public Function FormatImgPath(byref ImgUrl,byref ImgFolder,byref FristName,byref noimg)
strpath=""
ImgUrl=ImgUrl
if instr(ImgUrl,"Nophoto") or lenb(GetData(ImgUrl,0))<=0 then
strpath=noimg
Response.Write "<a href="&strpath&">"&strpath&"</a>" &VBcrlf
else
if Instr(ImgUrl,".ASP") then
strpath=FristName&"_"&Mid(ImgUrl, InStrRev(ImgUrl, "=")+1)&".jpg"
else
strpath=FristName&"_"&Mid(ImgUrl, InStrRev(ImgUrl, "/")+1)
end if
strpath = ImgFolder&"/"&strpath
strpath = Replace(strpath,"//","/")
if left(strpath,1)="/" then strpath=right(strpath,len(strpath)-1)
strpath = trim(strpath)
Response.Write "<a href="&strpath&">"&strpath&"</a>" &vbcrlf
savedata ImgUrl,strpath
end if
FormatImgPath = strpath
End function
%>


现在分类介绍几种汲取的方法。

入库小偷的原理也很简单:就是用XMLHTTP远程读取网页的内容,然后根据需要,对读到的内容进行加工(过滤,替换,分类),最后得到自己需要的数据,加入到数据库中。
首先:我们先用XMLHTTP读取远程网页(我的另一片文章中有介绍)。
其次:对内容进行过滤,这个是比较关键的步骤,比如说,我要从远程网页上提取出所有url连接,我应该怎么做呢?
代码:
‘这里用的是正则式
Set objRegExp = New Regexp ’建立对象
objRegExp.IgnoreCase = True ’大小写忽略
objRegExp.Global = True ’全局为真
objRegExp.Pattern = "http://.+?"’ 匹配字段
set mm=objRegExp.Execute(str) ’执行查找,str为输入参数
For Each Match in mm ’进入循环
Response.write(Match.Value) ’输出url地址
next


然后,我们需要根据需要做一些替换功能,把不必要的数据替换掉,这个比较简单,用Replace函数即可。
最后,进行数据库操作
-------------------------------
一个例子
代码:
<%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312")
End function

’首先,进行小偷程序的一些初始化设置,以上代码的作用分别是忽略掉所有非致命性错误,把小偷程序的运行超时时间设置得很长(这样不会出现运行超时的错误),转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码。

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

’然后调用XMLHTTP组件创建一个对象并进行初始化设置。

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

’处理抓取回来的数据需要调用adodb.stream组件并进行初始化设置。%>

’以下即为页面显示部分

<%
Dim wstr,str,url,start,over,city
’定义一些需要使用到的变量

city = Request.QueryString("id")
’程序传回的ID变量(即用户选择的城市)赋给id

url="http://appnews.qq.com/cgi-bin/news_qq_sea ... amp;city&"
’这里设置需要抓取的页面地址,当然你也可以直接指定某个地址而不使用变量
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,"http://appnews.qq.com/cgi-bin/news_qq_search?city" ,"tianqi.asp?id")



文章作者:未知