帮你打造属于自己的搜索引擎---百度篇
2018-09-06 13:17
想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。
一、认识百度搜索
百度搜索,全球最大中文搜索引擎,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--在限定的域名中搜索,比如想在新浪的站内搜索可使用参数要使这个参数有效必须结合ct参数一起使用。
☆ct--此参数的值一般是一串数字,估计应该是搜索请求的验证码
si和ct参数结合使用,比如在中搜索理想,可用:理想
☆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=输入关键字,然后LetsSearching...value=<%=wd%>>
<inputtype=submitvalue=百度搜索>
</td></form></tr>
</table>
<%
DimstrUrl,strTmp_bd,strInfo,strPage,strPageSum_bd,strQtime_bd
DimbNoResult_bd,regEx,patrn
百度查询字符串
strUrl=
开始采集
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、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能连接,比如百度快照和站内搜索等功能。为此我在下载包中提供一个无百度任何连接的精简版,你可以根据需要使用,在本文中就不列出代码了,其实和完整版的差不多。