天气预报小偷原理教程

作者: Admin 分类: 技术杂谈 发布时间: 2010/1/4 23:48:50 ė3608 浏览数 60条评论
        什么小偷不用进公安局?天气预报小偷!哈哈
最近很多朋友还在询问追梦阳光开发的天气预报组件问题,因为天气预报组件属于小偷性质的,所以只要对方网站进行了改版,哪怕是微型的改版,都会导致获取不成功,这个时候,就需要站长朋友们自己修改手中的天气预报代码,但是往往很多站长看着整屏的代码,无从下手。不要着急,今天我们用哦最简单的例子,来讲述小偷的工作原理。

小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页,如果能够带有采集入库功能,就变成了采集器了。比如我们的天气预报程序,调用了sina的天气网页,并且对其中的html进行了一些替换,同时对广告也进行了过滤。用采集程序的优点有:无须维护网站,因为采集程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服务器资源,一般采集程序就几个文件,所有网页内容都是来自其他网站。缺点有:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么采集程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。

首先,我们建立一个最简单的asp文档,这里就起名字tou.asp吧。
在里面输入如下内容:

下面就XMLHTTP在ASP中的应用做个简单说明

<%
'常用函数
'1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
Function getHTTPPage(url)
IF(IsObjInstalled("Microsoft.XMLHTTP") = False)THEN
Response.Write "

服务器不支持Microsoft.XMLHTTP组件"
Err.Clear
Response.End
END IF
On Error Resume Next
Dim http
SET http=Server.CreateObject("Msxml2.XMLHTTP")
Http.open "GET",url,False
Http.send()
IF(Http.readystate<>4)THEN
Exit Function
END IF
getHTTPPage=BytesToBSTR(Http.responseBody,"gb2312")'转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码
SET http=NOTHING
IF(Err.number<>0)THEN
Response.Write "

获取文件内容出错"
'Response.End
Err.Clear
END IF
End Function

'2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
Function BytesToBstr(CodeBody,CodeSet)
Dim objStream
SET objStream = Server.CreateObject("adodb.stream")
objStream.Type = 1
objStream.Mode =3
objStream.Open
objStream.Write CodeBody
objStream.Position = 0
objStream.Type = 2
objStream.Charset = CodeSet
BytesToBstr = objStream.ReadText
objStream.Close
SET objStream = NOTHING
End Function

'3、检查组件是否已经安装 返回值:True  ----已经安装'        False ----没有安装
Function IsObjInstalled(objName)
On Error Resume Next
IsObjInstalled = False
Err = 0
Dim testObj
SET testObj = Server.CreateObject(objName)
IF(0 = Err)THEN IsObjInstalled = True
SET testObj = NOTHING
Err = 0
End Function

'下面试着调用http://php.weather.sina.com.cn/search.php?f=1&city=济南&dpc=1的html内容
Dim Url,Html
Url="http://php.weather.sina.com.cn/search.php?f=1&city=济南&dpc=1"
Html = getHTTPPage(Url)
Response.write Html
%>

看到什么了?是不是熟悉的天气预报界面?
好,到此,最简单的小偷我们就做完了。当然你会说,这个肯定不满意啊,因为这个所获得是全部页面,而不是你需要的页面的一部分,如果要得到你需要的内容,那就需要进行截取。这个截取工作,除了需要写所谓的“采集规则”之外,需要有几个关键函数来完成,下面我们来认识一下这几个函数的作用。
在数据切分的时候,我们有好多种方法,有人用数组,有人用mid函数,还有人用正则表达式,其实道理都大同小异,那么我们今天就用正则表达式吧,首先看这个现成的函数:

'截取strng中特定字符串,从strStart开始截取,到strStart为结束
Function RegExpText(strng,strStart,strEnd)
Dim regEx,Match,Matches,RetStr
SET regEx = New RegExp
regEx.Pattern = strStart&"([\\s\\S]*?)"&strEnd
regEx.IgnoreCase = True
regEx.Global = True
SET Matches = regEx.Execute(strng)
For Each Match in Matches
RetStr = RetStr & regEx.Replace(Match.Value,"$1")
Next
RegExpText = RetStr
SET regEx=NOTHING
End Function

好,有了这个函数,我们完全可以接着上面的例子,开始测试。
上面的例子中,
Html = getHTTPPage(Url)
Response.write Html
我们来修改一下:
Html = getHTTPPage(Url)
Response.write RegExpText(Html,"javascript:sent_to_vb",";"" class=""i6"">")
刷新你的浏览器看看效果即可!
至于刚才提到的函数中间需要的内容,是需要你自己去分析的。
分析有几个原则:
1, 唯一原则,起点和出点,都是唯一的,这个唯一,才能决定你所选择的内容的正确性。
2, 简单原则,不要弄太多,找到个性切入点就行了。
3, 在这个函数里面用到的代码都是asp格式化的。比如我从查看源代码中找到了唯一代码class="i6",那么,写到这个函数里的时候,需要预先进行格式化,格式化为class=""i6""。也就是一个双引号,必须要变成两个双引号。

