本文參考互聯網整理而成(在此感謝資料奉獻者)。希望本文盡量系統,盡量易懂。
偷,即無勞而獲。在網絡上,諸如某大型權威站點發布了新聞,而自己的小小站點也想與時俱進,和人家一樣同步更新,多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文件進行調試
<%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)'返回信息,同時用函數定義編碼 set objXML=nothing'關閉 if err.number<>0 then err.Clear End FunctionFunction BytesToBstr(body)dim objstreamset 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.Closeset obJStream = nothingEnd FunctionDim Url,HtmlUrl = "http://www.cnbruce.com/blog"Html = getHTTPPage(Url)response.write(Html)%> [Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
這樣一個頁就被“偷”下來了。同時,注意到返回的信息中,有的圖片不能顯示,樣式也不能連接,如要正常,則需要將返回的信息做過濾和調整。
那麼該如何提取有用的返回信息,做過濾和調整呢?