主頁(yè) > 知識(shí)庫(kù) > 幫你打造屬于自己的搜索引擎---百度篇

幫你打造屬于自己的搜索引擎---百度篇

熱門(mén)標(biāo)簽:金昌電話機(jī)器人價(jià)格 萊西電子地圖標(biāo)注 縣域地圖標(biāo)注打印店 外呼系統(tǒng)API接口 武夷山旅游地圖標(biāo)注 個(gè)人可以辦理400電話么 怎么在地圖標(biāo)注自己 鳳臺(tái)百度地圖標(biāo)注店 修改地圖標(biāo)注
想擁有屬于自己的搜索引擎嗎?采用目前流行的數(shù)據(jù)采集方法,你就可以立即擁有。下面就教你一步步地去實(shí)現(xiàn)。

一、認(rèn)識(shí)百度搜索

百度搜索,全球最大中文搜索引擎,2005年8月5日在美國(guó)納斯達(dá)克上市交易,目前是國(guó)內(nèi)用戶使用率最高的搜索引擎,提供網(wǎng)頁(yè)、新聞、圖片、音樂(lè)、地圖等各種搜索

1、百度網(wǎng)頁(yè)搜索的查詢參數(shù)

必備參數(shù)

☆ wd--查詢的關(guān)鍵詞(Keyword)
☆ pn--顯示結(jié)果的頁(yè)數(shù)(Page Number)
☆ cl--搜索類型(Class),cl=3為網(wǎng)頁(yè)搜索

可選參數(shù)
☆ rn--搜索結(jié)果顯示條數(shù)(Record Number),取值范圍在10--100條之間,缺省設(shè)置rn=10
☆ ie--查詢輸入文字的編碼(Input Encoding),缺省設(shè)置ie=gb2312,即為簡(jiǎn)體中文
☆ tn--提交搜索請(qǐng)求的來(lái)源站點(diǎn)
幾個(gè)有用的tn 
tn=baidulocal 表示百度站內(nèi)搜索,返回的結(jié)果很干凈,無(wú)廣告干擾。比如,在百度站內(nèi)搜索"快樂(lè)",看看返回結(jié)果是不是很清爽。
tn=baiducnnic 想把百度放在框架中嗎?試試這個(gè)參數(shù)就可以了,是百度為Cnnic定制的

☆ si--在限定的域名中搜索,比如想在新浪的站內(nèi)搜索可使用參數(shù)si=sina.com.cn,要使這個(gè)參數(shù)有效必須結(jié)合ct參數(shù)一起使用。

☆ ct--此參數(shù)的值一般是一串?dāng)?shù)字,估計(jì)應(yīng)該是搜索請(qǐng)求的驗(yàn)證碼

si和ct參數(shù)結(jié)合使用,比如在sina.com.cn中搜索"理想",可用:http://www.baidu.com/baidu?ie=utf-8am ... ncl=3word=理想

☆ bs--上一次搜索的關(guān)鍵詞(Before Search),估計(jì)與相關(guān)搜索有關(guān)

2、百度搜索結(jié)果頁(yè)面結(jié)構(gòu)

按源代碼結(jié)構(gòu)自上而下為:

搜索框
右側(cè)的火爆地帶固定排名
搜索結(jié)果
分頁(yè)區(qū)
相關(guān)搜索
底部搜索框
版權(quán)區(qū)

其中"搜索結(jié)果、分頁(yè)區(qū)"這兩部分就是我們需要的有效數(shù)據(jù),根據(jù)其代碼結(jié)果可以發(fā)現(xiàn)其唯一的字符串標(biāo)識(shí),通過(guò)這個(gè)標(biāo)識(shí)截取內(nèi)容就可以了,具體看后面的代碼。

二、核心函數(shù)--使用asp的xmlhttp組件

數(shù)據(jù)采集程序,俗稱小偷程序,其核心部分就是這個(gè)xmlhttp組件,用xmlhttp采集數(shù)據(jù)有些老生常談了,網(wǎng)上資料也不少,一般的采集代碼都是

set http=Server.createobject("MSXML2.XMLHTTP") 
Http.open "GET",url,false '打開(kāi)xmlhttp
Http.send() '發(fā)送請(qǐng)求
if Http.readystate>4 then
exit function 
end if 
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312") '返回結(jié)果(一般是字節(jié)流),并將字節(jié)流轉(zhuǎn)換為字符串
set http=nothing '釋放xmlhttp

