本日志标题:偷也是门技术——浅谈XMLHTTP应用:新闻小偷        [2005-7-26]

本文参考互联网整理而成(在此感谢资料奉献者)。希望本文尽量系统,尽量易懂。

偷,即无劳而获。在网络上,诸如某大型权威站点发布了新闻,而自己的小小站点也想与时俱进,和人家一样同步更新,多N啊。于是,偷就是最好的办法了。偷是不道德的,不鼓励偷,但又不提倡不偷,都是技术惹的祸,扯远了~!

小偷程序是什么?

其实是通过XML中的XMLHTTP对象调用其它网站上的网页,甚至可以将接受的HTML代码进行过滤以获得需要内容(比如提取某某气象站,不可能是将整站提取显示,而只是需要显示天气的那部分)。

其实就是一个寄生虫嘛,适合该网站的小偷程序已经唯一确定了,则只要该站点不改版替换相关主要内容,则永远偷下去。否则,就需要相应的修改小偷程序了。btw,在小胖的PUBCMS中已定义为爬虫,我想意思也差不多了:P

那么如何偷呢?看过XMLHTTP介绍的应该了解些。

先定义了一个函数,解释在函数中:


<%
Function getHTTPPage(url)
    dim objXML
    set objXML=server.createobject("MSXML2.XMLHTTP")'定义
    objXML.open "GET",url,false'打开
    objXML.send()'发送
    If objXML.readystate<>4 then '判断文档是否已经解析完,以做客户端接受返回消息
        exit function
    End If
    getHTTPPage=BytesToBstr(objXML.responseBody)'返回信息,同时用函数定义编码
    'getHTTPPage=bytes2BSTR(objXML.responseBody)'或者返回信息时用函数转换汉字
    set objXML=nothing'关闭
    if err.number<>0 then err.Clear
End Function
%>


接着就来看看定义编码函数BytesToBstr()的主要内容


<%
Function BytesToBstr(body)
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 = "GB2312"
    '转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP调用有中文字符的网页得到的将是乱码
    BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
%>


当然,还可以使用专门的函数来处理汉字:


Function bytes2BSTR(vIn)
strReturn = ""
For j = 1 To LenB(vIn)
    ThisCharCode = AscB(MidB(vIn,j,1))
    If ThisCharCode < &H80 Then
        strReturn = strReturn & Chr(ThisCharCode)
    Else
        NextCharCode = AscB(MidB(vIn,j+1,1))
        strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
        j = j + 1
    End If
Next
bytes2BSTR = strReturn
End Function


lenB返回字节数而不是字符数,同理ascB返回每个字节的ascii码,大于80h,也就是128的ascii是汉字——半个汉字,把半个半个的汉字ascii码拼合再用chr函数返回字符就可以了。

应用则如下:


<%
Dim Url,Html
Url = "http://www.cnbruce.com/blog"
Html = getHTTPPage(Url)
response.write(Html)
%>


即表示对 http://www.cnbruce.com/blog 的内容进行“偷”行为,返回了相关该站的内容。

拷贝下列内容保持为ASP文件进行调试

[Ctrl+A 全部选择进行拷贝 提示:可先修改部分代码,再点击运行]

这样一个页就被“偷”下来了。同时,注意到返回的信息中,有的图片不能显示,样式也不能连接,如要正常,则需要将返回的信息做过滤和调整。

那么该如何提取有用的返回信息,做过滤和调整呢?

[Edit on 2005-7-27 1:44:47 By cnbruce]

在百度搜索完整的偷也是门技术——浅谈XMLHTTP应用:新闻小偷内容,或者用Google搜索相关的更多内容

By [cnbruce] at 1:21:25 | 评论 [59] | 浏览 [40588] | TrackBack| 返回顶部

