加入一个基于GOOGLE的"站内搜索引擎"

时间:2021-07-04 08:33:20

由于这一次的客户只能提供虚拟主机作为项目运行平台,无法搭配中文分词组件,原来自行开发的站内搜索引擎无法发挥最大的功效(主要是不能自动分析关键词,只能通过指定相关索引字段,以及手工输入TAG的机制来生成索引),因此,我们决定转而使用GOOGLE的站内搜索(Google In-Site-Seacrh)作为该项目的主力搜索引擎.

其实GOOGLE的站内搜索其实就是SEO中常用的site:命令.GOOGLE站内搜索接口http://www.google.com/custom,核心参数是q , sitesearch 和 start,这些参数的含义可以参见google 加入一个基于GOOGLE的"站内搜索引擎"   参数 加入一个基于GOOGLE的"站内搜索引擎"  

需要强调的是,在我的实际应用中,q参数只接受经过form_url_encoded编码的字符串,不支持其他编码(不知道是我浏览器的原因还是GOOGLE自身的原因).因此只能通过FORM的GET方法提交,而且FORM必须设置为enctype="application/x-www-form-urlencoded".

定义好接口之后,接下来就是用file_get_contents()向接口发送HTTP请求,获取返回的HTML结果,进入下一步的分析.

以下的实例中的核心代码片段,根据实际情况可能有所不同,在一些关键地方我进行了标注,如有问题,一般就是出在那些地方.

 

加入一个基于GOOGLE的"站内搜索引擎"<? php
加入一个基于GOOGLE的"站内搜索引擎"
//  分析GOOGLE的搜索结果,将有效内容截取到本地
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"// 组合检索条件,发送查询到GOOGLE并获取结果

加入一个基于GOOGLE的"站内搜索引擎"

