手机
当前位置:查字典教程网 >编程开发 >ASP教程 >帮你打造属于自己的搜索引擎---百度篇
帮你打造属于自己的搜索引擎---百度篇
摘要:想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。一、认识百度搜索百度搜索,全球最大中文搜...

想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。

一、认识百度搜索

百度搜索,全球最大中文搜索引擎,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.open"GET",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>

<>

</STYLE>

<BODYleftmargin="0"topmargin="3"marginwidth="0"marginheight="0">

<tablealign="center"width="98%"cellspacing="0"cellpadding="0"border="0"bgcolor="#ffffff">

<tr>

<formname="f1"method="post"action="searchi_bd.asp">

<tdwidth=150height=50>

你的LOGO

</td>

<tdalign="left">

<inputname=wdsize="40"maxlength="100"title="输入关键字,然后Let'sSearching..."value="<%=wd%>">

<inputtype="submit"value="百度搜索">

</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

%>

<>

<tablecellspacing=0cellpadding=0border=0width=98%align="center">

<trvalign=centeralign=middleheight=18>

<tdwidth=1bgcolor=#999999>

<tdnowrapstyle="FONT-WEIGHT:bold;COLOR:#ffffff;BACKGROUND-COLOR:#0033cc"width=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="center"cellspacing="0"cellpadding="0"border="0">

<tr>

<tdstyle=line-height:160%bgcolor="#ffffff"width="75%"valign=top><br>

<%=strinfo%>

</td>

<tdwidth="25%"valign=top><br>这是你发挥的空间!

</td>

</tr>

</table>

<tablewidth="98%"align="center"cellspacing="0"cellpadding="4"border="0">

<tr>

<tdalign="center">

<br><fontsize=3><%=strPage%></font>

</td>

</tr>

</table>

<%EndIf

setstrinfo=nothing

%>

<hrsize="1"width="760"color="#0000ff">

<divalign="center"><fontsize=-1>

程序更新请到这里<spanclass="cred">(知识分享论坛)</span>查看</font>

</div>

</BODY>

</HTML>

<%

'采集函数

FunctiongetHTTPPage(url)

OnErrorResumeNext

dimhttp

sethttp=Server.createobject("MSXML2.XMLHTTP")

Http.open"GET",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、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能连接,比如百度快照和站内搜索等功能。为此我在下载包中提供一个无百度任何连接的精简版,你可以根据需要使用,在本文中就不列出代码了,其实和完整版的差不多。

【帮你打造属于自己的搜索引擎---百度篇】相关文章:

TSYS一个新闻多种特性时如何进行前台更新?

javascript asp教程第十一课--Application 对象

ASP实现头像图像随机变换

一个非常简单的将半角转换为中文的函数

PJblog友情链接LOGO地址失效的解决

asp实现批量录入数据的实现

[转]ASP实现关键词获取(各搜索引擎,GB2312及UTF-8)

多域名一网站时如果返回最原来的域名

javascript asp教程第五课--合二为一

ASP实现静态无刷新分页效果

精品推荐
分类导航