About Comments
其实现在很多应用随着RSS的流行已经不需要去偷了。
By [宇义] at 2005-7-27 9:28:35
没有RSS咋办?
By [gus] at 2005-7-27 10:10:21
布鲁丝大大 我是看你的教程漫漫成长的 再次表示感谢
现在做购物车遇到一些麻烦 说也不好说 看您能否抽时间写购物车教程呀 谢谢先
By [度得] at 2005-8-1 14:32:20
班主有没有在啊,我看了你的一个文章分页代码看不懂,想向你请教能否说一下啊。
By [k123456] at 2005-8-2 7:26:55
haha 又一次项目比较紧 自己偷自己的网站
一天半就弄个新网站 出来 爽啊
而且免维护的
By [dreamisokbaby] at 2005-8-8 10:46:31
为什么程序上传到服务器后,一天只能执行一次呢?
有什么方法解结呢?
By [HNR] at 2005-8-30 22:02:25
我用csDrawGraphTrial.Draw做一个柱状图和圆饼图,在本地运行就可以,传到服务器后,就无法显示汉字了.请教狼哥,是怎么回事?
程序如下:
chartdemo.asp
<%@ language=vbscript %>
<html>
<head>
<title>csDrawGraph Demonstration</title>
<style type="text/css">
<!--
.style6 {color: #3399CC}
body,td,th {
    font-family: Arial, Helvetica, sans-serif;
}
-->
</style>
<meta http-equiv="Content-Type" content="text/html; charset=hz-gb-2312"></head>
<body bgcolor="#FFFFFF">
<P align="center"><IMG src="chartimages.asp?Type=Bar" width="400" height="300">
</P>

<span class="style6"></span>
<P align="center"><IMG src="chartimages.asp?Type=Pie" width="400" height="300">
</P>
</body>
</html>

chartimages.asp:
<style type="text/css">
<!--
h1,h2,h3,h4,h5,h6 {
    font-family: Arial, Helvetica, sans-serif;
}
body,td,th {
    font-family: Arial, Helvetica, sans-serif;
}
-->
</style><%@ language=vbscript CODEPAGE="936"%>

<%
Response.Expires = 0
Response.Buffer = true
Response.Clear
Response.ContentType = "Image/Gif"
Set Chart = Server.CreateObject("csDrawGraphTrial.Draw")

set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("bzdbf.mdb")
exec="select * from dygztj where 编号=1"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
ybgz=rs("yb")
dzhd=rs("hd")
zjxt=rs("zj")
cx=rs("cx")
bk=rs("bk")
tk=rs("tk")
other=rs("other")
hard=rs("yj")
line=rs("xl")
rs.close
conn.close
set conn=nothing


Chart.AddData "常见l", ybgz, "ff0000"
Chart.AddData "hd", dzhd, "00ff00"
Chart.AddData "zj", zjxt, "0000ff"
Chart.AddData "cx", cx, "CCCC33"
Chart.AddData "bk", bk, "FFFF66"
Chart.AddData "tk", tk, "CC00FF"
Chart.AddData "other", other, "009933"
Chart.AddData "yj", hard, "FF9900"
Chart.AddData "xl", line, "3399CC"

If Request.QueryString("Type") = "Pie" Then
' Chart.Title = "故障柱状分布图"
Chart.BGColor = "eeeeee"
Chart.LabelBGColor = "eeeeee"
Chart.TitleBGColor = "eeeeee"
Response.BinaryWrite Chart.GifPie
Else
' Chart.Title = "故障圆饼分布图"
Response.BinaryWrite Chart.GifBar
End If

Response.End
%>

By [依风小妹] at 2005-8-31 9:35:47
hi,bruce,为什么没有下文呢?

"那么该如何提取有用的返回信息,做过滤和调整呢?"

By [hi] at 2005-10-15 18:31:51
ASP用XMLHTTP“偷”网页对网络带宽的要求太高了,速度稍微不行,整个服务器就会暂停。要是有多线程的就好了
By [tdk84e] at 2005-11-14 23:04:59
请教狼哥!
如果提取的信息是
<font size=2>
123456789
<font>
那么接下来怎么样只提取 "123456789" 呢?其他的内容不要!
[Edit on 2005-11-28 15:16:11 By yeeho]
By [yeeho] at 2005-11-28 15:12:06
http://www.dianping.com/????怎么不行
By [elylm] at 2005-12-30 9:49:53
[img]smile/face8.gif[/i
By [d] at 2006-2-22 15:31:26
谢谢你的代码,让我找到的正确的方向可以解决问题,谢谢~~~~~~~~
By [aminic] at 2006-8-30 4:44:26
谢谢楼主的帖子,学习了。
By [猛男一号] at 2009-6-2 22:31:08


Post a Comment
呢称: 验证码: 
禁止笑脸转换 禁止UBB | 缩放输入框:6 5 | [Ctrl+Enter提交](1000个字符限制)