擁有屬於自己的搜索引擎是很多人的想法,但是我們要怎麼才能擁有屬於自己的搜索引擎呢?現在小編就教大家利用目前流行的數據採集方法實現屬於自己的搜索引擎,現在我們去看看打造屬於自己的搜索引擎的方法吧。
一、認識百度搜索
百度搜索,全球最大中文搜索引擎,2005年8月5日在美國納斯達克上市交易,目前是國內用戶使用率最高的搜索引擎,提供網頁、新聞、圖片、音樂、地圖等各種搜索
1、百度網頁搜索的查詢參數
必備參數
☆wd--查詢的關鍵詞(Keyword)
☆pn--顯示結果的頁數(PageNumber)
☆cl--搜索類型(Class),cl=3為網頁搜索
可選參數
☆rn--搜索結果顯示條數(RecordNumber),取值範圍在10--100條之間,缺省設置rn=10
☆ie--查詢輸入文字的編碼(InputEncoding),缺省設置ie=gb2312,即為簡體中文
☆tn--提交搜索請求的來源站點
幾個有用的tn
tn=baidulocal表示百度站內搜索,返回的結果很乾淨,無廣告干擾。比如,在百度站內搜索快樂,看看返回結果是不是很清爽。
tn=baiducnnic想把百度放在框架中嗎?試試這個參數就可以了,是百度為Cnnic定制的
☆si--在限定的域名中搜索,比如想在新浪的站內搜索可使用參數si=sina.com.cn,要使這個參數有效必須結合ct參數一起使用。
☆ct--此參數的值一般是一串數字,估計應該是搜索請求的驗證碼
si和ct參數結合使用,比如在sina.com.cn中搜索理想,可用:http://www.baidu.com/baidu?ie=utf-8&am...n&cl=3&word=理想
☆bs--上一次搜索的關鍵詞(BeforeSearch),估計與相關搜索有關
2、百度搜索結果頁面結構
按源代碼結構自上而下為:
搜索框
右側的火爆地帶固定排名
搜索結果
分頁區
相關搜索
底部搜索框
版權區
其中搜索結果、分頁區這兩部分就是我們需要的有效數據,根據其代碼結果可以發現其唯一的字符串標識,通過這個標識截取內容就可以了,具體看後面的代碼。
二、核心函數--使用asp的xmlhttp組件
數據採集程序,俗稱小偷程序,其核心部分就是這個xmlhttp組件,用xmlhttp採集數據有些老生常談了,網上資料也不少,一般的採集代碼都是
sethttp=Server.createobject(MSXML2.XMLHTTP)
Http.openGET,url,false'打開xmlhttp
Http.send()'發送請求
ifHttp.readystate<>4then
exitfunction
endif
getHTTPPage=bytesToBSTR(Http.responseBody,GB2312)'返回結果(一般是字節流),並將字節流轉換為字符串
sethttp=nothing'釋放xmlhttp
詳細應用見下面的完整代碼
三、完整代碼(文件名:searchi_bd.asp)
<%
optionexplicit
Dimwd,pn
wd=Request(wd)
pn=Request.QueryString(pn)
'開始錯誤處理
OnErrorResumeNext
IfErr.Number<>0Then
Response.Clear
'顯示錯誤信息給用戶
Response.Write<palign='center'><fontsize=3>出錯了,請重新打開百度搜索.</font></p>
endif
%>
<HTML>
<HEAD>
<TITLE>百度搜索--<%=wd%></TITLE>
</HEAD>
<STYLEtype=text/css>
<!--
body,td{font-family:arial}
TD{FONT-SIZE:9pt;LINE-HEIGHT:18px}
.cred{color:#FF0000}
//-->
</STYLE>
<BODYleftmargin=0topmargin=3marginwidth=0marginheight=0>
<tablealign=centerwidth=98%cellspacing=0cellpadding=0border=0bgcolor=#ffffff>
<tr>
<formname=f1method=postaction=searchi_bd.asp>
<tdwidth=150height=50>
你的LOGO
</td>
<tdalign=left>
<inputname=wdsize=40maxlength=100title=輸入關鍵字,然後Let'sSearching...value=<%=wd%>>
<inputtype=submitvalue=百度搜索>
</td></form></tr>
</table>
<%
DimstrUrl,strTmp_bd,strInfo,strPage,strPageSum_bd,strQtime_bd
DimbNoResult_bd,regEx,patrn
'百度查詢字符串
strUrl=http://www.baidu.com/s?ie=gb2312&wd=&wd&am...&pn&&cl=3
'開始採集
strTmp_bd=GetHTTPPage(strUrl)
IfInStr(strtmp_bd,未找到和您的查詢)<>0Then
bNoResult_bd=1
EndIf
'截取搜索結果部分的內容
strinfo=strCut(strTmp_bd,<DIVid=ScriptDiv></DIV>,<brclear=all>,2)
patrn=</td></tr></table><br>
SetregEx=NewRegExp'建立正則表達式。
regEx.Pattern=patrn'設置模式。
regEx.IgnoreCase=true
regEx.Global=false
strinfo=regEx.replace(strinfo,)
'截取分頁區部分的內容
strPage=strCut(strTmp_bd,<brclear=all>,<br>,2)
strPage=Replace(strPage,href=s?,href=searchi_bd.asp?)
'結果數量與用時
strPageSum_bd=strCut(strtmp_bd,找到相關網頁約,篇,2)
ifnotIsNumeric(strPageSum_bd)then
strPageSum_bd=strCut(strtmp_bd,找到相關網頁,篇,2)
endif
strQtime_bd=strCut(strtmp_bd,用時,秒,2)
SetstrTmp_bd=nothing
%>
<!--T1-Start-->
<tablecellspacing=0cellpadding=0border=0width=98%align=center>
<trvalign=centeralign=middleheight=18>
<tdwidth=1bgcolor=#999999>
<tdnowrapstyle=FONT-WEIGHT:bold;COLOR:#ffffff;BACKGROUND-COLOR:#0033ccwidth=64>互聯網</td>
<tdalign=rightbgcolor=#eeeeee><nobr>找到符合<b><%=wd%></b>的相關網頁<b><%=strPageSum_bd%></b>篇,用時<b><%=strQtime_bd%></b>秒</nobr></td>
</tr>
<tr><tdbgcolor=#999999colspan=3height=2></td></tr></table>
</td>
</tr>
</table>
<%
ifwd=then
Response.Write<palign='center'><fontsize=-1>您好,請在搜索框中輸入關鍵詞.</font></p>
elseifbNoResult_bd=1then
Response.Write<palign='center'><fontsize=-1>抱歉,未找到任何符合您查詢條件的信息,請重新選擇合適的關鍵詞進行查詢.</font></p>
else
%>
<tablewidth=98%align=centercellspacing=0cellpadding=0border=0>
<tr>
<tdstyle=line-height:160%bgcolor=#ffffffwidth=75%valign=top><br>
<%=strinfo%>
</td>
<tdwidth=25%valign=top><br>這是你發揮的空間!
</td>
</tr>
</table>
<tablewidth=98%align=centercellspacing=0cellpadding=4border=0>
<tr>
<tdalign=center>
<br><fontsize=3><%=strPage%></font>
</td>
</tr>
</table>
<%EndIf
setstrinfo=nothing
%>
<hrsize=1width=760color=#0000ff>
<divalign=center><fontsize=-1>
程序更新請到這裡<spanclass=cred>(知識分享論壇)</span>查看</font>
</div>
</BODY>
</HTML>
<%
'採集函數
FunctiongetHTTPPage(url)
OnErrorResumeNext
dimhttp
sethttp=Server.createobject(MSXML2.XMLHTTP)
Http.openGET,url,false
Http.send()
ifHttp.readystate<>4then
exitfunction
endif
getHTTPPage=bytesToBSTR(Http.responseBody,GB2312)
sethttp=nothing
IfErr.number<>0then
Response.Write<divalign='center'><b>服務器獲取文件內容出錯</b></div>
Err.Clear
EndIf
Endfunction
'字節流轉換為字符串
FunctionBytesToBstr(body,Cset)
dimobjstream
setobjstream=Server.createObject(adodb.stream)
objstream.Type=1
objstream.Mode=3
objstream.Open
objstream.Writebody
objstream.Position=0
objstream.Type=2
objstream.Charset=Cset
BytesToBstr=objstream.ReadText
objstream.Close
setobjstream=nothing
EndFunction
'截取字符串,1.包括前後字符串,2.不包括前後字符串
FunctionstrCut(strContent,StartStr,EndStr,CutType)
DimS1,S2
OnErrorResumeNext
selectCaseCutType
Case1
S1=InStr(strContent,StartStr)
S2=InStr(S1,strContent,EndStr)+Len(EndStr)
Case2
S1=InStr(strContent,StartStr)+Len(StartStr)
S2=InStr(S1,strContent,EndStr)
Endselect
IfErrThen
strCute=<palign='center'><fontsize=-1>截取字符串出錯.</font></p>
Err.Clear
ExitFunction
Else
strCut=Mid(strContent,S1,S2-S1)
EndIf
EndFunction
%>
把上面的代碼Copy到記事本保存為searchi_bd.asp,就可以使用了。如果你要更改文件名,請同時把以下代碼中藍色標識部分改為你的文件名
strPage=Replace(strPage,href=s?,href=searchi_bd.asp?)
幾點說明:
1、百度搜索基本上沒有什麼反採集的措施,主要一點就是百度隔一段時間會更改返回結果頁面的源代碼,所以要經常觀察百度的搜索結果頁面,發現代碼變動了,就將幾處字符串標識改動一下。在反採集方面,百度比Google大度多了,目前還沒發現由於頻繁查詢百度而出現暫時屏蔽來源站點IP的現象,而在Google查詢中經常出現這個現象,如何解決就在下篇文章裡談一談。
2、採集比較耗資源,搜索小偷程序一樣,所以程序中盡量早點釋放變量或對象。如果你的空間資源不多,建議就不要搞這些了。
3、有些人可能不願意在自己做的搜索小偷中保留任何百度的功能連接,比如百度快照和站內搜索等功能。為此我在下載包中提供一個無百度任何連接的精簡版,你可以根據需要使用,在本文中就不列出代碼了,其實和完整版的差不多。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持錯新技術頻道。