〖打印本页〗〖打印选项〗 |
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") 文章作者:未知 |