通過動態程序和Js訪問分別記錄訪問者的IP,然后進行IP判斷,由于采集過程不會訪問JS,采集的時候只會查到用動態程序記錄的IP,而不會有通過JS記錄的IP,從而實現網頁程序的防采集。
防采集的原理非常簡單,首先放一段動態語句,把訪問者的IP加入到數據庫的一個表里,然后在頁面底部加入一個JS,JS直接訪問動態頁面,將訪問者的IP加入到數據庫的另外一個表里。再次訪問的時候,從兩個表里讀IP數據,然后判斷時間差,如果只在首先個表里找到,在第二個表里找不到,或者時間差超過10秒,則認為是采集。
優點
1.部署簡單,只要是動態語言就能很容易的實現,無需借助服務器端程序
2.殺傷力大,幾乎能封殺所有的采集過程
缺點
1.首先個缺點還是殺傷力大,如果需要實際使用需要考慮一些特殊情況,以免誤殺已經殺掉搜索爬蟲
2.只適用于動態網頁,靜態頁面就沒法用了
程序例子(ASP+ACCESS)(測試程序下載):
1.建立數據庫
表1:Ip1,字段Ip1_Adderss(文本),Ip1_Time(日期/時間,默認值=Now())
表2:Ip2,字段Ip2_Adderss(文本),Ip2_Time(日期/時間,默認值=Now())
2.Index.asp(僅動態代碼,全部代碼請見測試程序中)
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Dim Conn,Rs,Sqlstr,Ip,IpTime,IpTime2,NewUser NewUser=0 Set Conn = Server.CreateObject("Adodb.Connection") Set Rs=Server.Createobject("Adodb.RecordSet") ConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("Data.mdb") Conn.Open ConnStr Ip=Request.ServerVariables("REMOTE_ADDR") Sqlstr="Select * From [Ip1] Where Ip1_Address='"&Ip&"' Order By Ip1_Id Desc" Rs.Open Sqlstr,Conn,1,3 If Rs.Eof Then NewUser=1 Application.Lock() Rs.AddNew() Rs("Ip1_Address")=Ip Rs.Update() Application.UnLock() Else IpTime=Rs("Ip1_Time") Application.Lock() Rs.AddNew() Rs("Ip1_Address")=Ip Rs.Update() Application.UnLock() End If Rs.Close If NewUser=0 Then Sqlstr="Select * From [Ip2] Where Ip2_Address='"&Ip&"' Order By Ip2_Id Desc" Rs.Open Sqlstr,Conn,1,3 If Rs.Eof Then Rs.Close Response.Write("請勿采集!") Response.End() Else IpTime2=Rs("Ip2_Time") If DateDiff("s",IpTime2,IpTime)>10 Then Rs.Close Response.Write("請勿采集!") Response.End() End If End If Rs.Close End If %>
3.Js.asp
<% Dim Conn,Rs,Sqlstr,Ip Set Conn = Server.CreateObject("Adodb.Connection") Set Rs=Server.Createobject("Adodb.RecordSet") ConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("Data.mdb") Conn.Open ConnStr Ip=Request.ServerVariables("REMOTE_ADDR") Sqlstr="Select * From [Ip2]" Rs.Open Sqlstr,Conn,1,3 Application.Lock() Rs.AddNew() Rs("Ip2_Address")=Ip Rs.Update() Application.UnLock() Rs.Close %>
4.Get.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Response.Write(Server.HTMLEncode(GetHttpPage("/Index.asp","GB2312"))) '============================== '函 數 名:GetHttpPage '作 用:獲取頁面源代碼函數 '參 數:網址HttpUrl '============================== Function GetHttpPage(HttpUrl,Code) If IsNull(HttpUrl)=True Or HttpUrl="" Then GetHttpPage="A站點維護中!" Exit Function End If On Error Resume Next Dim Http Set Http=server.createobject("MSX"&"ML2.XML"&"HTTP") Http.open "GET",HttpUrl,False Http.Send() If Http.Readystate<>4 then Set Http=Nothing GetHttpPage="B站點維護中!" Exit function End if GetHttpPage=BytesToBSTR(Http.responseBody,Code) Set Http=Nothing If Err.number<>0 then Err.Clear GetHttpPage="C站點維護中!" Exit function End If End Function '============================== '函 數 名:BytesToBstr '作 用:轉換編碼函數 '參 數:字符串Body,編碼Cset '============================== Function BytesToBstr(Body,Cset) Dim Objstream Set Objstream = Server.CreateObject("ado"&"d"&"b.st"&"re"&"am") 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 %>
|