程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> 關於ASP編程 >> 小偷&小偷入庫&采集入庫

小偷&小偷入庫&采集入庫

編輯:關於ASP編程
XMLHTTP應用參考 
一、使用步驟: 
1、創建XMLHTTP對象 //需MSXML4.0支持 
2、打開與服務端的連接,同時定義指令發送方式,服務網頁(URL)和請求權限等。客戶端通過Open命令打開與服務端的服務網頁的連接。與普通HTTP指令傳送一樣,可以用"GET"方法或"POST"方法指向服務端的服務網頁。 
3、發送指令。 
4、等待並接收服務端返回的處理結果。 
5、釋放XMLHTTP對象 

二、XMLHTTP方法: 
1、XMLHTTP對象 
備注:客戶機可以使用XMLHTTP對象發送任意的HTTP請求,接受HTTP應答,還可以對應答的XML文檔進行解析。 

Open方法:初始化一個Msxml2.XMLHTTP請求,指定HTTP請求方式、URL以及鑒定信息。 
Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword ) 
bstrMethod: 數據傳送方式,即GET或POST。 
bstrUrl:   服務網頁的URL。 
varAsync:   是否同步執行。缺省為True,即同步執行,但只能在DOM中實施同步執行。用中一般將其置為False,即異步執行。 
bstrUser:   用戶名,可省略。 
bstrPassword:用戶口令,可省略。 

Send方法:發送HTTP請求到服務器,返回應答。 
語法: 
oXMLHttpRequest.send(varBody) 
說明:此方法是否同步取決於Open方法的varAsync參數。如果設為True則為同步,調用立刻返回,如果設為False調用直到整個應答被接收了才返回。 

setRequestHeader( bstrHeader, bstrvalue ) 
bstrHeader:HTTP 頭(header) 
bstrvalue: HTTP 頭(header)的值 

如果Open方法定義為POST,可以定義表單方式上傳: 
xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded") 

三、XMLHTTP屬性: 
onreadystatechange:在同步執行方式下獲得返回結果的事件句柄。只能在DOM中調用。 
responseBody:   結果返回為無符號整數數組。 
responseStream:   結果返回為IStream流。 
responseText :   結果返回為字符串。 
responseXML:   結果返回為XML格式數據。 

