本文從一個ASP程式員的角度用大量執行個體祥細介紹了動態網站如何產生靜態頁面原理,又從一個採集程式開發人員的角度去祥細介紹了網站資料擷取的原理及功防策略。
關於網站產生靜態頁面,為了讓本文讀者容易理解,文內列舉了目前常用的多種產生靜態頁面的方法,其中用了很多的執行個體代碼進行說明。
關於網站資料擷取攻防,作者本身是一個採集程式的開發人員,同時作者也收集研究了多種採集程式,列舉了目前國內比較流行的幾種防採集策略,並對每種策略作了簡單客觀的分析評價,希望能給廣大站長們提供一些協助。此章節也把作者原創的防採集方法奉獻給大家,目地是為了讓大家瞭解,防採集,不防搜尋引擎,是可行的,有效。
聲明:希望各位朋友轉載時,不要把原有作者著作權去掉,謝謝合作。
由於本人寫作水平有限,寫的不好的地方,還請大家多多包涵,如要批評或意見,請加我QQ。
目前很多人都開始注重動態網頁面產生HTML頁了,但選擇哪種產生HTML的方法和防採集卻不防搜尋引擎的問題卻經常困擾大家。解決此問題則是本文產生的原因。
首先祥細說一下常用的幾種產生HTML的方法:
產生HTML方法主要步驟只有兩個:
一、擷取要產生的html檔案的內容
二、將擷取的html檔案內容儲存為html檔案
我在這裡主要說明的只是第一步:如何擷取要產生的html檔案的內容:
目前常用擷取html檔案的內容的方法有幾下幾種:
1、str="<html標記>內容</html標記>"
str=str&"內容資料庫讀取內容........."
這種方法與是在指令碼內寫要產生的html內容,不太方便預覽產生頁面的內容,無法可視化布局頁面,更改html模板時會更加複雜。
用這種方法的人很多,但我感覺這種方法是最不方便的。
2、製作單獨的HTML模板頁,動態內容用特定的字元作為標記(如:有人用$title$標記為網頁標題),用ADODB.Stream或者 Scripting.FileSystemObject將其模板內容載入,然後再用替換方法把原先定好的標記替換為動態內容(如:Replace(載入的模板內容,"$title$",rs("title" ) ) )。
3、用XMLHTTP或serverXMLHTTP擷取動態網頁所顯示的HTML內容。
我常用的產生html檔案的執行個體:
’-----------------翟振愷(小琦)
’weburl是要擷取的動態網頁地址
’getHTTPPage(weburl)是擷取動態網頁內容的函數
weburl="http://"&Request.ServerVariables("SERVER_NAME")&"/contact.asp?id="&rs("id")&""‘指定動態網頁地址
body=getHTTPPage(weburl)’用函數取到動態網頁地址的內容
’-----------------翟振愷(小琦)
此方法最大的好處就是不用費力氣專門去寫靜態模板頁面,只是將原來就有的動態網頁面轉換為HTML靜態頁面,但產生速度不是太快。
我常用的產生HTML的方法就是第3種:用XMLHTTP擷取動態網頁產生的HTML內容,再用ADODB.Stream或者Scripting.FileSystemObject儲存成html檔案。
第二步是組建檔案的方法:
ASP裡常用的有用ADODB.Stream組建檔案和Scripting.FileSystemObject組建檔案兩種
1、Scripting.FileSystemObject組建檔案方法:
CODE:[Copy to clipboard]’-----------------翟振愷(小琦)
Set fso = CreateObject("Scripting.FileSystemObject")
File=Server.MapPath("要組建檔案路徑和檔案名稱.htm")
Set txt=fso.OpenTextFile(File,8,True)
data1="檔案內容"用WriteLine方法組建檔案
txt.WriteLine data1
data2="檔案內容"’用Write方法組建檔案
txt.Write data2
txt.Close
txt.fso
’-----------------翟振愷(小琦)
2、ADODB.Stream組建檔案方法:
Dim objAdoStream
set objAdoStream = Server.createObject("ADODB.Stream")
objAdoStream.Type = 1
objAdoStream.Open()
objAdoStream.Write("檔案內容")
objAdoStream.SaveToFile 要組建檔案路徑和檔案名稱.htm,2
objAdoStream.Close()
’-----------------翟振愷(小琦)
再說一下我對HTML防採集卻不防搜尋引擎蜘蛛的一些經驗:
我開發過幾個採集程式,也研究過很多採集程式碼,所以對採集程式的原理還算是稍微有些瞭解。
先說一下採集原理:
採集程式的主要步驟如下:
一、擷取被採集的頁面的內容
二、從擷取代碼中提取所有用的資料
一、擷取被採集的頁面的內容
我目前所掌握的ASP常用擷取被採集的頁面的內容方法:
1、用serverXMLHTTP組件擷取資料
’-----------------翟振愷(小琦)
’建立對象
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組件擷取資料
CODE:[Copy to clipboard]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地址)
這樣擷取的資料內容還需要進行編碼轉換才可以使用
CODE:[Copy to clipboard]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函數截取需要的資料
CODE:[Copy to clipboard]Function body(wstr,start,over)
’-----------------翟振愷(小琦)
start=Newstring(wstr,start)
’設定需要處理的資料的唯一的開始標記
over=Newstring(wstr,over)
’和start相對應的就是需要處理的資料的唯一的結束標記
body=mid(wstr,start,over-start)
’設定顯示頁面的範圍
’-----------------翟振愷(小琦)
End Function
調用方法:body(被採集的頁面的內容,開始標記,結束標記)
2、用正則擷取需要的資料
CODE:[Copy to clipboard]Function body(wstr,start,over)
’-----------------翟振愷(小琦)
Set xiaoqi = New Regexp’設定設定物件
xiaoqi.IgnoreCase = True’忽略大小寫
xiaoqi.Global = True’設定為全文檢索搜尋
xiaoqi.Pattern = "”&start&“.+?”&over&“"’Regex
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串連集合
CODE:[Copy to clipboard]’-----------------翟振愷(小琦)
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標記,我們可以根據這些有規則的標記提取需要的各個部分的內容。
如:
每個頁面都有網頁標題,用我上面寫的MID截取函數就可以獲得之間的值,也可以用Regex來獲得。
例:body("","")
介紹完採集器的祥細原理後,就開始說一下防採集的策略。
目前防採集的方法有很多種,先介紹一下常見防採集策略方法和它的弊端及採集對策:
一、判斷一個IP在一定時間內對本站頁面的訪問次數,如果明顯超過了正常人瀏覽速度,就拒絕此IP訪問
弊端:
1、此方法只適用於動態網頁面,如:asp\jsp\php等...靜態頁面無法判斷某個IP一定時間訪問本站頁面的次數
2、此方法會嚴重影響搜尋引擎蜘蛛對其收錄,因為搜尋引擎蜘蛛收錄時,瀏覽速度都會比較快而且是多線程。此方法也會拒絕搜尋引擎蜘蛛收錄站內檔案
採集對策:只能放慢採集速度,或者不採
建議:做個搜尋引擎蜘蛛的IP庫,只允許搜尋引擎蜘蛛快速探索站內內容。搜尋引擎蜘蛛的IP庫的收集,也不太容易,一個搜尋引擎蜘蛛,也不一定只有一個固定的IP地址。
評論:此方法對防採集比較有效,但卻會影響搜尋引擎對其收錄。
二、用javascript加密內容頁面
弊端:此方法適用於靜態頁面,但會嚴重影響搜尋引擎對其收錄情況,搜尋引擎收到到的內容,也都是加密後的內容
採集對策:建議不採,如非要采,就把解密碼的JS指令碼也採下來。
建議:目前沒有好的改良建議
評論:建議指望搜尋引擎帶流量的站長不要使用此方法。
三、把內容頁面裡的特定標記替換為”特定標記+隱藏著作權文字“
弊端:此方法弊端不大,僅僅會增加一點點的分頁檔大小,但容易反採集
採集對策:把採集來的含有隱藏著作權文字內容的著作權文字替掉,或替換成自己的著作權。
建議:目前沒有好的改良建議
評論:自己感覺實用價值不大,就算是加上隨機的隱藏文字,也等於畫蛇添足。
四、只允許使用者登陸後才可以瀏覽
弊端:此方法會嚴重影響搜尋引擎蜘蛛對其收錄
採集對策:目前落伍已經有人發了對策文章 ,具體對策就看這個吧《ASP小偷程式如何利用XMLHTTP實現表單的提交以及cookies或session的發送》
建議:目前沒有好的改良建議
評論:建議指望搜尋引擎帶流量的站長不要使用此方法。不過此方法防一般的採集程式,還是有點效果的。
五、用javascript、vbscript指令碼做分頁
弊端:影響搜尋引擎對其收錄
採集對策:分析javascript、vbscript指令碼,找出其分頁規則,自己做個對應此站的分頁集合頁即可。
建議:目前沒有好的改良建議
評論:感覺懂點指令碼語言的人都能找出其分頁規則
六、只允許通過本站頁面串連查看,如:Request.ServerVariables("HTTP_REFERER")
弊端:影響搜尋引擎對其收錄
採集對策:不知道能不能類比網頁來源。。。。目前我沒有對應此方法的採集對策
建議:目前沒有好的改良建議
評論:建議指望搜尋引擎帶流量的站長不要使用此方法。不過此方法防一般的採集程式,還是有點效果的。
從以上可以看出,目前常用的防採集方法,要麼會對搜尋引擎收錄有較大影響,要麼防採集效果不好,起不到防採集的效果。那麼,還有沒有一種有效防採集,而又不影響搜尋引擎收錄的方法呢?那就請繼續往下看吧,精彩的地方馬上呈獻給大家。
下面就是我的防採集策略,防採集而又不防搜尋引擎
從前面的我講的採集原理大家可以看出,絕大多數採集程式都是靠分析規則來進行採集的,如分析分頁檔案名稱規則、分析頁面代碼規則。
一、分頁檔案名稱規則防採集對策
大部分採集器都是靠分析分頁檔案名稱規則,進行批量、多頁採集的。如果別人找不出你的分頁檔案的檔案名稱規則,那麼別人就無法對你的網站進行批量多頁採集。
實現方法:
我認為用MD5加密分頁檔案名稱是一個比較好的方法,說到這裡,有人會說,你用MD5加密分頁檔案名稱,別人根據此規則也可以類比你的加密規則得到你的分頁檔案名稱。
我要指出的是我們加密分頁檔案名稱時,不要只加密檔案名稱變化的部分
如果I代表分頁的頁碼,那麼我們不要這樣加密
page_name=Md5(I,16)&".htm"
最好給要加密的頁碼上再跟進一個或多個字元,如:page_name=Md5(I&"任意一個或幾個字母",16)&".htm"
因為MD5是無法反解密的,別人看到的會頁字母是MD5加密後的結果,所以加人也無法知道你在 I 後面跟進的字母是什麼,除非他用暴力****MD5,不過不太現實。
二、頁面代碼規則防採集對策
如果說我們的內容頁面無代碼規則,那麼別人就無法從你的代碼中提取他們所需要的一條條內容。
所以我們要的這一步做到防採集,就要使代碼無規則。
實現方法:
使對方需要提取的標記隨機化
1、定製多個網頁模板,每個網頁模板裡的重要HTML標記不同,呈現頁面內容時,隨機選取網頁模板,有的頁面用CSS+DIV布局,有的頁面用 table布局,此方法是麻煩了點,一個內容頁面,要多做幾個模板頁面,不過防採集本身就是一件很煩瑣的事情,多做一個模板,能起到防採集的作用,對很多人來說,都是值得的。
2、如果嫌上面的方法太麻煩,把網頁裡的重要HTML標記隨機化,也可以。
做的網頁模板越多,html代碼越是隨機化,對方分析起內容代碼時,就越麻煩,對方針對你的網站專門寫採集策略時,難度就更大,在這個時候,絕大部分人,都會知難而退,因為這此人就是因為懶,才會採集別人網站資料嘛~~~再說一下,目前大部分人都是拿別人開發的採集程式去採集資料,自己開發採集程式去採集資料的人畢竟是少數。
還有些簡單的思路提供給大家:
1、把對資料擷取者重要,而對搜尋引擎不重要的內容用用戶端指令碼顯示
2、把一頁資料,分為N個頁面顯示,也是加大採集難度的方法
3、用更深層的串連,因為目前大部分採集程式只能採集到網站內容的前3層,如果內容所在的串連層更深,也可以避免被採集。不過這樣可能會給客戶造成瀏覽上的不便。
如:
大多網站都是 首頁----內容索引分頁----內容頁
如果改成:
首頁----內容索引分頁----內容頁入口----內容頁
註:內容頁入口最好能加上自動轉入內容頁的代碼
其實,只要做好防採集的第一步(加密分頁檔案名稱規則),防採集的效果就已經不錯了,還是建議兩條反採集方法同時使用,給採集者增加採集難度,使得他們知難頁退。