帮你打造属于自己的搜索引擎---百度篇
程序员文章站
2022-04-14 18:49:23
想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。 一、认识百度搜索 百度搜索,全球最大中文搜索引擎,2005年8月5日在...
想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。
一、认识百度搜索
百度搜索,全球最大中文搜索引擎,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/baidu?ie=utf-8&am ... n&cl=3&word=理想
☆ 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)
<%
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 "<p align='center' ><font size=3> 出错了,请重新打开百度搜索.</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="输入关键字,然后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=gb2312&wd="&wd&am ... &pn&"&cl=3"
'开始采集
strtmp_bd = gethttppage(strurl)
if instr(strtmp_bd,"未找到和您的查询")<>0 then
bnoresult_bd=1
end if
'截取"搜索结果"部分的内容
strinfo = strcut(strtmp_bd,"<div id=scriptdiv></div>","<br clear=all>",2)
patrn="</td></tr></table><br>"
set regex = new regexp ' 建立正则表达式。
regex.pattern = patrn ' 设置模式。
regex.ignorecase = true
regex.global = false
strinfo=regex.replace(strinfo,"")
'截取"分页区"部分的内容
strpage = strcut(strtmp_bd,"<br clear=all>","<br>",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
%>
<!-- 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>互联网</td>
<td align=right bgcolor=#eeeeee><nobr>找到符合<b><%=wd%></b>的相关网页<b><%=strpagesum_bd%></b>篇,用时<b><%=strqtime_bd%></b>秒</nobr> </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> 您好,请在搜索框中输入关键词.</font></p>"
elseif bnoresult_bd=1 then
response.write "<p align='center' ><font size=-1> 抱歉,未找到任何符合您查询条件的信息,请重新选择合适的关键词进行查询.</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> 这是你发挥的空间!
</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>
程序更新请到这里<span class="cred">(知识分享论坛)</span>查看</font>
</div>
</body>
</html>
<%
'采集函数
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>服务器获取文件内容出错</b></div>"
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 = "<p align='center' ><font size=-1>截取字符串出错.</font></p>"
err.clear
exit function
else
strcut = mid(strcontent,s1,s2-s1)
end if
end function
%>
把上面的代码copy到记事本保存为searchi_bd.asp,就可以使用了。如果你要更改文件名,请同时把以下代码中蓝色标识部分改为你的文件名
strpage = replace(strpage,"href=s?","href=searchi_bd.asp?")
几点说明:
1、百度搜索基本上没有什么反采集的措施,主要一点就是百度隔一段时间会更改返回结果页面的源代码,所以要经常观察百度的搜索结果页面,发现代码变动了,就将几处字符串标识改动一下。在反采集方面,百度比google大度多了,目前还没发现由于频繁查询百度而出现暂时屏蔽来源站点ip的现象,而在google查询中经常出现这个现象,如何解决就在下篇文章里谈一谈。
2、采集比较耗资源,搜索小偷程序一样,所以程序中尽量早点释放变量或对象。如果你的空间资源不多,建议就不要搞这些了。
3、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能连接,比如百度快照和站内搜索等功能。为此我在下载包中提供一个无百度任何连接的精简版,你可以根据需要使用,在本文中就不列出代码了,其实和完整版的差不多。
一、认识百度搜索
百度搜索,全球最大中文搜索引擎,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/baidu?ie=utf-8&am ... n&cl=3&word=理想
☆ 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)
<%
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 "<p align='center' ><font size=3> 出错了,请重新打开百度搜索.</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="输入关键字,然后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=gb2312&wd="&wd&am ... &pn&"&cl=3"
'开始采集
strtmp_bd = gethttppage(strurl)
if instr(strtmp_bd,"未找到和您的查询")<>0 then
bnoresult_bd=1
end if
'截取"搜索结果"部分的内容
strinfo = strcut(strtmp_bd,"<div id=scriptdiv></div>","<br clear=all>",2)
patrn="</td></tr></table><br>"
set regex = new regexp ' 建立正则表达式。
regex.pattern = patrn ' 设置模式。
regex.ignorecase = true
regex.global = false
strinfo=regex.replace(strinfo,"")
'截取"分页区"部分的内容
strpage = strcut(strtmp_bd,"<br clear=all>","<br>",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
%>
<!-- 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>互联网</td>
<td align=right bgcolor=#eeeeee><nobr>找到符合<b><%=wd%></b>的相关网页<b><%=strpagesum_bd%></b>篇,用时<b><%=strqtime_bd%></b>秒</nobr> </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> 您好,请在搜索框中输入关键词.</font></p>"
elseif bnoresult_bd=1 then
response.write "<p align='center' ><font size=-1> 抱歉,未找到任何符合您查询条件的信息,请重新选择合适的关键词进行查询.</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> 这是你发挥的空间!
</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>
程序更新请到这里<span class="cred">(知识分享论坛)</span>查看</font>
</div>
</body>
</html>
<%
'采集函数
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>服务器获取文件内容出错</b></div>"
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 = "<p align='center' ><font size=-1>截取字符串出错.</font></p>"
err.clear
exit function
else
strcut = mid(strcontent,s1,s2-s1)
end if
end function
%>
把上面的代码copy到记事本保存为searchi_bd.asp,就可以使用了。如果你要更改文件名,请同时把以下代码中蓝色标识部分改为你的文件名
strpage = replace(strpage,"href=s?","href=searchi_bd.asp?")
几点说明:
1、百度搜索基本上没有什么反采集的措施,主要一点就是百度隔一段时间会更改返回结果页面的源代码,所以要经常观察百度的搜索结果页面,发现代码变动了,就将几处字符串标识改动一下。在反采集方面,百度比google大度多了,目前还没发现由于频繁查询百度而出现暂时屏蔽来源站点ip的现象,而在google查询中经常出现这个现象,如何解决就在下篇文章里谈一谈。
2、采集比较耗资源,搜索小偷程序一样,所以程序中尽量早点释放变量或对象。如果你的空间资源不多,建议就不要搞这些了。
3、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能连接,比如百度快照和站内搜索等功能。为此我在下载包中提供一个无百度任何连接的精简版,你可以根据需要使用,在本文中就不列出代码了,其实和完整版的差不多。
上一篇: 使用FSO把文本信息导入数据库
下一篇: ASP连接11种数据库语法总结