PageSourceSearch

https://elric2011.github.io/a/google_search_api_2.html

html elric2011.github.io collected 2026-10-03 09:09:09 UTC 34,000 bytes, 435 lines download raw bytes

1
2<!DOCTYPE html>
3<html lang="en">
4  <head>
5    <meta charset="utf-8">
6    <meta name="baidu-site-verification" content="oI6a09dnmo" />
7    <title>应用程序获取Google搜索结果(二) - Elric's Tech World</title>
8    <meta name="description" content="介绍如果通过程序去自动获取Google搜索结果,介绍Google Ajax API的使用方法,以及相应的Java程序示例。">
9    <meta name="author" content="elric">
10    
11    <meta name="keywords" content="搜索,google,search,Java,Ajax">
12    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
13    <!--[if lt IE 9]>
14      
14<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
14
15    <![endif]-->
16
17    <!-- Le styles -->
18    <link href="/assets/themes/twitter/css/1.4.0/bootstrap.css" rel="stylesheet">
19    <link href="/assets/themes/twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
20
21    <!-- Le fav and touch icons -->
22  <!-- Update these with your own images
23    <link rel="shortcut icon" href="images/favicon.ico">
24    <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
25    <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
26    <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
27  -->
28  </head>
29
30  <body>
31
32    <div class="topbar">
33      <div class="fill">
34        <div class="container">
35          <a class="brand" href="/">Elric's Tech World</a>
36          <ul class="nav">
37            
38            
39            
40
41
42  
43    
44      
45      	
46      	<li><a href="/archive.html">全部文章</a></li>
47      	
48      
49    
50  
51    
52      
53      	
54      	<li><a href="/categories.html">分类</a></li>
55      	
56      
57    
58  
59    
60      
61      	
62      	<li><a href="/tags.html">标签</a></li>
63      	
64      
65    
66  
67    
68      
69      	
70      	<li><a href="/about.html">关于Elric</a></li>
71      	
72      
73    
74  
75    
76      
77    
78  
79    
80      
81    
82  
83    
84      
85    
86  
87    
88      
89    
90  
91    
92  
93
94
95
96          </ul>
97        </div>
98      </div>
99    </div>
100
101    <div class="container">
102
103      <div class="content">
104        
105<div class="page-header">
106  <h1>应用程序获取Google搜索结果(二) <small></small></h1>
107</div>
108
109<!-- JiaThis Button BEGIN -->
110<div class="jiathis_style">
111	<span class="jiathis_txt">分享到:</span>
112	<a class="jiathis_button_tsina">新浪微博</a>
113	<a class="jiathis_button_tqq">腾讯微博</a>
114	<a class="jiathis_button_renren">人人网</a>
115	<a class="jiathis_button_douban">豆瓣</a>
116	<a class="jiathis_button_twitter">Twitter</a>
117	<a class="jiathis_button_email">邮件</a>
118	<a href="http://www.jiathis.com/share?uid=1822214" class="jiathis jiathis_txt jiathis_separator jtico jtico_jiathis" target="_blank">更多</a>
119	<a class="jiathis_counter_style"></a>
120</div><br>
121<script type="text/javascript" src="http://v3.jiathis.com/code_mini/jia.js?uid=1822214" charset="utf-8"></script>
121
122<!-- JiaThis Button END -->
123<hr>
124<div class="row">
125  <div class="span10">
126    
127<p><a href="/a/google_search_api_1.html">上篇</a>简单介绍了一下利用Google Ajax Search API实现在Java应用程序中访问Google搜索并获取搜索结果的方法原理,这篇将主要贴出几段代码,俩目的:</p>
128
129<p>一,作为上一篇的那些理论知识的一个实例,直观地展现一下到底怎么玩;</p>
130
131<p>二,通过面向对象的思想(吾尚为菜鸟级人物,还谈不上思想,求原谅),将这个API进行了简单的封装,实现了一个GoogleSearcher类,以屏蔽URLConnection连接网络、解析JSON字符串这些复杂的细节。(小说一下,这些代码谈不上任何版权问题,你要是觉得还方便就随便拿着用)</p>
132
133<p>GoogleSearcher类:</p>
134
135<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">/**</span>
136 <span class="p">*</span> <span class="p">@</span><span class="n">author</span> <span class="n">Elric</span>
137 <span class="p">*/</span>
138<span class="k">package</span> <span class="n">google</span><span class="p">;</span>
139
140<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">io</span><span class="p">.*;</span>
141<span class="n">import</span> <span class="n">java</span><span class="p">.</span><span class="n">net</span><span class="p">.*;</span>
142
143<span class="p">//</span> <span class="n">import</span> <span class="n">org</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">JSONException</span><span class="p">;</span>
144<span class="n">import</span> <span class="n">org</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">JSONObject</span><span class="p">;</span>
145<span class="n">import</span> <span class="n">org</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">JSONArray</span><span class="p">;</span>
146
147<span class="k">public</span> <span class="n">class</span> <span class="n">GoogleSearcher</span> <span class="p">{</span>
148
149    <span class="k">public</span> <span class="n">GoogleSearcher</span><span class="p">()</span> <span class="p">{</span>
150        <span class="n">this</span><span class="p">(</span><span class="m">4</span><span class="p">);</span>
151    <span class="p">}</span>
152
153    <span class="k">public</span> <span class="n">GoogleSearcher</span><span class="p">(</span><span class="n">int</span> <span class="n">amount</span><span class="p">)</span> <span class="p">{</span>
154        <span class="n">this</span><span class="p">.</span><span class="n">amountOfResults</span> <span class="p">=</span> <span class="n">amount</span><span class="p">;</span>
155        <span class="n">this</span><span class="p">.</span><span class="n">searchResults</span> <span class="p">=</span> <span class="n">null</span><span class="p">;</span>
156    <span class="p">}</span>
157
158    <span class="k">public</span> <span class="n">void</span> <span class="n">search</span><span class="p">(</span><span class="k">String</span> <span class="n">keyword</span><span class="p">)</span> <span class="p">{</span>
159        <span class="n">this</span><span class="p">.</span><span class="n">keyword</span> <span class="p">=</span> <span class="n">keyword</span><span class="p">;</span>
160        <span class="n">searchResults</span> <span class="p">=</span> <span class="n">new</span> <span class="n">GoogleSearchResult</span><span class="p">[</span><span class="n">amountOfResults</span><span class="p">];</span>
161        <span class="n">URL</span> <span class="n">url</span> <span class="p">=</span> <span class="n">null</span><span class="p">;</span>
162        <span class="k">String</span> <span class="n">urlString</span> <span class="p">=</span> <span class="n">generalUrl</span> <span class="p">+</span> <span class="n">keyword</span><span class="p">.</span><span class="n">replaceAll</span><span class="p">(</span><span class="s2">"</span><span class="se">\\</span><span class="s2">s+"</span><span class="p">,</span> <span class="s2">"%20"</span><span class="p">);</span>
163        <span class="n">try</span> <span class="p">{</span>
164            <span class="n">JSONArray</span> <span class="n">jsonArr</span> <span class="p">=</span> <span class="n">null</span><span class="p">;</span>
165            <span class="n">int</span> <span class="n">index</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
166
167            <span class="n">for</span> <span class="p">(</span><span class="n">int</span> <span class="n">i</span><span class="p">=</span><span class="m">0</span><span class="p">;</span> <span class="n">i</span><span class="p">&lt;</span><span class="n">amountOfResults</span><span class="p">;</span> <span class="p">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
168                <span class="k">if</span> <span class="p">(</span><span class="n">jsonArr</span> <span class="p">==</span> <span class="n">null</span> <span class="p">||</span> <span class="n">index</span> <span class="p">&gt;=</span> <span class="n">jsonArr</span><span class="p">.</span><span class="n">length</span><span class="p">())</span> <span class="p">{</span>
169                    <span class="n">url</span> <span class="p">=</span> <span class="n">new</span> <span class="n">URL</span><span class="p">(</span><span class="n">urlString</span> <span class="p">+</span> <span class="s2">"&amp;start="</span> <span class="p">+</span> <span class="n">i</span><span class="p">);</span>
170                    <span class="p">//</span> <span class="nf">System</span><span class="p">.</span><span class="n">out</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">url</span><span class="p">);</span>
171                    <span class="n">URLConnection</span> <span class="n">conn</span> <span class="p">=</span> <span class="n">url</span><span class="p">.</span><span class="n">openConnection</span><span class="p">();</span>
172                    <span class="n">conn</span><span class="p">.</span><span class="n">addRequestProperty</span><span class="p">(</span><span class="s2">"Referer"</span><span class="p">,</span>
173                            <span class="s2">"http://www.informatik.uni-trier.de/~ley/db/"</span><span class="p">);</span>
174
175                    <span class="n">StringBuilder</span> <span class="n">builder</span> <span class="p">=</span> <span class="n">new</span> <span class="n">StringBuilder</span><span class="p">();</span>
176                    <span class="n">BufferedReader</span> <span class="n">br</span> <span class="p">=</span> <span class="n">new</span> <span class="n">BufferedReader</span><span class="p">(</span>
177                            <span class="n">new</span> <span class="n">InputStreamReader</span><span class="p">(</span><span class="n">conn</span><span class="p">.</span><span class="n">getInputStream</span><span class="p">(),</span> <span class="s2">"utf-8"</span><span class="p">));</span>
178                    <span class="k">String</span> <span class="n">line</span><span class="p">;</span>
179                    <span class="k">while</span> <span class="p">((</span><span class="n">line</span> <span class="p">=</span> <span class="n">br</span><span class="p">.</span><span class="n">readLine</span><span class="p">())</span> <span class="c1">!= null) {
180</span>                        <span class="n">builder</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">);</span>
181                    <span class="p">}</span>
182                    <span class="n">br</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
183                    <span class="p">//</span> <span class="nf">System</span><span class="p">.</span><span class="n">out</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">builder</span><span class="p">.</span><span class="n">toString</span><span class="p">());</span>
184                    <span class="n">jsonArr</span> <span class="p">=</span> <span class="n">new</span> <span class="n">JSONObject</span><span class="p">(</span><span class="n">builder</span><span class="p">.</span><span class="n">toString</span><span class="p">()).</span>
185                            <span class="n">getJSONObject</span><span class="p">(</span><span class="s2">"responseData"</span><span class="p">).</span><span class="n">getJSONArray</span><span class="p">(</span><span class="s2">"results"</span><span class="p">);</span>
186                    <span class="n">index</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
187                <span class="p">}</span>
188                <span class="n">JSONObject</span> <span class="n">jsonObj</span> <span class="p">=</span> <span class="n">jsonArr</span><span class="p">.</span><span class="n">getJSONObject</span><span class="p">(</span><span class="n">index</span><span class="p">);</span>
189                <span class="n">GoogleSearchResult</span> <span class="n">result</span> <span class="p">=</span> <span class="n">new</span> <span class="n">GoogleSearchResult</span><span class="p">();</span>
190                <span class="n">result</span><span class="p">.</span><span class="n">setGSearchResultClass</span><span class="p">(</span>
191                        <span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"GsearchResultClass"</span><span class="p">));</span>
192                <span class="n">result</span><span class="p">.</span><span class="n">setUnescapedUrl</span><span class="p">(</span><span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"unescapedUrl"</span><span class="p">));</span>
193                <span class="n">result</span><span class="p">.</span><span class="n">setUrl</span><span class="p">(</span><span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"url"</span><span class="p">));</span>
194                <span class="n">result</span><span class="p">.</span><span class="n">setVisibleUrl</span><span class="p">(</span><span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"visibleUrl"</span><span class="p">));</span>
195                <span class="n">result</span><span class="p">.</span><span class="n">setCacheUrl</span><span class="p">(</span><span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"cacheUrl"</span><span class="p">));</span>
196                <span class="n">result</span><span class="p">.</span><span class="n">setTitle</span><span class="p">(</span><span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"title"</span><span class="p">));</span>
197                <span class="n">result</span><span class="p">.</span><span class="n">setTitleNoFormatting</span><span class="p">(</span>
198                        <span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"titleNoFormatting"</span><span class="p">));</span>
199                <span class="n">result</span><span class="p">.</span><span class="n">setContent</span><span class="p">(</span><span class="n">jsonObj</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"content"</span><span class="p">));</span>
200                <span class="n">searchResults</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="n">result</span><span class="p">;</span>
201
202                <span class="p">++</span><span class="n">index</span><span class="p">;</span>
203            <span class="p">}</span>
204        <span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
205            <span class="n">searchResults</span> <span class="p">=</span> <span class="n">null</span><span class="p">;</span>
206            <span class="n">e</span><span class="p">.</span><span class="n">printStackTrace</span><span class="p">();</span>
207        <span class="p">}</span>
208    <span class="p">}</span>
209
210    <span class="p">/*</span> <span class="k">public</span> <span class="n">static</span> <span class="n">void</span> <span class="n">main</span><span class="p">(</span><span class="k">String</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
211        <span class="n">GoogleSearcher</span> <span class="n">gs</span> <span class="p">=</span> <span class="n">new</span> <span class="n">GoogleSearcher</span><span class="p">(</span><span class="m">16</span><span class="p">);</span>
212        <span class="n">gs</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"Paris Hilton"</span><span class="p">);</span>
213        <span class="n">GoogleSearchResult</span><span class="p">[]</span> <span class="n">rs</span> <span class="p">=</span> <span class="n">gs</span><span class="p">.</span><span class="n">getSearchResults</span><span class="p">();</span>
214        <span class="n">for</span> <span class="p">(</span><span class="n">int</span> <span class="n">i</span><span class="p">=</span><span class="m">0</span><span class="p">;</span> <span class="n">i</span><span class="p">&lt;</span><span class="n">rs</span><span class="p">.</span><span class="n">length</span><span class="p">;</span> <span class="p">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
215            <span class="nf">System</span><span class="p">.</span><span class="n">out</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">rs</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">getUnescapedUrl</span><span class="p">());</span>
216        <span class="p">}</span>
217    <span class="p">}</span> <span class="p">*/</span>
218
219    <span class="k">public</span> <span class="k">String</span> <span class="n">getKeyword</span><span class="p">()</span> <span class="p">{</span>
220        <span class="n">return</span> <span class="n">keyword</span><span class="p">;</span>
221    <span class="p">}</span>
222    <span class="k">public</span> <span class="n">int</span> <span class="n">getAmountOfResults</span><span class="p">()</span> <span class="p">{</span>
223        <span class="n">return</span> <span class="n">amountOfResults</span><span class="p">;</span>
224    <span class="p">}</span>
225    <span class="k">public</span> <span class="n">void</span> <span class="n">setAmountOfResults</span><span class="p">(</span><span class="n">int</span> <span class="n">amountOfResults</span><span class="p">)</span> <span class="p">{</span>
226        <span class="n">this</span><span class="p">.</span><span class="n">amountOfResults</span> <span class="p">=</span> <span class="n">amountOfResults</span><span class="p">;</span>
227        <span class="n">this</span><span class="p">.</span><span class="n">searchResults</span> <span class="p">=</span> <span class="n">null</span><span class="p">;</span>
228    <span class="p">}</span>
229    <span class="k">public</span> <span class="n">GoogleSearchResult</span><span class="p">[]</span> <span class="n">getSearchResults</span><span class="p">()</span> <span class="p">{</span>
230        <span class="n">return</span> <span class="n">searchResults</span><span class="p">;</span>
231    <span class="p">}</span>
232
233    <span class="n">protected</span> <span class="k">String</span> <span class="n">keyword</span><span class="p">;</span>
234    <span class="n">protected</span> <span class="n">int</span> <span class="n">amountOfResults</span><span class="p">;</span>
235    <span class="n">protected</span> <span class="n">GoogleSearchResult</span><span class="p">[]</span> <span class="n">searchResults</span><span class="p">;</span>
236    <span class="n">protected</span> <span class="n">final</span> <span class="k">String</span> <span class="n">generalUrl</span> <span class="p">=</span>
237            <span class="s2">"http://ajax.googleapis.com/ajax/services/search/web?v=1.0&amp;rsz=large&amp;q="</span><span class="p">;</span>
238<span class="p">}</span>
239</code></pre></div></div>
240
241<p>GoogleSearchResult类:</p>
242
243<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">/**</span>
244 <span class="p">*</span> <span class="p">@</span><span class="n">author</span> <span class="n">Elric</span>
245 <span class="p">*/</span>
246<span class="k">package</span> <span class="n">google</span><span class="p">;</span>
247
248<span class="k">public</span> <span class="n">class</span> <span class="n">GoogleSearchResult</span> <span class="p">{</span>
249
250    <span class="k">public</span> <span class="k">String</span> <span class="n">getSearchResultClass</span><span class="p">()</span> <span class="p">{</span>
251        <span class="n">return</span> <span class="n">gSearchResultClass</span><span class="p">;</span>
252    <span class="p">}</span>
253    <span class="k">public</span> <span class="n">void</span> <span class="n">setGSearchResultClass</span><span class="p">(</span><span class="k">String</span> <span class="n">searchResultClass</span><span class="p">)</span> <span class="p">{</span>
254        <span class="n">this</span><span class="p">.</span><span class="n">gSearchResultClass</span> <span class="p">=</span> <span class="n">searchResultClass</span><span class="p">;</span>
255    <span class="p">}</span>
256    <span class="k">public</span> <span class="k">String</span> <span class="n">getUnescapedUrl</span><span class="p">()</span> <span class="p">{</span>
257        <span class="n">return</span> <span class="n">unescapedUrl</span><span class="p">;</span>
258    <span class="p">}</span>
259    <span class="k">public</span> <span class="n">void</span> <span class="n">setUnescapedUrl</span><span class="p">(</span><span class="k">String</span> <span class="n">unescapedUrl</span><span class="p">)</span> <span class="p">{</span>
260        <span class="n">this</span><span class="p">.</span><span class="n">unescapedUrl</span> <span class="p">=</span> <span class="n">unescapedUrl</span><span class="p">;</span>
261    <span class="p">}</span>
262    <span class="k">public</span> <span class="k">String</span> <span class="n">getUrl</span><span class="p">()</span> <span class="p">{</span>
263        <span class="n">return</span> <span class="n">url</span><span class="p">;</span>
264    <span class="p">}</span>
265    <span class="k">public</span> <span class="n">void</span> <span class="n">setUrl</span><span class="p">(</span><span class="k">String</span> <span class="n">url</span><span class="p">)</span> <span class="p">{</span>
266        <span class="n">this</span><span class="p">.</span><span class="n">url</span> <span class="p">=</span> <span class="n">url</span><span class="p">;</span>
267    <span class="p">}</span>
268    <span class="k">public</span> <span class="k">String</span> <span class="n">getVisibleUrl</span><span class="p">()</span> <span class="p">{</span>
269        <span class="n">return</span> <span class="n">visibleUrl</span><span class="p">;</span>
270    <span class="p">}</span>
271    <span class="k">public</span> <span class="n">void</span> <span class="n">setVisibleUrl</span><span class="p">(</span><span class="k">String</span> <span class="n">visibleUrl</span><span class="p">)</span> <span class="p">{</span>
272        <span class="n">this</span><span class="p">.</span><span class="n">visibleUrl</span> <span class="p">=</span> <span class="n">visibleUrl</span><span class="p">;</span>
273    <span class="p">}</span>
274    <span class="k">public</span> <span class="k">String</span> <span class="n">getCacheUrl</span><span class="p">()</span> <span class="p">{</span>
275        <span class="n">return</span> <span class="n">cacheUrl</span><span class="p">;</span>
276    <span class="p">}</span>
277    <span class="k">public</span> <span class="n">void</span> <span class="n">setCacheUrl</span><span class="p">(</span><span class="k">String</span> <span class="n">cacheUrl</span><span class="p">)</span> <span class="p">{</span>
278        <span class="n">this</span><span class="p">.</span><span class="n">cacheUrl</span> <span class="p">=</span> <span class="n">cacheUrl</span><span class="p">;</span>
279    <span class="p">}</span>
280    <span class="k">public</span> <span class="k">String</span> <span class="n">getTitle</span><span class="p">()</span> <span class="p">{</span>
281        <span class="n">return</span> <span class="n">title</span><span class="p">;</span>
282    <span class="p">}</span>
283    <span class="k">public</span> <span class="n">void</span> <span class="n">setTitle</span><span class="p">(</span><span class="k">String</span> <span class="n">title</span><span class="p">)</span> <span class="p">{</span>
284        <span class="n">this</span><span class="p">.</span><span class="n">title</span> <span class="p">=</span> <span class="n">title</span><span class="p">;</span>
285    <span class="p">}</span>
286    <span class="k">public</span> <span class="k">String</span> <span class="n">getTitleNoFormatting</span><span class="p">()</span> <span class="p">{</span>
287        <span class="n">return</span> <span class="n">titleNoFormatting</span><span class="p">;</span>
288    <span class="p">}</span>
289    <span class="k">public</span> <span class="n">void</span> <span class="n">setTitleNoFormatting</span><span class="p">(</span><span class="k">String</span> <span class="n">titleNoFormatting</span><span class="p">)</span> <span class="p">{</span>
290        <span class="n">this</span><span class="p">.</span><span class="n">titleNoFormatting</span> <span class="p">=</span> <span class="n">titleNoFormatting</span><span class="p">;</span>
291    <span class="p">}</span>
292    <span class="k">public</span> <span class="k">String</span> <span class="n">getContent</span><span class="p">()</span> <span class="p">{</span>
293        <span class="n">return</span> <span class="n">content</span><span class="p">;</span>
294    <span class="p">}</span>
295    <span class="k">public</span> <span class="n">void</span> <span class="n">setContent</span><span class="p">(</span><span class="k">String</span> <span class="n">content</span><span class="p">)</span> <span class="p">{</span>
296        <span class="n">this</span><span class="p">.</span><span class="n">content</span> <span class="p">=</span> <span class="n">content</span><span class="p">;</span>
297    <span class="p">}</span>
298
299    <span class="n">protected</span> <span class="k">String</span> <span class="n">gSearchResultClass</span><span class="p">;</span>
300    <span class="n">protected</span> <span class="k">String</span> <span class="n">unescapedUrl</span><span class="p">;</span>
301    <span class="n">protected</span> <span class="k">String</span> <span class="n">url</span><span class="p">;</span>
302    <span class="n">protected</span> <span class="k">String</span> <span class="n">visibleUrl</span><span class="p">;</span>
303    <span class="n">protected</span> <span class="k">String</span> <span class="n">cacheUrl</span><span class="p">;</span>
304    <span class="n">protected</span> <span class="k">String</span> <span class="n">title</span><span class="p">;</span>
305    <span class="n">protected</span> <span class="k">String</span> <span class="n">titleNoFormatting</span><span class="p">;</span>
306    <span class="n">protected</span> <span class="k">String</span> <span class="n">content</span><span class="p">;</span>
307<span class="p">}</span>
308</code></pre></div></div>
309
310<p>代码说明:</p>
311
312<p>GoogleSearchResult类,这个类定义了很多字段,这些字段分别对应JSON字符串中每条搜索记录的各个属性(名字都一样),然后定义了各字段的getter和setter,仅此而已,因此这个类就是将每条搜索记录封装了起来,每个GoogleSearchResult对象就对应一条搜索记录。</p>
313
314<p>GoogleSearcher类,我们从字段着手,先看generalUrl字符串,这就是Ajax API提供给我们的URL,只不过关键词这个属性我们还没有填,等实际运行的时候游用户动态添加,另外这个URL里多了个rsz属性,这个属性的作用我们待会再解释。keyword字段,很显然,就是用户输入的关键词。amountOfResults,这是干什么的呢?当我们在浏览器中Google一个关键词后,Google返回的肯定不止一条搜索结果,这个API也一样,也是返回多条记录,而amountOfResults这个字段就是用于设置记录的条数的。这也解释了为什么searchResults字段是一个GoogleSearchResult数组,而不是一个GoogleSearchResult对象。这个数组的长度就是amountOfResults。</p>
315
316<p>再看构造器,构造器里面初始化了amountOfResults字段,默认为4条。注意,这里并没有在构造器中初始化keyword字段,因为我希望将这个GoogleSearcher类设计成一个Searcher可以进行多次搜索,搜索多个关键词,所以我并没有选择在初始化的时候设置keyword。</p>
317
318<p>接下来就是我们的主体,search()方法,这个方法就是我们要用的搜索方法了,参数keyword就是要搜索的关键词。这个方法返回的是void,在调用该方法后需要调用GoogleSearchResult()方法来获取搜索结果。我们进入search()来看一下有哪些需要注意一下。</p>
319
320<ol>
321  <li>第28行,将关键词中的空格替换成”%20”,在URL中空格需要用转义字符”%20”表示;</li>
322  <li>
322第33行,for循环,很显然是获取amountOfResults条搜索结果。下面的if是做什么的呢?可以看到,连接到网络以及从网络获取搜索结果的部分都是在if中,而且在for循环中可能需要多次访问网络。这是因为Ajax API是以页的形式返回搜索结果的,每一页中只包含若干条搜索记录,如果需要更多的搜索记录,就需要多次连接网络。如何使这些不同的连接能获得不同的记录呢?通过URL中”start”属性设置。这个属性用于设置当前获取的页是从第几条记录开始的。例如我们获取了一页,这一页里有第0~3条记录,现在要获取第4条记录,就需要再访问一次网络,并将URL中start设为4,我们会再获得一页,其中包含了第4~7条记录,以此类推。这时候就可以解释前面提到的rsz属性了,这个属性就是设置一页中记录的条数,large表示每页8条记录。更多关于URL中可用属性的说明可访问<a href="http://code.google.com/apis/ajaxsearch/documentation/reference.html#_intro_fonje">http://code.google.com/apis/ajaxsearch/documentation/reference.html#_intro_fonje</a>。</li>
323  <li>第50行,解析JSON字符串,获取其中的results部分,这部分是一个包含多条搜索记录的JSON数组,第54行是获取JSON数组中代表每一条搜索记录的JSON对象,后面几行就是提取JSON对象中的信息,并封装到一个GoogleSearchResult对象中,形成一个搜索记录。第66行,将这条搜索记录存放到searchResults数组中,以便通过调用GoogleSearchResult()方法来获取这amountOfResults条搜索记录。</li>
324</ol>
325
326<p>补充说明:</p>
327
328<ul>
329  <li>这些代码中只给出了一个基本的搜索功能的实现,Ajax API提供的URL还有一些属性可以设置,同时返回的JSON字符串中除搜索结果以外还包含其它信息,如果你的应用程序需要用到这些属性或者这些信息,可以参考Google提供的文档。前文中包含了部分文档页的链接。</li>
330  <li>要知道搜索只是第一步,我们通过浏览器Google一个关键词时是需要打开搜索结果中链接的页面,从中找出我们想要的信息。如何让我们的应用程序从搜索结果所指向的页面中获取我们需要的信息(有时我们还需要从搜索结果中挑选出哪一条记录才是指向我们想要的页面),这些才是需要大学问的。</li>
331</ul>
332
333    <hr>
334    <div class="pagination">
335      <ul>
336      
337        <li class="prev"><a href="/a/google_search_api_1.html" title="应用程序获取Google搜索结果(一)">&larr; Previous</a></li>
338      
339        <li><a href="/archive.html">Archive</a></li>
340      
341        <li class="next"><a href="/a/nginx_location.html" title="Nginx Location使用详解">Next &rarr;</a></li>
342      
343      </ul>
344    </div>
345    <hr>
346    
347
348
349  <div id="disqus_thread"></div>
350<script type="text/javascript">
351    
352    var disqus_shortname = 'elric2011'; // required: replace example with your forum shortname
353    
354    /* * * DON'T EDIT BELOW THIS LINE * * */
355    (function() {
356        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
357        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
358        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
359    })();
360</script>
360
361<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
362<a href="http://disqus.com" class="dsq-brlink">blog comments powered by <span class="logo-disqus">Disqus</span></a>
363
364
365
366
367  </div>
368  
369  <div class="span4">
370    <h4>Published</h4>
371    <div class="date"><span>29 July 2010</span></div>
372
373  
374    <h4>Tags</h4>
375    <ul class="tag_box">
376    
377    
378
379
380  
381     
382    	<li><a href="/tags.html#搜索-ref">搜索 <span>2</span></a></li>
383     
384    	<li><a href="/tags.html#google-ref">google <span>2</span></a></li>
385     
386    	<li><a href="/tags.html#search-ref">search <span>2</span></a></li>
387     
388    	<li><a href="/tags.html#Java-ref">Java <span>6</span></a></li>
389     
390    	<li><a href="/tags.html#Ajax-ref">Ajax <span>2</span></a></li>
391    
392  
393
394
395
396    </ul>
397    
398  </div>
399</div>
400
401
402      </div>
403
404      <footer>
405        <p>&copy; elric 2011
406        </p>
407      </footer>
408
409    </div> <!-- /container -->
410
411    
412
413
414  
414<script type='text/javascript'>
415!function(e,t,n,g,i){e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},n=t.createElement("script"),tag=t.getElementsByTagName("script")[0],n.async=1,n.src=('https:'==document.location.protocol?'https://':'http://')+g,tag.parentNode.insertBefore(n,tag)}(window,document,"script","assets.growingio.com/2.1/gio.js","gio");
416  gio('init', '856f9b16c13aad4b', {});
417
418gio('send');
419</script>
419
420
421
422
423    
424
425
426  
426<script type="text/javascript">
427var jiathis_config = {data_track_clickback:'true'};
428</script>
vendor: 1 bytes, line 428
428
429<script type="text/javascript" src="http://v3.jiathis.com/code/jiathis_r.js?move=0&amp;btn=r2.gif&amp;uid=1366511011022909" charset="utf-8"></script>
429
430
431
432
433  </body>
434</html>
435

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.