[zhihere]帮你打造属于自己的搜索引擎---百度篇[知识分享-知合网]

来源:百度文库 编辑:神马文学网 时间:2024/04/27 14:59:17
第7楼 作者:60.162.119.*** 发表时间:2005-11-26 22:55:43回复顶部列表
不错,前两天一时兴趣也做了一个,是为别人写个抓网页的程序,突然想到能不能写个程序把几大搜索引擎的结果抓过来分析、对比再重新提供给使用者,这样可以节省大家获取资料的时间,这点我是深有体会的,有时找个资料,非要把搜索引擎搜个遍,虽然不一定能搜到。
我把程序写出来,才知道这叫元搜索,网上一搜一大堆。你做的这个不错。
不知道你对这种形式的搜索有何看法?
有没有自己开发蜘蛛程序的想法?呵呵,做搜索的话,问题不是在这里,国内、外几大搜索引擎做得已经相当不错了,也许做细分搜索才能做好。
我的网址:http://www.ejear.com ,MSN:hanbaojun@hotmail.com 欢迎交流。
第8楼 作者:222.212.203.*** 发表时间:2005-11-27 15:27:33回复顶部列表
hanbaojun,用了你做的元搜索---http://www.ejear.com,很不错,尤其是对相似内容的处理,很值得学习。元搜索从长远看,只是一个辅助的搜索工具,要真正去做搜索引擎,就必须找到一个细分的领域做专业的垂直搜索。比如我这个元搜索叫知识搜索,以后的重点就是做知识领域的垂直搜索,例如索引图书、专业知识等等资料。不过目前由于技术不够,许多东西一时也实现不了,但这个方向不会变。已加了你的msn,希望有机会交流一下。
http://www.zhihere.com/search/xueba/index.asp?list=1&idl=0&jhua=1
帮你打造属于自己的搜索引擎---百度篇
想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。
一、认识百度搜索
百度搜索,全球最大中文搜索引擎,2005年8月5日在美国纳斯达克上市交易,目前是国内用户使用率最高的搜索引擎,提供网页、新闻、图片、音乐、地图等各种搜索
1、百度网页搜索的查询参数
必备参数
☆ wd--查询的关键词(Keyword)
☆ pn--显示结果的页数(Page Number)
☆ cl--搜索类型(Class),cl=3为网页搜索
可选参数
☆ rn--搜索结果显示条数(Record Number),取值范围在10--100条之间,缺省设置rn=10
☆ ie--查询输入文字的编码(Input Encoding),缺省设置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/s?q=&ct=2097152&si=sina.com.cn&ie=gb2312&cl=3&wd=理想
☆ bs--上一次搜索的关键词(Before Search),估计与相关搜索有关
2、百度搜索结果页面结构
按源代码结构自上而下为:
搜索框
右侧的火爆地带固定排名
搜索结果
分页区
相关搜索
底部搜索框
版权区
其中“搜索结果、分页区”这两部分就是我们需要的有效数据,根据其代码结果可以发现其唯一的字符串标识,通过这个标识截取内容就可以了,具体看后面的代码。
二、核心函数--使用asp的xmlhttp组件
数据采集程序,俗称小偷程序,其核心部分就是这个xmlhttp组件,用xmlhttp采集数据有些老生常谈了,网上资料也不少,一般的采集代码都是
set http=Server.createobject("MSXML2.XMLHTTP")
Http.open "GET",url,false     ‘打开xmlhttp
Http.send()    ‘发送请求
if Http.readystate<>4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")  ‘返回结果(一般是字节流),并将字节流转换为字符串
set http=nothing ‘释放xmlhttp
详细应用见下面的完整代码
三、完整代码(文件名:searchi_bd.asp)
[Code Start]
<%
option explicit
Dim wd,pn
wd = Request("wd")
pn = Request.QueryString("pn")
‘开始错误处理
On Error Resume Next
If Err.Number <> 0 Then
Response.Clear
‘显示错误信息给用户
Response.Write "

出错了,请重新打开百度搜索.

"
end if
%>


