我開發過幾個採集程序,也研究過很多採集程序代碼,所以對採集程序的原理還算是稍微了解。先說一下採集原理:
採集程序的主要步驟如下:
一、取得被採集的頁面的內容
二、從取得程式碼中提取所有用的數據
一、取得被採集的頁面的內容
我目前所掌握的ASP常用來取得被擷取的頁面的內容方法:
1.用serverXMLHTTP元件取得數據
複製代碼代碼如下:
Function GetBody(weburl)
'創建對象
Dim ObjXMLHTTP
Set ObjXMLHTTP=Server.CreateObject(MSXML2.serverXMLHTTP)
'請求文件,以非同步形式
ObjXMLHTTP.Open GET,weburl,False
ObjXMLHTTP.send
While ObjXMLHTTP.readyState <> 4
ObjXMLHTTP.waitForResponse 1000
Wend
'得到結果
GetBody=ObjXMLHTTP.responseBody
'釋放對象
Set ObjXMLHTTP=Nothing
End Function
調用方法:
GetBody(檔案的URLf地址)
2、或XMLHTTP組件取得數據
複製代碼代碼如下:
Function GetBody(weburl)
'創建對象
Set Retrieval = CreateObject(Microsoft.XMLHTTP)
With Retrieval
.Open Get, weburl, False, ,
.Send
GetBody = .ResponseBody
End With
'釋放對象
Set Retrieval = Nothing
End Function
調用方法:
GetBody(檔案的URLf地址)
這樣取得的資料內容還需要進行編碼轉換才可以使用
複製代碼代碼如下:
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
呼叫方法:BytesToBstr(要轉換的資料,編碼)'編碼常用為GB2312和UTF-8
二、從取得程式碼中提取所有用的數據
目前我掌握的方法有:
1.用ASP內建的MID函數截取所需的數據
複製代碼代碼如下:
Function body(wstr,start,over)
start=Newstring(wstr,start)
'設定需要處理的資料的唯一的開始標記
over=Newstring(wstr,over)
'和start相對應的就是需要處理的資料的唯一的結束標記
body=mid(wstr,start,over-start)
'設定顯示頁面的範圍
End Function
呼叫方法:body(被採集的頁面的內容,開始標記,結束標記)
2、用正規取得所需的數據
複製代碼代碼如下:
Function body(wstr,start,over)
Set xiaoqi = New Regexp'設定配置對象
xiaoqi.IgnoreCase = True'忽略大小寫
xiaoqi.Global = True'設定為全文搜索
xiaoqi.Pattern = &start&.+?&over&'正規表示式
Set Matches =xiaoqi.Execute(wstr)'開始執行配置
set xiaoqi=nothing
body=
For Each Match in Matches
body=body&Match.Value '循環匹配
Next
End Function
呼叫方法:body(被採集的頁面的內容,開始標記,結束標記)
採集程序祥細思路:
1、取得網站的分頁清單頁的每頁網址
目前絕大部分動態網站的分頁位址都有規則,如:
動態頁
第一頁:index.asp?page=1
第二頁:index.asp?page=2
第三頁:index.asp?page=3
.....
靜態頁
第一頁:page_1.htm
第二頁:page_2.htm
第三頁:page_3.htm
.....
取得網站的分頁清單頁的每頁位址,只需要用變數取代每頁位址的變化的字元即可如:page_<%=&page&%>.htm
2、取得被採集網站的分頁清單頁內容
3.從分頁清單代碼中提取被採集的內容頁面的URL連接位址
絕大部分分頁頁面的內容頁連結也有固定規則,如:
<a href=url1>連接1</a> <br>
<a href=url2>連接2</a> <br>
<a href=url3>連接3</a> <br>
用以下程式碼就可以獲得一個URL連線集合
複製代碼代碼如下:
Set xiaoqi = New Regexp
xiaoqi.IgnoreCase = True
xiaoqi.Global = True
xiaoqi.Pattern = .+?
Set Matches =xiaoqi.Execute(頁面清單內容)
set xiaoqi=nothing
url=
For Each Match in Matches
url=url&Match.Value
Next
4.取得被採集的內容頁面內容,根據提取標記從被採集的內容頁面分別截取要取得的數據
因為是動態產生的頁面,大多數內容頁面內都有相同的html標記,我們可以根據這些有規則的標記來提取需要的各個部分的內容。
如:
每個頁面都有網頁標題<title>網頁標題</title>,用我上面寫的MID截取函數就可以獲得<title></title>之間的值,也可以用正規表示式來取得。
範例:body(<title>網頁標題</title>,<title>,</title>)