好了,最简单的天气预报出来了,但是其中含有一些你不喜欢的东西,或者是对方的图片和广告,咱们可没有义务去给他宣传这个,那就替换掉,替换用另一个函数repalce
首先来看用法:
Dim SearchString, SearchChar
SearchString ="我是追梦阳光动力的张先生" ' 要在其中搜索的字符串。
SearchString =Replace(SearchString,"张先生","王女士")
'此时SearchString的值就变成了"我是追梦阳光动力的王女士"

上面的例子中,
Html = getHTTPPage(Url)
Response.write RegExpText(Html,"javascript:sent_to_vb",";"" class=""i6"">")
我们来修改一下:
Html = RegExpText(Html,"javascript:sent_to_vb",";"" class=""i6"">")
'Html = Replace(html,"'济南'","")
Html = Replace(html,"'","")
Html = Replace(html,"(","")
Html = Replace(html,")","")

Response.write html

搞定!

天气预报就弄好了,不过事实中,有些情况可能replace函数是不适应的,比如我们想把某个字符串里面的所有连接都去掉.连接可能包括很多种类型,replace只能替代其中特定的一个,我们不可能用一个又一个对应的replace函数来替换吧?
但可以使用正则表达式来代替此项工作。这里不细谈了。

(一)如何将对方网站的翻页也处理成我们自己的呢?
答案是:利用replace函数和页面参数的传递。
例如对方页面里含有这样的翻页代码:"下一页",我们可以先利用上面讲的内容,获取这个字符串,然后用replace函数:RsBK=replace(RsBK," 然后再tou.asp的程序里获取Url的参数值,最后用采集技术获取下一页你想要的内容就可以了。
(二)如何将获取的内容入库
由于篇幅有限,这里简单说一下.
其实很简单:
将偷来的内容作一下处理,防止在写入数据库的时候出现sql注入错误,例如:replace(String,"'","''")
然后执行一个插入数据库操作的sql命令就ok了~
以上只是一些关于XMLHTTP组件的初级应用,实际上它还能实现的功能还有很多,比如说保存远程图片到本地服务器上,配合adodb.stream组件可以把获取来的数据保存进数据库。采集的作用和使用范围都很广。

下面给大家提供几个常用的函数。
'附送一些常用函数。
'附送1、移除掉获取的代码中的所有html标签,即<>闭合部分。
Function RemoveHTML(strHTML)
Dim objRegExp, Match, Matches
Set objRegExp = New Regexp
objRegExp.IgnoreCase = True
objRegExp.Global = True
'取闭合的<>
objRegExp.Pattern = "<.+?>"
'进行匹配
Set Matches = objRegExp.Execute(strHTML)
' 遍历匹配集合,并替换掉匹配的项目
For Each Match in Matches
strHtml=Replace(strHTML,Match.Value,"")
Next
RemoveHTML=strHTML
Set objRegExp = Nothing
End Function

'附送2、保存远程的文件到本地
'参 数:LocalFileName ------ 本地文件名
'参 数:RemoteFileUrl ------ 远程文件URL
Function SaveRemoteFile(LocalFileName,RemoteFileUrl)
SaveRemoteFile=True
dim Ads,Retrieval,GetRemoteData
Set Retrieval = Server.CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", RemoteFileUrl, False, "", ""
.Send
If .Readystate<>4 or .Status > 300 then
SaveRemoteFile=False
Exit Function
End If
GetRemoteData = .ResponseBody
End With
Set Retrieval = Nothing
'Response.Write(Round(LenB(GetRemoteData)/1024)) & "KB"
Set Ads = Server.CreateObject("A"&"dodb.St"&"ream") '这里之所以这么写,是为了防止被卡巴斯基误认为病毒删除掉!
With Ads
.Type = 1
.Open
.Write GetRemoteData
.SaveToFile server.MapPath(LocalFileName),2
.Cancel()
.Close()
End With
If Err.number<>0 then
SaveRemoteFile=False
Exit Function
Err.Clear
End If
Set Ads=nothing
end Function

附件下载:
upload/zdweb_20100104235100.rar

本文出自 栋力天空,转载时请注明出处及相应链接。

本文永久链接: http://www.dongsky.cn/show_1296.html

0

0条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    *请输入本文永久链接 show_1296.html 的数字部分

Ɣ回顶部