百度搜索--<%=wd%>









你的LOGO




<%
Dim strUrl,strTmp_bd,strInfo,strPage,strPageSum_bd,strQtime_bd
Dim  bNoResult_bd,regEx,patrn
‘百度查询字符串
strUrl = "http://www.baidu.com/s?ie=gb2312&wd="&wd&"&pn="&pn&"&cl=3‘ target=_blank>http://www.baidu.com/s?ie=gb2312&wd="&wd&"&pn="&pn&"&cl=3"
‘开始采集
strTmp_bd = GetHTTPPage(strUrl)
If InStr(strtmp_bd,"未找到和您的查询")<>0 Then
bNoResult_bd=1
End If
‘截取"搜索结果"部分的内容
strinfo = strCut(strTmp_bd,"
","
",2)
patrn="
"
Set regEx = New RegExp         ‘ 建立正则表达式。
regEx.Pattern = patrn         ‘ 设置模式。
regEx.IgnoreCase = true
regEx.Global = false
strinfo=regEx.replace(strinfo,"")
‘截取"分页区"部分的内容
strPage = strCut(strTmp_bd,"
","
",2)
strPage = Replace(strPage,"href=s?","href=searchi_bd.asp?")
‘结果数量与用时
strPageSum_bd=strCut(strtmp_bd,"找到相关网页约","篇",2)
if not IsNumeric(strPageSum_bd) then
strPageSum_bd=strCut(strtmp_bd,"找到相关网页","篇",2)
end if
strQtime_bd=strCut(strtmp_bd,"用时","秒",2)
Set strTmp_bd=nothing
%>







互联网找到符合<%=wd%>的相关网页<%=strPageSum_bd%>篇,用时<%=strQtime_bd%> 




<%
if wd="" then
Response.Write "

您好,请在搜索框中输入关键词.

"
elseif bNoResult_bd=1  then
Response.Write "

抱歉,未找到任何符合您查询条件的信息,请重新选择合适的关键词进行查询.

"
else
%>







<%=strinfo%>

这是你发挥的空间!







<%=strPage%>

<%End If
set strinfo=nothing
%>



程序更新请到这里(知识分享论坛)查看




<%
‘采集函数
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 "
服务器获取文件内容出错
"
Err.Clear
End If
End function
‘字节流转换为字符串
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 = "

截取字符串出错.

"
Err.Clear
Exit Function
Else
strCut = Mid(strContent,S1,S2-S1)
End If
End Function
%>
[Code End]
把上面的代码Copy到记事本保存为searchi_bd.asp,就可以使用了。如果你要更改文件名,请同时把以下代码中蓝色标识部分改为你的文件名
strPage = Replace(strPage,"href=s?","href=searchi_bd.asp?")
几点说明:
1、百度搜索基本上没有什么反采集的措施,主要一点就是百度隔一段时间会更改返回结果页面的源代码,所以要经常观察百度的搜索结果页面,发现代码变动了,就将几处字符串标识改动一下。在反采集方面,百度比Google大度多了,目前还没发现由于频繁查询百度而出现暂时屏蔽来源站点IP的现象,而在Google查询中经常出现这个现象,如何解决就在下篇文章里谈一谈。
2、采集比较耗资源,搜索小偷程序一样,所以程序中尽量早点释放变量或对象。如果你的空间资源不多,建议就不要搞这些了。
3、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能连接,比如百度快照和站内搜索等功能。为此我在下载包中提供一个无百度任何连接的精简版,你可以根据需要使用,在本文中就不列出代码了,其实和完整版的差不多。
演示和下载
完整版本演示(含百度连接):http://home.13200.com/user//wohere/searchi_bd.asp
精简版本演示(无百度连接):http://home.13200.com/user//wohere/searchi_bd1.asp
下载(包括本篇文章、searchi_bd.asp[完整版本]、searchi_bd1.asp[精简版本])
点击浏览该文件
下篇文章:帮你打造属于自己的搜索引擎---Google篇
From:zhihere.com(知合网)  2005-10-4  (转载请注明)