加入一个基于GOOGLE的"站内搜索引擎"
$q   =   $_GET [ ' q ' ];
加入一个基于GOOGLE的"站内搜索引擎"
$query_url_proto   =   ' http://www.google.cn/custom?ie=UTF-8&sitesearch=nfxm.com&q=[#q]&start=[#PAGE]&complete=1&hl=zh-CN&newwindow=1&cof=&ie=UTF-8&sa=N ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$offset   =  ( is_numeric ( $_GET [ ' start ' ]))  ?   $_GET [ ' start ' :   ' 0 ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$query_url   =   str_replace ( ' [#PAGE] ' ,   $offset ,   str_replace ( ' [#q] ' ,   $q ,   $query_url_proto ));
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
if ( ! $content   =   file_get_contents ( $query_url )) {
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎" 
$result   =   '       <div class="Item" id="Notfound">
加入一个基于GOOGLE的"站内搜索引擎"         <h3>目标主机没有在有效时间内响应</h3>
加入一个基于GOOGLE的"站内搜索引擎"        <br />
加入一个基于GOOGLE的"站内搜索引擎"        建议:
加入一个基于GOOGLE的"站内搜索引擎"           <ul>
加入一个基于GOOGLE的"站内搜索引擎"             <li><a href="javascript:window.loation.reload()">刷新这个页面</a></li>
加入一个基于GOOGLE的"站内搜索引擎"           </ul>
加入一个基于GOOGLE的"站内搜索引擎"      </div>
' ;
加入一个基于GOOGLE的"站内搜索引擎"}
加入一个基于GOOGLE的"站内搜索引擎"
if ( strlen ( $content ) <= 0 ) {
加入一个基于GOOGLE的"站内搜索引擎" 
$result   =   '       <div class="Item" id="Notfound">
加入一个基于GOOGLE的"站内搜索引擎"         <h3>目标主机没有在有效时间内响应</h3>
加入一个基于GOOGLE的"站内搜索引擎"        <br />
加入一个基于GOOGLE的"站内搜索引擎"        建议:
加入一个基于GOOGLE的"站内搜索引擎"           <ul>
加入一个基于GOOGLE的"站内搜索引擎"             <li><a href="javascript:window.loation.reload()">刷新这个页面</a></li>
加入一个基于GOOGLE的"站内搜索引擎"           </ul>
加入一个基于GOOGLE的"站内搜索引擎"      </div>
' ;
加入一个基于GOOGLE的"站内搜索引擎"
else  {
加入一个基于GOOGLE的"站内搜索引擎"
//  代码片段起点 
加入一个基于GOOGLE的"站内搜索引擎"// </form></table></td></tr></table></div>
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"// 代码片断终点
加入一个基于GOOGLE的"站内搜索引擎"// </div></div>
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"// 主分析引擎

加入一个基于GOOGLE的"站内搜索引擎"

加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
$patten   =   ' /</form></table></td></tr></table></div>(.*)</div></div>/ '
加入一个基于GOOGLE的"站内搜索引擎"
/* 如果无法获取结果,有可能是GOOGLE更改了接口的源代码,可以根据实际的接口情况调整这个正则表达式 */
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
$bool   =   preg_match ( $patten ,   $content ,   $match );
加入一个基于GOOGLE的"站内搜索引擎"
//  结果
加入一个基于GOOGLE的"站内搜索引擎"
$result   =   iconv ( ' gb2312 ' ,   ' utf-8 ' ,   $match [ 1 ]);
加入一个基于GOOGLE的"站内搜索引擎"
$content   =   null //  free mempry
加入一个基于GOOGLE的"站内搜索引擎"
$match   =   null ;   //  free memory
加入一个基于GOOGLE的"站内搜索引擎"
if ( strlen ( $result ) <= 0 ) {
加入一个基于GOOGLE的"站内搜索引擎"  
$result   =   '       <div class="Item" id="Notfound">
加入一个基于GOOGLE的"站内搜索引擎"         <h3>找不到和您的查询 &quot;<strong>
' . $q . ' </strong>&quot; 相符的网页。</h3>
加入一个基于GOOGLE的"站内搜索引擎"        <br />
加入一个基于GOOGLE的"站内搜索引擎"        建议:
加入一个基于GOOGLE的"站内搜索引擎"           <ul>
加入一个基于GOOGLE的"站内搜索引擎"             <li>请检查输入字词有无错误。</li>
加入一个基于GOOGLE的"站内搜索引擎"             <li>请换用另外的查询字词。</li>
加入一个基于GOOGLE的"站内搜索引擎"             <li>请改用较常见的字词。</li>
加入一个基于GOOGLE的"站内搜索引擎"    <li>请减少查询字词的数量。</li>
加入一个基于GOOGLE的"站内搜索引擎"           </ul>
加入一个基于GOOGLE的"站内搜索引擎"      </div>
' ;
加入一个基于GOOGLE的"站内搜索引擎"
else  {
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
//  去掉无用的数据
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"// 快照、类似网页等

加入一个基于GOOGLE的"站内搜索引擎"
$result   =   str_replace ( ' 类似网页 ' ,   '' ,   str_replace ( ' 网页快照 ' ,   '' ,   $result ));
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
//  去掉原有的分页连接
加入一个基于GOOGLE的"站内搜索引擎"// 分页图片

加入一个基于GOOGLE的"站内搜索引擎"

加入一个基于GOOGLE的"站内搜索引擎"
$patten_slice_page_img_first   =   ' <img src=/intl/zh-CN/nav_first.gif width=18 height=26 alt=""><br> ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$patten_slice_page_img_next   =   ' <img src=/intl/zh-CN/nav_next.gif width=100 height=26 alt="" border=0><br> ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$patten_slice_page_img_preview   =   ' <img src=/intl/zh-CN/nav_previous.gif width=68 height=26 alt="" border=0><br> ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$patten_slice_page_img_current   =   ' <img src=/intl/zh-CN/nav_current.gif width=16 height=26 alt=""><br> ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$patten_slice_page_img_page   =   ' <img src=/intl/zh-CN/nav_page.gif width=16 height=26 alt="" border=0><br> ' ;
加入一个基于GOOGLE的"站内搜索引擎"
$result   =   str_replace ( $patten_slice_page_img_first ,   '' ,   str_replace ( $patten_slice_page_img_next ,   '' ,   str_replace ( $patten_slice_page_img_preview ,   '' ,   str_replace ( $patten_slice_page_img_current ,   '' ,   str_replace ( $patten_slice_page_img_page ,   '' ,   $result )))));
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
$result   =   str_replace ( ' <table border=0 cellpadding=0 width=1% cellspacing=0 align=center> ' ,   ' <table border=0 cellpadding=5 cellspacing=0 align=center> ' ,   $result );
加入一个基于GOOGLE的"站内搜索引擎"
$result   =   str_replace ( ' /custom? ' ,   ' ./?m=news& ' ,   $result );
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
//  广告连接
加入一个基于GOOGLE的"站内搜索引擎"
$result   =   str_replace ( ' /aclk? ' ,   ' http://www.google.cn/aclk? ' ,   $result );
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
//  重设相关搜索代码
加入一个基于GOOGLE的"站内搜索引擎"

加入一个基于GOOGLE的"站内搜索引擎"
$result   =   str_replace ( ' class=rsl ' ,   ' class=rsl target=_blank ' ,   str_replace ( ' /search? ' ,   ' http://www.google.cn/search? ' ,   $result ));
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"}
加入一个基于GOOGLE的"站内搜索引擎"}
加入一个基于GOOGLE的"站内搜索引擎"
加入一个基于GOOGLE的"站内搜索引擎"
//  $result 就是可以输入的结果,可以在你自己设置好的页面任何位置进行输出
加入一个基于GOOGLE的"站内搜索引擎"
?>
加入一个基于GOOGLE的"站内搜索引擎"

 

效果演示: http://www.nfxm.com/search/?m=news&q=%E5%AF%B9%E8%99%BE  

变量
描述
q $query (您的请求) 用于搜索的字符串
Start 从0 到结果总数 指定搜索的结果显示开始于某一个点。实际上这个就是google用来分页的参数了。google没有page这个参数
num/maxResults 1 -- 100 每页显示的结果数
filter O or 1 是否显示过滤相似结果,1为是,0为否。如果为1,google将会让你在搜索结果的最下面选择将省略的结果纳入搜索范围后再重新搜索
restrict "限制代码".例子:
countryAF (阿富汗) countryAR (阿根廷) countryAU (澳大利亚) countryBE (比利时) countryBM (百慕大群岛)...
限制为某个特定的国家 (使用IP来鉴定... 由于IP的特殊性,google可能会进行错误的判断). Google还有这4个特殊的主题限制: 美国* unclesam; GNU-Linux linux; Macintosh mac; FreeBSD bsd
hl "国家界面代码" 目前国家代码主要有: af, sq, am, ar, az, eu, be, bn, bh, xx-bork, bs, br, bg, ca, zh-CN, zh-TW, hr, cs, da, nl, xx-elmer, en, eo, et, fo, tl, fi, fr, fy, gl, ka, de, el, gn, gu, xx-hacker, iw, hi, hu, is, id, ia, ga, it, ja, jw, kn, xx-klingon, ko, ky, la, lv, lt, mk, ms, ml, mt, mr, ne, no, nn, oc, or, fa, xx-piglatin, pl, pt-BR, pt-PT, pa, ro, ru, gd, sr, sh, st, si, sk, sl, es, su, sw, sv, ta, te, th, ti, tr, tk, tw, uk, ur, uz, vi, cy, xh, yi, zu.
lr 语言限制代码 语言限制. 只显示使用所指定语言的结果. 代码: 阿拉伯语 lang_ar; *(简体) lang_zh-CN; 中国*(繁体) lang_zh-TW; 捷克语 lang_cs; 丹麦语 lang_da; 荷兰语 lang_nl; 英语 lang_en; 爱沙尼亚语 lang_et; 芬兰语 lang_fi; 法语 lang_fr; 德语 lang_de; 希腊语 lang_el; 希伯来语 lang_iw; 匈牙利语 lang_hu; 冰岛语 lang_is; 意大利语 lang_it; 日语 lang_ja; 朝鲜语 lang_ko; 拉托维亚语 lang_lv; 立陶宛语 lang_lt; 挪威语 lang_no; 葡萄牙语 lang_pt; 波兰语 lang_pl; 罗马尼亚语 lang_ro; 俄语 lang_ru; 西班牙语 lang_es; 瑞典语 lang_sv; 土耳其语 lang_tr
ie UTF-8 The input encoding of Web searches. Google suggests UTF-8
oe UTF-8 The output encoding of Web searches. Google suggests UTF-8
as_epq Exact phrase Advanced search: "with the exact phrase". The value is submitted as an exact phrase. It's no more necessary to surround the phrase with quotes.
as_ft i = include file type;
e = exclude file type a file extension
Advanced search: File format: Only | Don't.... Include or exclude the file type indicated by as_filetype (see below)  
as_filetipe file extension Advanced search: File Format: ....return results of the file format. Include or exclude this file type as indicated by the value of as_ft (see above)
as_qdr m3 = past 3 months; m6 = past 6 months; y = past year Advanced search: Date Return web pages updated in the.... Locate pages updated within the specified timeframe
as_nlo low number Find numbers between as_nlo and as_nhi  
as_nhi high number Find numbers between as_nlo and as_nhi
as_oq a list of words Find at least one among the words of the list
as_occt any = anywhere; title = title of page; body = text of page; url = in the page URL; links = in links to the page Advanced search: Occurrences Return results where my terms occur.... Find search term in a specific page location
as_dt i = only include site or domain;
e = exclude site or domain
Advanced search: Domain: Only | Don't.... Include or exclude searches from the domain specified by as_sitesearch (see below)  
as_sitesearch domain or site Advanced search: Domain: ...return results from the site or domain. Include or exclude this domain or site as specified by as_dt (see above)
safe active = 使用安全搜索 off = 禁用安全搜索 是否使用"safe search" (自动审查)
as_rq URL Locate pages similar to this URL
as_lq URL Locate pages that link to this URL.
newwindow 0或1 点击结果是否在新窗口打开.1为是,2为否
c2coff 数字 暂时不知道意思.
sa /(N|.*)/ 暂时不知道意思.
btnG “搜索” 暂时不知道意思.遇到的唯一的值是“搜索”这两个字符
pwst 1 暂时不知道意思.
oi lrtip8 暂时不知道意思.
sitesearch 站点搜索 在sitesearch指定的域名范围内搜索