| 首先介绍几种设计好的函数 
 
 
 ’本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换操作。
 ’==============================================
 
 ’一个采集入库生成本地文件的几个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")
 
 |