四、示例: 
< script language="javascript" > 
function getDatal(url){ 
  var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.4.0";//創建XMLHTTPRequest對象,需MSXML4.0支持 ["MSXML2.XMLHTTP.4.0","MSXML2.DOMDocument.4.0"] 
  xmlhttp.open("GET",url,false,"","";   //使用HTTP GET初始化HTTP請求 
  xmlhttp.send("";             //發送HTTP請求並獲取HTTP響應 
  return xmlhttp.responseXML;       //獲取XML文檔 

< /script > 


  現在網上流行的小偷程序比較多,有新聞類小偷,音樂小偷,下載小偷,那麼它們是如何做的呢,下面我來做個簡單介紹,希望對各位站長有所幫助。 
(一)原理 
小偷程序實際上是通過了XML中的XMLHTTP組件調用其它網站上的網頁。比如新聞小偷程序,很多都是調用了sina的新聞網頁,並且對其中的html進行了一些替換,同時對廣告也進行了過濾。用小偷程序的優點有:無須維護網站,因為小偷程序中的數據來自其他網站,它將隨著該網站的更新而更新;可以節省服務器資源,一般小偷程序就幾個文件,所有網頁內容都是來自其他網站。缺點有:不穩定,如果目標網站出錯,程序也會出錯,而且,如果目標網站進行升級維護,那麼小偷程序也要進行相應修改;速度,因為是遠程調用,速度和在本地服務器上讀取數據比起來,肯定要慢一些。 
(二)事例 

下面就XMLHTTP在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 

'2、轉換亂瑪,直接用xmlhttp調用有中文字符的網頁得到的將是亂瑪,可以通過adodb.stream組件進行轉換 
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 

'下面試著調用http://wmjie.51.net/swords的html內容 
Dim Url,Html 
Url="http://wmjie.51.net/swords/" 
Html = getHTTPPage(Url) 
Response.write Html 
%> 

------------------------------------------------------ 
代碼: 
'代碼]用XMLHTTP讀取遠程文件 

<% 
Response.Buffer = True 
Dim objXMLHTTP, xml 
Set xml = Server.CreateObject("Microsoft.XMLHTTP" 

xml.Open "GET", "http://wmjie.51.net/swords/diary.rar", False 

xml.Send 

' Add a header to give it a file name: 
Response.AddHeader "Content-Disposition", _ 
              "attachment;filename=mitchell-pres.zip" 

' Specify the content type to tell the browser what to do: 
Response.ContentType = "application/zip" 

' Binarywrite the bytes to the browser 
Response.BinaryWrite xml.responseBody 

Set xml = Nothing 
%> 



------------------------------------- 
如何寫ASP入庫小偷程序 
入庫小偷的原理也很簡單:就是用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_search?city="&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") 

'本程序中已經完成了替換的工作,如果有其他需要的話可以繼續進行類似的替換操作。 

response.write body 
引用: 遠程獲取內容,並將內容存在本地電腦上,包括任何文件 

<% 
'----------遠程獲取內容,並將內容存在本地電腦上,包括任何文件!---------- 
'On Error Resume Next 
'Set the content type to the specific type that you are sending. 
'Response.ContentType = "IMAGE/JPEG" 
'-------------------------------定義輸出格式----------------------------- 

Path=request.querystring("p") 
sPath = Path 
if left(lcase(path),7) <> "http://"; then 
'-------------如果前面沒有http就是本地文件,交給LocalFile處理------------ 
LocalFile(path) 
else 
'--------------------否則為遠程文件,交給RemoteFile處理------------------ 
RemoteFile(Path) 
end if 
'Response.Write err.Description 

sub LocalFile(Path) 
'-------------------如果為本地文件則簡單的跳轉到該頁面------------------- 
Response.Redirect Path 
End Sub 

Sub RemoteFile(sPath) 
'-------------------------處理遠程文件函數------------------------------ 
FileName = GetFileName(sPath) 
'-------------GetFileName為把地址轉換為合格的文件名過程------------- 
FileName = Server.MapPath("/UploadFile/Cache/" & FileName) 
Set objFso = Server.CreateObject("Scripting.FileSystemObject") 
'Response.Write fileName 
if objFso.FileExists(FileName) Then 
'--------------檢查文件是否是已經訪問過,如是,則簡單跳轉------------ 
Response.Redirect "/uploadfile/cache/" & GetFileName(path) 
Else 
'----------------否則的話就先用GetBody函數讀取---------------------- 
'Response.Write Path 
t = GetBody(Path) 
'-----------------用二進制方法寫到浏覽器上-------------------------- 
Response.BinaryWrite t 
Response.Flush 
'-----------------輸出緩沖------------------------------------------ 
SaveFile t,GetFileName(path) 
'------------------將文件內容緩存到本地路徑,以待下次訪問----------- 
End if 
Set objFso = Nothing 
End Sub 

Function GetBody(url) 
'-----------------------本函數為遠程獲取內容的函數--------------------- 
'on error resume next 
'Response.Write url 
Set Retrieval = CreateObject("Microsoft.XMLHTTP") 
'----------------------建立XMLHTTP對象----------------------------- 
With Retrieval 
.Open "Get", url, False, "", "" 
'------------------用Get,異步的方法發送----------------------- 
.Send 
'GetBody = .ResponseText 
GetBody = .ResponseBody 
'------------------函數返回獲取的內容-------------------------- 
End With 
Set Retrieval = Nothing 
'response.Write err.Description 
End Function 

Function GetFileName(str) 
'-------------------------本函數為合格化的文件名函數------------------- 
str = Replace(lcase(str),"http://";,"") 
str = Replace(lcase(str),"//","/") 
str = Replace(str,"/","") 
str = replace(str,vbcrlf,"") 
GetFileName = str 
End Function 

sub SaveFile(str,fName) 
'-------------------------本函數為將流內容存盤的函數------------------- 
'on error resume next 
Set objStream = Server.CreateObject("ADODB.Stream") 
'--------------建立ADODB.Stream對象,必須要ADO 2.5以上版本--------- 
objStream.Type = adTypeBinary 
'-------------以二進制模式打開------------------------------------- 
objStream.Open 
objstream.write str 
'--------------------將字符串內容寫入緩沖-------------------------- 
'response.Write fname 
objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite 
'--------------------將緩沖的內容寫入文件-------------------------- 
'response.BinaryWrite objstream.Read 
objstream.Close() 
set objstream = nothing 
'-----------------------關閉對象,釋放資源------------------------- 
'response.Write err.Description 
End sub 
%> 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved