• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    帮你打造属于自己的搜索引擎---百度篇
    想拥有属于自己的搜索引擎吗?采用目前流行的数据采集方法,你就可以立即拥有。下面就教你一步步地去实现。

    一、认识百度搜索

    百度搜索,全球最大中文搜索引擎,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-8am ... ncl=3word=理想

    ☆ 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=gb2312wd="wdam ... 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>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> 您好,请在搜索框中输入关键词./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、有些人可能不愿意在自己做的搜索小偷中保留任何百度的功能连接,比如百度快照和站内搜索等功能。为此我在下载包中提供一个无百度任何连接的精简版,你可以根据需要使用,在本文中就不列出代码了,其实和完整版的差不多。
    上一篇:一个防止被采集的方法
    下一篇:实例讲解ASP实现抓取网上房产信息
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    帮你打造属于自己的搜索引擎---百度篇 帮你,打造,属于,自己的,