生成HTML方法主要步驟只有兩個(gè):
一、獲取要生成的html文件的內(nèi)容 二、將獲取的html文件內(nèi)容保存為html文件
我在這里主要說(shuō)明的只是第一步:如何獲取要生成的html文件的內(nèi)容:
目前常用獲取html文件的內(nèi)容的方法有幾下幾種:
1、這種方法與是在腳本內(nèi)寫要生成的html內(nèi)容,不太方便預(yù)覽生成頁(yè)面的內(nèi)容,無(wú)法可視化布局頁(yè)面,更改html模板時(shí)會(huì)更加復(fù)雜。用這種方法的人很多,但我感覺這種方法是最不方便的。
str="<html標(biāo)記>內(nèi)容</html標(biāo)記>" str=str&"<html標(biāo)記>內(nèi)容</html標(biāo)記><html標(biāo)記>數(shù)據(jù)庫(kù)讀取內(nèi)容....</html標(biāo)記>....."
2、制作單獨(dú)的HTML模板頁(yè),動(dòng)態(tài)的內(nèi)容用特定的字符作為標(biāo)記(如:有人用$title$標(biāo)記為網(wǎng)頁(yè)標(biāo)題),用ADODB.Stream或者Scripting.FileSystemObject將其模板內(nèi)容載入,然后再用替換方法把原先定好的標(biāo)記替換為動(dòng)態(tài)內(nèi)容(如:Replace(載入的模板內(nèi)容,"$title$",rs("title" ) ) )。
3、用XMLHTTP或serverXMLHTTP獲取動(dòng)態(tài)頁(yè)所顯示的HTML內(nèi)容:
我常用的生成html文件的實(shí)例: ‘-----------------翟振愷(小琦) ‘weburl是要獲取的動(dòng)態(tài)頁(yè)地址 ‘getHTTPPage(weburl)是獲取動(dòng)態(tài)頁(yè)內(nèi)容的函數(shù) weburl="http://"&Request.ServerVariables("SERVER_NAME")&"/contact.asp?id="&rs("id")&""‘指定動(dòng)態(tài)頁(yè)地址 body=getHTTPPage(weburl)‘用函數(shù)取到動(dòng)態(tài)頁(yè)地址的內(nèi)容 ‘-----------------翟振愷(小琦)
此方法最大的好處就是不用費(fèi)力氣專門去寫靜態(tài)的模板頁(yè)面,只是將原來(lái)就有的動(dòng)態(tài)頁(yè)面轉(zhuǎn)換為HTML靜態(tài)頁(yè)面,但生成速度不是太快。
我常用的生成HTML的方法就是第3種:用XMLHTTP獲取動(dòng)態(tài)頁(yè)生成的HTML內(nèi)容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件。
第二步是生成文件的方法:
ASP里常用的有用ADODB.Stream生成文件和Scripting.FileSystemObject生成文件兩種:
1、Scripting.FileSystemObject生成文件方法:
‘-----------------翟振愷(小琦) Set fso = CreateObject("Scripting.FileSystemObject") File=Server.MapPath("要生成文件路徑和文件名.htm") Set txt=fso.OpenTextFile(File,8,True) data1="文件內(nèi)容"用WriteLine方法生成文件 txt.WriteLine data1 data2="文件內(nèi)容"‘用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("文件內(nèi)容") objAdoStream.SaveToFile 要生成文件路徑和文件名.htm,2 objAdoStream.Close() ‘-----------------翟振愷(小琦)
采集原理:
采集程序的主要步驟如下:
一、獲取被采集的頁(yè)面的內(nèi)容 二、從獲取代碼中提取所有用的數(shù)據(jù)
一、獲取被采集的頁(yè)面的內(nèi)容
我目前所掌握的ASP常用獲取被采集的頁(yè)面的內(nèi)容方法:
1、用serverXMLHTTP組件獲取數(shù)據(jù)
Function GetBody(weburl) ‘-----------------翟振愷(小琦) ‘創(chuàng)建對(duì)象 Dim ObjXMLHTTP Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP") ‘請(qǐng)求文件,以異步形式 ObjXMLHTTP.Open "GET",weburl,False ObjXMLHTTP.send While ObjXMLHTTP.readyState <> 4 ObjXMLHTTP.waitForResponse 1000 Wend ‘得到結(jié)果 GetBody=ObjXMLHTTP.responseBody ‘釋放對(duì)象 Set ObjXMLHTTP=Nothing ‘-----------------翟振愷(小琦) End Function
調(diào)用方法:GetBody(文件的URLf地址)
2、或XMLHTTP組件獲取數(shù)據(jù)
Function GetBody(weburl) ‘-----------------翟振愷(小琦) ‘創(chuàng)建對(duì)象 Set Retrieval = CreateObject("Microsoft.XMLHTTP") With Retrieval .Open "Get", weburl, False, "", "" .Send GetBody = .ResponseBody End With ‘釋放對(duì)象 Set Retrieval = Nothing ‘-----------------翟振愷(小琦) End Function
調(diào)用方法:GetBody(文件的URLf地址)
這樣獲取的數(shù)據(jù)內(nèi)容還需要進(jìn)行編碼轉(zhuǎn)換才可以使用
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
調(diào)用方法:BytesToBstr(要轉(zhuǎn)換的數(shù)據(jù),編碼)‘編碼常用為GB2312和UTF-8。
二、從獲取代碼中提取所有用的數(shù)據(jù)
1、用ASP內(nèi)置的MID函數(shù)截取需要的數(shù)據(jù)
Function body(wstr,start,over) ‘-----------------翟振愷(小琦) start=Newstring(wstr,start) ‘設(shè)置需要處理的數(shù)據(jù)的唯一的開始標(biāo)記 over=Newstring(wstr,over) ‘和start相對(duì)應(yīng)的就是需要處理的數(shù)據(jù)的唯一的結(jié)束標(biāo)記 body=mid(wstr,start,over-start) ‘設(shè)置顯示頁(yè)面的范圍 ‘-----------------翟振愷(小琦) End Function
調(diào)用方法:body(被采集的頁(yè)面的內(nèi)容,開始標(biāo)記,結(jié)束標(biāo)記)
2、用正則獲取需要的數(shù)據(jù)
Function body(wstr,start,over) ‘-----------------翟振愷(小琦) Set xiaoqi = New Regexp‘設(shè)置配置對(duì)象 xiaoqi.IgnoreCase = True‘忽略大小寫 xiaoqi.Global = True‘設(shè)置為全文搜索 xiaoqi.Pattern = "”&start&“.+?”&over&“"‘正則表達(dá)式 Set Matches =xiaoqi.Execute(wstr)‘開始執(zhí)行配置 set xiaoqi=nothing body="" For Each Match in Matches body=body&Match.Value ‘循環(huán)匹配 Next ‘-----------------翟振愷(小琦) End Function
調(diào)用方法:body(被采集的頁(yè)面的內(nèi)容,開始標(biāo)記,結(jié)束標(biāo)記)
采集程序祥細(xì)思路:
1、取得網(wǎng)站的分頁(yè)列表頁(yè)的每頁(yè)地址 目前絕大部分動(dòng)態(tài)網(wǎng)站的分頁(yè)地址都有規(guī)則,如: 動(dòng)態(tài)頁(yè) 第一頁(yè):index.asp?page=1 第二頁(yè):index.asp?page=2 第三頁(yè):index.asp?page=3 .....
靜態(tài)頁(yè) 第一頁(yè):page_1.htm 第二頁(yè):page_2.htm 第三頁(yè):page_3.htm .....
取得網(wǎng)站的分頁(yè)列表頁(yè)的每頁(yè)地址,只需要用變量替代每頁(yè)地址的變化的字符即可如:page_<%="&page&"%>.htm
2、獲取被采集網(wǎng)站的分頁(yè)列表頁(yè)內(nèi)容
3、從分頁(yè)列表代碼中提取[color=Blue]被采集的內(nèi)容頁(yè)面的URL連接地址[/color] 絕大部分分頁(yè)頁(yè)面里的內(nèi)容頁(yè)連接也有固定規(guī)則,如: <a href="url1">連接1</a> <br> <a href="url2">連接2</a> <br> <a href="url3">連接3</a> <br>
用以下代碼就可以獲得一個(gè)URL連接集合
‘-----------------翟振愷(小琦) Set xiaoqi = New Regexp xiaoqi.IgnoreCase = True xiaoqi.Global = True xiaoqi.Pattern = ””“.+?”““ Set Matches =xiaoqi.Execute(頁(yè)面列表內(nèi)容) set xiaoqi=nothing url="" For Each Match in Matches url=url&Match.Value Next ‘-----------------翟振愷(小琦)
4、取得被采集的內(nèi)容頁(yè)面內(nèi)容,根據(jù)”提取標(biāo)記“從被采集的內(nèi)容頁(yè)面分別截取要取得的數(shù)據(jù)。
因?yàn)槭莿?dòng)態(tài)生成的頁(yè)面,大多數(shù)內(nèi)容頁(yè)面內(nèi)都有相同的html標(biāo)記,我們可以根據(jù)這些有規(guī)則的標(biāo)記提取需要的各個(gè)部分的內(nèi)容。如:
每個(gè)頁(yè)面都有網(wǎng)頁(yè)標(biāo)題<title>網(wǎng)頁(yè)標(biāo)題</title>,用我上面寫的MID截取函數(shù)就可以獲得<title></title>之間的值,也可以用正則表達(dá)式來(lái)獲得。 例:body("<title>網(wǎng)頁(yè)標(biāo)題</title>","<title>","</title>")
目前防采集的方法有很多種,先介紹一下常見防采集策略方法和它的弊端及采集對(duì)策:
一、判斷一個(gè)IP在一定時(shí)間內(nèi)對(duì)本站頁(yè)面的訪問(wèn)次數(shù),如果明顯超過(guò)了正常人瀏覽速度,就拒絕此IP訪問(wèn)
弊端: 1、此方法只適用于動(dòng)態(tài)頁(yè)面,如:asp\jsp\php等...靜態(tài)頁(yè)面無(wú)法判斷某個(gè)IP一定時(shí)間訪問(wèn)本站頁(yè)面的次數(shù)。 2、此方法會(huì)嚴(yán)重影響搜索引擎蜘蛛對(duì)其收錄,因?yàn)樗阉饕嬷┲胧珍洉r(shí),瀏覽速度都會(huì)比較快而且是多線程。此方法也會(huì)拒絕搜索引擎蜘蛛收錄站內(nèi)文件 采集對(duì)策:只能放慢采集速度,或者不采 建議:做個(gè)搜索引擎蜘蛛的IP庫(kù),只允許搜索引擎蜘蛛快速瀏覽站內(nèi)內(nèi)容。搜索引擎蜘蛛的IP庫(kù)的收集,也不太容易,一個(gè)搜索引擎蜘蛛,也不一定只有一個(gè)固定的IP地址。 評(píng)論:此方法對(duì)防采集比較有效,但卻會(huì)影響搜索引擎對(duì)其收錄。
二、用javascript加密內(nèi)容頁(yè)面
弊端:此方法適用于靜態(tài)頁(yè)面,但會(huì)嚴(yán)重影響搜索引擎對(duì)其收錄情況,搜索引擎收到到的內(nèi)容,也都是加密后的內(nèi)容 采集對(duì)策:建議不采,如非要采,就把解密碼的JS腳本也采下來(lái)。 建議:目前沒有好的改良建議 評(píng)論:建議指望搜索引擎帶流量的站長(zhǎng)不要使用此方法。
三、把內(nèi)容頁(yè)面里的特定標(biāo)記替換為[color=Red]”特定標(biāo)記+隱藏版權(quán)文字“[/color]
弊端:此方法弊端不大,僅僅會(huì)增加一點(diǎn)點(diǎn)的頁(yè)面文件大小,但容易反采集 采集對(duì)策:把采集來(lái)的含有隱藏版權(quán)文字內(nèi)容的版權(quán)文字替掉,或替換成自己的版權(quán)。 建議:目前沒有好的改良建議 評(píng)論:自己感覺實(shí)用價(jià)值不大,就算是加上隨機(jī)的隱藏文字,也等于畫蛇添足。
四、只允許用戶登陸后才可以瀏覽
弊端:此方法會(huì)嚴(yán)重影響搜索引擎蜘蛛對(duì)其收錄 采集對(duì)策:目前落伍已經(jīng)有人發(fā)了對(duì)策文章 ,具體對(duì)策就看這個(gè)吧《ASP小偷程序如何利用XMLHTTP實(shí)現(xiàn)表單的提交以及cookies或session的發(fā)送》 建議:目前沒有好的改良建議 評(píng)論:建議指望搜索引擎帶流量的站長(zhǎng)不要使用此方法。不過(guò)此方法防一般的采集程序,還是有點(diǎn)效果的。
五、用javascript、vbscript腳本做分頁(yè)
弊端:影響搜索引擎對(duì)其收錄 采集對(duì)策:分析javascript、vbscript腳本,找出其分頁(yè)規(guī)則,自己做個(gè)對(duì)應(yīng)此站的分頁(yè)集合頁(yè)即可。 建議:目前沒有好的改良建議 評(píng)論:感覺懂點(diǎn)腳本語(yǔ)言的人都能找出其分頁(yè)規(guī)則
六、只允許通過(guò)本站頁(yè)面連接查看,如:Request.ServerVariables("HTTP_REFERER")
弊端:影響搜索引擎對(duì)其收錄 采集對(duì)策:不知道能不能模擬網(wǎng)頁(yè)來(lái)源。。。。目前我沒有對(duì)應(yīng)此方法的采集對(duì)策 建議:目前沒有好的改良建議 評(píng)論:建議指望搜索引擎帶流量的站長(zhǎng)不要使用此方法。不過(guò)此方法防一般的采集程序,還是有點(diǎn)效果的。
從以上可以看出,目前常用的防采集方法,要么會(huì)對(duì)搜索引擎收錄有較大影響,要么防采集效果不好,起不到防采集的效果。那么,還有沒有一種有效防采集,而又不影響搜索引擎收錄的方法呢?那就請(qǐng)繼續(xù)往下看吧!
從前面的我講的采集原理大家可以看出,絕大多數(shù)采集程序都是靠分析規(guī)則來(lái)進(jìn)行采集的,如分析分頁(yè)文件名規(guī)則、分析頁(yè)面代碼規(guī)則。
一、分頁(yè)文件名規(guī)則防采集對(duì)策
大部分采集器都是靠分析分頁(yè)文件名規(guī)則,進(jìn)行批量、多頁(yè)采集的。如果別人找不出你的分頁(yè)文件的文件名規(guī)則,那么別人就無(wú)法對(duì)你的網(wǎng)站進(jìn)行批量多頁(yè)采集。
實(shí)現(xiàn)方法:
我認(rèn)為用MD5加密分頁(yè)文件名是一個(gè)比較好的方法,說(shuō)到這里,有人會(huì)說(shuō),你用MD5加密分頁(yè)文件名,別人根據(jù)此規(guī)則也可以模擬你的加密規(guī)則得到你的分頁(yè)文件名。
我要指出的是我們加密分頁(yè)文件名時(shí),不要只加密文件名變化的部分
如果I代表分頁(yè)的頁(yè)碼,那么我們不要這樣加密:page_name=Md5(I,16)&".htm"
最好給要加密的頁(yè)碼上再跟進(jìn)一個(gè)或多個(gè)字符,如:page_name=Md5(I&"任意一個(gè)或幾個(gè)字母",16)&".htm"
因?yàn)镸D5是無(wú)法反解密的,別人看到的會(huì)頁(yè)字母是MD5加密后的結(jié)果,所以加人也無(wú)法知道你在 I 后面跟進(jìn)的字母是什么,除非他用暴力****MD5,不過(guò)不太現(xiàn)實(shí)。
二、頁(yè)面代碼規(guī)則防采集對(duì)策
如果說(shuō)我們的內(nèi)容頁(yè)面無(wú)代碼規(guī)則,那么別人就無(wú)法從你的代碼中提取他們所需要的一條條內(nèi)容。所以我們要的這一步做到防采集,就要使代碼無(wú)規(guī)則。
實(shí)現(xiàn)方法:
使對(duì)方需要提取的標(biāo)記隨機(jī)化
1、定制多個(gè)網(wǎng)頁(yè)模板,每個(gè)網(wǎng)頁(yè)模板里的重要HTML標(biāo)記不同,呈現(xiàn)頁(yè)面內(nèi)容時(shí),隨機(jī)選取網(wǎng)頁(yè)模板,有的頁(yè)面用CSS+DIV布局,有的頁(yè)面用table布局,此方法是麻煩了點(diǎn),一個(gè)內(nèi)容頁(yè)面,要多做幾個(gè)模板頁(yè)面,不過(guò)防采集本身就是一件很煩瑣的事情,多做一個(gè)模板,能起到防采集的作用,對(duì)很多人來(lái)說(shuō),都是值得的。 2、如果嫌上面的方法太麻煩,把網(wǎng)頁(yè)里的重要HTML標(biāo)記隨機(jī)化,也可以。
做的網(wǎng)頁(yè)模板越多,html代碼越是隨機(jī)化,對(duì)方分析起內(nèi)容代碼時(shí),就越麻煩,對(duì)方針對(duì)你的網(wǎng)站專門寫采集策略時(shí),難度就更大,在這個(gè)時(shí)候,絕大部分人,都會(huì)知難而退,因?yàn)檫@此人就是因?yàn)閼?,才?huì)采集別人網(wǎng)站數(shù)據(jù)嘛~~~再說(shuō)一下,目前大部分人都是拿別人開發(fā)的采集程序去采集數(shù)據(jù),自己開發(fā)采集程序去采集數(shù)據(jù)的人畢竟是少數(shù)。
還有些簡(jiǎn)單的思路提供給大家:
1、把對(duì)數(shù)據(jù)采集者重要,而對(duì)搜索引擎不重要的內(nèi)容用客戶端腳本顯示 2、把一頁(yè)數(shù)據(jù),分為N個(gè)頁(yè)面顯示,也是加大采集難度的方法 3、用更深層的連接,因?yàn)槟壳按蟛糠植杉绦蛑荒懿杉骄W(wǎng)站內(nèi)容的前3層,如果內(nèi)容所在的連接層更深,也可以避免被采集。不過(guò)這樣可能會(huì)給客戶造成瀏覽上的不便。如:
大多網(wǎng)站都是 首頁(yè)----內(nèi)容索引分頁(yè)----內(nèi)容頁(yè) 如果改成: 首頁(yè)----內(nèi)容索引分頁(yè)----內(nèi)容頁(yè)入口----內(nèi)容頁(yè) 注:內(nèi)容頁(yè)入口最好能加上自動(dòng)轉(zhuǎn)入內(nèi)容頁(yè)的代碼
<meta http-equiv="refresh" content="6;url=內(nèi)容頁(yè)(http://www.)">
其實(shí),只要做好防采集的第一步(加密分頁(yè)文件名規(guī)則),防采集的效果就已經(jīng)不錯(cuò)了,還是建議兩條反采集方法同時(shí)使用,給采集者增加采集難度,使得他們知難頁(yè)退。
|