zoukankan      html  css  js  c++  java
  • 小偷程序原理

    一般来说,我们做网站,数据都是在我们自己的数据库中的,但有些数据,我们不想也不能自己去收集数据,比如新闻\天气预报,(我们无法天天更新),所以我们就需要借助别人的网站来显示这些内容 。但如果直接链接到别人的网站,那就不是自己的站点了,所以我们通过xmlhttp对象来在后台把别人的网页内容载入到内存中,经过筛选,将别人的网页内容显示出来 ,这就是所谓的“小偷程序”。

    小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页,动态载入内存后,再对别人网页的内容进行分析过滤。所以,原则上只要别人网页上能显示出来的信息,你都可以使用(关于连接,一般的下载网站的连接你是截不到的,因为它进行了隐藏)。现在有很多新闻小偷程序,很多都是调用了sina的新闻网页,对其中的html进行了一些替换,同时对广告也进行过滤。除了新闻截取,你还可以利用小偷程序去截取一些别的信息,比如天气预报等。

    小偷程序的优点有:
    1、无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;
    2、可以节省服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。

    其缺点有:
    1、不稳定,如果目标网站出错,程序也会出错。目标网站进行升级维护,小偷程序也要进行相应修改;
    2、速度慢,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。

    小偷程序一般是使用xmlhttp组件来下载别人的网页,将别人的网页内容载到了你的内存中,再经过分析,过滤掉不需要的内容,最终实现按照自己的格式来显示内容。比如这个网页:http://www.itb2b.com.cn/thief/index.asp ,就是截取了新浪的内容。

    以下是小偷程序代码:
    <%
    '常用函数
    '1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
    function getHTTPPage(url)
    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")
    set http=nothing
    if err.number<>0 then err.Clear
    end function
    %>    

    换句话说,要做小偷程序,你必须了解xmlhttp组件的使用。微软提供的Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。

    XMLHTTP对象及其方法:
    创建XMLHTTP对象的语句如下:

    Set objXML = CreateObject("Msxml2.XMLHTTP")

    Set objXML = CreateObject(“Microsoft.XMLHTTP”)
    其中Set objXML = CreateObject("Msxml2.XMLHTTP")是最新的版本

    对象创建后调用Open方法对Request对象进行初始化,语法格式为:
    poster.open http-method, url, async, userID, password
    Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。
    参数的含义如下所示:  
    http-method: HTTP的通信方式,比如GET或是 POST
    url: 接收XML数据的服务器的URL地址。通常在URL中要指明ASP或CGI程序
    async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
    userID:用户ID,用于服务器身份验证
    password:用户密码,用于服务器身份验证

    比如,我们要调用百度的网页,我们可以:
    dim Http
    set Http=server.createobject("MSXML2.XMLHTTP")
    Http.open "GET","http://www.baidu.com",false
    Http.send()

    Send方法是用来发送XML数据的,用法如下:
    poster.send()  

    如果不用send来发参数,而你要调用的网页又要接收参数,可以这样简单处理
    dim Http
    set Http=server.createobject("MSXML2.XMLHTTP")
    Http.open "GET","http://要调用的网页?id=1&name=abc",false
    Http.send()
    Http.send()以后,xmlhttp对象会返回一个对象,这个对象里面就包含了所调用网页的内容,就象从浏览器里打开一样,只不过网页内容是在内存中,还没有显示出来。但在调用过程中可能会出错,所以XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。

    0 Response对象已经创建,但XML文档上载过程尚未结束
    1 XML文档已经装载完毕
    2 XML文档已经装载完毕,正在处理中
    3 部分XML文档已经解析
    4 文档已经解析完毕,客户端可以接受返回消息

    所以我们一般这样处理:
    dim Http
    set Http=server.createobject("MSXML2.XMLHTTP")
    Http.open "GET","http://要调用的网页?id=1&name=abc",false
    Http.send()
    '检查是否完成,readystate值为4说明载入完毕
    if Http.readystate<>4 then
       exit function
    end if  

    Http.send()后,经检测Http.readystate==4,说明载入完毕,这时网页内容已经载入到了Http.responseBody中了 ,但是如果是中文网页,Http.responseBody中会有乱码,这需要我们转换一下乱码 ,所以完整的调用是这样的:
    dim http
    set http=Server.createobject("Microsoft.XMLHTTP")
    Http.open "GET","你要调用的网址",false
    Http.send()
    if Http.readystate<>4 then '如果不等于4,说明出错了
       exit function
    end if
    getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")
    set http=nothing
    其中,bytesToBSTR是一个自己写的函数
    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

    所以,getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")表示,将Http.responseBody的内容按GB2312编码转换一下,放到getHTTPPage变量中。
    最后,你再对getHTTPPage变量进行分析,取出你想显示的数据就行了。

    需要注意的是,BytesToBstr函数中用到了adodb.stream组件,这需要你的服务器有执行它的权限。

    下面我们讲个实例,我们显示一下新浪的新闻。要想显示新浪的新闻,我们就要先找到新浪的新闻网址是什么。新浪有个动态新闻页网址:http://news.sina.com.cn/old1000/news1000_日期.shtml 。比如,我们要显示6月18日的新闻,就输入
    http://news.sina.com.cn/old1000/news1000_20050618.shtml ,打开网页你会发现是一个新闻列表,下面我们就要分析一下它的结构,右键查看源代码。里面很乱,但你可以找到<!--新闻开始-->和<!--新闻结束-->,中间的内容就是列表的内容。好了,也就是我说,我们想显示6月18号的新闻,就这样调用:
    dim http
    set http=Server.createobject("Microsoft.XMLHTTP")
    Http.open "GET","http://news.sina.com.cn/old1000/news1000_20050618.shtml",false
    Http.send()
    if Http.readystate<>4 then
       exit function
    end if
    getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")
    set http=nothing
    start=Instr(wstr,"<!--新闻开始-->")
    over=Instr(wstr,"<!--新闻结束-->")
    wstr=mid(wstr,start+11,over-start-11)

    这样wstr就是新闻列表的内容。为什么start+11和over-start-11呢?因为<!--新闻开始-->和<!--新闻结束-->都是11的长度。wstr取出来后,还要进行分析,把它的网址链接替换成你的链接,把不必要的字符过滤掉,这个工作很烦琐,你可以用replace或者用正则表达式来替换,比如:
    wstr=replace(wstr,"href=""","href=""show.asp?url=")
    wstr=replace(wstr,"<ul>","")
    wstr=trim(replace(wstr,"</ul>","")) '完成对页面内容的截取加工
    wstr=Replace(wstr,"http://news.sina.com.cn","NewsNews")
    wstr=Replace(wstr,"http://tech.sina.com.cn","TechNews")
    wstr=Replace(wstr,"http://sports.sina.com.cn","SportsNews")
    wstr=Replace(wstr,"http://ent.sina.com.cn","EntNews")
    wstr=Replace(wstr,"http://eladies.sina.com.cn","EladiesNews")
    wstr=Replace(wstr,"http://jczs.sina.com.cn","jczs")
    wstr=Replace(wstr,"http://auto.sina.com.cn","AutoNews")
    wstr=Replace(wstr,"http://finance.sina.com.cn","FinanceNews")
    wstr=Replace(wstr,"http://www.eladies.com.cn","wwwEladies")

  • 相关阅读:
    HDU 2955 Robberies(01背包)
    HDU 2602 Bone Collector(01背包)
    HUST 1352 Repetitions of Substrings(字符串)
    HUST 1358 Uiwurerirexb jeqvad(模拟解密)
    HUST 1404 Hamming Distance(字符串)
    HDU 4520 小Q系列故事――最佳裁判(STL)
    HDU 2058 The sum problem(枚举)
    【破解】修改程序版权、添加弹窗
    HDU 1407 测试你是否和LTC水平一样高(枚举)
    HDU 1050 Moving Tables(贪心)
  • 原文地址:https://www.cnblogs.com/seerlin/p/1117988.html
Copyright © 2011-2022 走看看