詳細(xì)應(yīng)用見(jiàn)下面的完整代碼

三、完整代碼(文件名:searchi_bd.asp)

%
option explicit
Dim wd,pn
wd = Request("wd")
pn = Request.QueryString("pn")
'開(kāi)始錯(cuò)誤處理
On Error Resume Next
If Err.Number > 0 Then
Response.Clear
'顯示錯(cuò)誤信息給用戶 
Response.Write "p align='center' >font size=3> 出錯(cuò)了,請(qǐng)重新打開(kāi)百度搜索./font>/p>"
end if
%>
HTML>
HEAD>
TITLE>百度搜索--%=wd%>/TITLE>
/HEAD>
STYLE type=text/css>
!--
body,td{font-family:arial}
TD{FONT-SIZE:9pt;LINE-HEIGHT:18px}
.cred{color:#FF0000}
//-->
/STYLE>

BODY leftmargin="0" topmargin="3" marginwidth="0" marginheight="0">
table align="center" width="98%" cellspacing="0" cellpadding="0" border="0" bgcolor="#ffffff" >
tr>
form name="f1" method="post" action="searchi_bd.asp">
td width=150 height=50>
你的LOGO
/td>
td align="left">
input name=wd size="40" maxlength="100" title="輸入關(guān)鍵字,然后Let's Searching..." value="%=wd%>">
input type="submit" value=" 百度搜索 ">
/td>/form>/tr>
/table>
%
Dim strUrl,strTmp_bd,strInfo,strPage,strPageSum_bd,strQtime_bd
Dim bNoResult_bd,regEx,patrn
'百度查詢字符串
strUrl = "http://www.baidu.com/s?ie=gb2312wd="wdam ... pn"cl=3"
'開(kāi)始采集
strTmp_bd = GetHTTPPage(strUrl)
If InStr(strtmp_bd,"未找到和您的查詢")>0 Then
bNoResult_bd=1
End If

'截取"搜索結(jié)果"部分的內(nèi)容
strinfo = strCut(strTmp_bd,"DIV id=ScriptDiv>/DIV>","br clear=all>",2)
patrn="/td>/tr>/table>br>"
Set regEx = New RegExp ' 建立正則表達(dá)式。
regEx.Pattern = patrn ' 設(shè)置模式。
regEx.IgnoreCase = true 
regEx.Global = false 
strinfo=regEx.replace(strinfo,"") 

'截取"分頁(yè)區(qū)"部分的內(nèi)容
strPage = strCut(strTmp_bd,"br clear=all>","br>",2)
strPage = Replace(strPage,"href=s?","href=searchi_bd.asp?")
'結(jié)果數(shù)量與用時(shí)
strPageSum_bd=strCut(strtmp_bd,"找到相關(guān)網(wǎng)頁(yè)約","篇",2)
if not IsNumeric(strPageSum_bd) then
strPageSum_bd=strCut(strtmp_bd,"找到相關(guān)網(wǎng)頁(yè)","篇",2)
end if
strQtime_bd=strCut(strtmp_bd,"用時(shí)","秒",2)
Set strTmp_bd=nothing

%>
!-- T1-Start -->
table cellspacing=0 cellpadding=0 border=0 width=98% align="center">
tr valign=center align=middle height=18>
td width=1 bgcolor=#999999>

td nowrap style="FONT-WEIGHT:bold;COLOR:#ffffff;BACKGROUND-COLOR:#0033cc" width=64>互聯(lián)網(wǎng)/td>

td align=right bgcolor=#eeeeee>nobr>找到符合b>%=wd%>/b>的相關(guān)網(wǎng)頁(yè)b>%=strPageSum_bd%>/b>篇,用時(shí)b>%=strQtime_bd%>/b>秒/nobr>nbsp;/td>
/tr>
tr>td bgcolor=#999999 colspan=3 height=2>/td>/tr>/table>
/td>
/tr>
/table>

%
if wd="" then
Response.Write "p align='center' >font size=-1> 您好,請(qǐng)?jiān)谒阉骺蛑休斎腙P(guān)鍵詞./font>/p>"
elseif bNoResult_bd=1 then
Response.Write "p align='center' >font size=-1> 抱歉,未找到任何符合您查詢條件的信息,請(qǐng)重新選擇合適的關(guān)鍵詞進(jìn)行查詢./font>/p>"
else
%>
table width="98%" align="center" cellspacing="0" cellpadding="0" border="0">
tr>
td style=line-height:160% bgcolor="#ffffff" width="75%" valign=top>br>
%=strinfo%>
/td>
td width="25%" valign=top>br> 這是你發(fā)揮的空間! 
/td>
/tr>
/table>
table width="98%" align="center" cellspacing="0" cellpadding="4" border="0">
tr>
td align="center">
br>font size=3>%=strPage%>/font>
/td>
/tr>
/table>
%End If 
set strinfo=nothing

%>
hr size="1" width="760" color="#0000ff">

div align="center">font size=-1>
程序更新請(qǐng)到這里span class="cred">(知識(shí)分享論壇)/span>查看/font>
/div>
/BODY>
/HTML>

%
'采集函數(shù)
Function getHTTPPage(url) 
On Error Resume Next
dim http 
set http=Server.createobject("MSXML2.XMLHTTP") 
Http.open "GET",url,false 
Http.send() 
if Http.readystate>4 then
exit function 
end if 
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")
set http=nothing
If Err.number>0 then 
Response.Write "div align='center'>b>服務(wù)器獲取文件內(nèi)容出錯(cuò)/b>/div>" 
Err.Clear
End If 
End function
'字節(jié)流轉(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

'截取字符串,1.包括前后字符串,2.不包括前后字符串
Function strCut(strContent,StartStr,EndStr,CutType)
Dim S1,S2
On Error Resume Next
select Case CutType
Case 1
S1 = InStr(strContent,StartStr)
S2 = InStr(S1,strContent,EndStr)+Len(EndStr)
Case 2
S1 = InStr(strContent,StartStr)+Len(StartStr)
S2 = InStr(S1,strContent,EndStr)
End select
If Err Then
strCute = "p align='center' >font size=-1>截取字符串出錯(cuò)./font>/p>"
Err.Clear
Exit Function
Else
strCut = Mid(strContent,S1,S2-S1)
End If
End Function

%>


把上面的代碼Copy到記事本保存為searchi_bd.asp,就可以使用了。如果你要更改文件名,請(qǐng)同時(shí)把以下代碼中藍(lán)色標(biāo)識(shí)部分改為你的文件名

strPage = Replace(strPage,"href=s?","href=searchi_bd.asp?")

幾點(diǎn)說(shuō)明:

1、百度搜索基本上沒(méi)有什么反采集的措施,主要一點(diǎn)就是百度隔一段時(shí)間會(huì)更改返回結(jié)果頁(yè)面的源代碼,所以要經(jīng)常觀察百度的搜索結(jié)果頁(yè)面,發(fā)現(xiàn)代碼變動(dòng)了,就將幾處字符串標(biāo)識(shí)改動(dòng)一下。在反采集方面,百度比Google大度多了,目前還沒(méi)發(fā)現(xiàn)由于頻繁查詢百度而出現(xiàn)暫時(shí)屏蔽來(lái)源站點(diǎn)IP的現(xiàn)象,而在Google查詢中經(jīng)常出現(xiàn)這個(gè)現(xiàn)象,如何解決就在下篇文章里談一談。

2、采集比較耗資源,搜索小偷程序一樣,所以程序中盡量早點(diǎn)釋放變量或?qū)ο蟆H绻愕目臻g資源不多,建議就不要搞這些了。

3、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能連接,比如百度快照和站內(nèi)搜索等功能。為此我在下載包中提供一個(gè)無(wú)百度任何連接的精簡(jiǎn)版,你可以根據(jù)需要使用,在本文中就不列出代碼了,其實(shí)和完整版的差不多。

標(biāo)簽:上海 通遼 清遠(yuǎn) 涼山 南京 楚雄 邢臺(tái) 赤峰

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《幫你打造屬于自己的搜索引擎---百度篇》,本文關(guān)鍵詞  幫你,打造,屬于,自己的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《幫你打造屬于自己的搜索引擎---百度篇》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于幫你打造屬于自己的搜索引擎---百度篇的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章