2009年6月21日 星期日

Search API in Google and Yahoo, using java

在Google和Yahoo~都有提供一些方法
可以用另一種方式~直接取得搜尋的結果~而不用透過搜尋頁面
以下所敘述的~是如何從 Java 向Google的「AJAX 搜尋 API」提出要求

首先
下面是Google提供的片段程式~(參考頁面)


URL url = new URL("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton");
URLConnection connection = url.openConnection();
connection
.addRequestProperty("Referer", "http://www.mysite.com/index.html");

String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while((line = reader.readLine()) != null) {
builder
.append(line);
}

JSONObject json = new JSONObject(builder.toString());
// now have some fun with the results...



這段程式中~關鍵的地方有兩個

一個是第一行的url
這段url可以決定取回的資料為何
方法就是在最後面加上"&參數名稱=參數的值"
有哪些參數可加~可以參考這裡
比較關鍵的~除了q以外(q是用來指定要搜尋的keyword)
另外rsz可以決定一次取回的筆數~最多8筆~最少4筆
start可以決定從第幾筆開始取

這邊必須提一下~Google的API似乎不允許一次取回超過八筆的資料(但Yahoo可以)
但最多其實可以拿到64筆的搜尋結果~也就是分八次取得
所以關鍵在控制start和rsz這兩個參數~來取得不同的結果

另外一個關鍵的地方~在最後一行指令
取回的資料~是一個json格式的字串
JSONObject json = new JSONObject(builder.toString());
這行指令~可以將取回的字串轉換成對應的json結構
好處是~可以直接使用java內所提供的json的函式~直接取得我們需要的部分資料(如url, title, content...)


這邊另外要介紹一個很重要的東西~就是json
json是一個輕量資料交換的格式
主要是由兩個結構所組成~object和array

object是由{}所包住的name/value配對之集合~
如下圖:

object中的成員~以,分開
每個成員的name和value以:分開

array是由[]所包住~value的集合
如下圖:


以上所謂的value可以是很多東西
如下圖:


在了解了json之後
當要取得所需要的部份資料時
就要從最外層~針對不同的結構~使用不同的函式來取得底下的資料



以上圖為例~在java中
若要取得第一個url的內容
要先用getJSONArray("results")~來取得result這個name對應的value
再以getJSONObject(1)~取回array中的第一個value
最後再以get("url")~就可以得到得到url所對應的值了
重點是要看~將要取回的部分資料是object,array還是其他
來交替使用getJSONObject,getJSONArray,和get


至於Yahoo的部份
其實只差在第一行的url
這個url要怎麼拼湊~可以參考這邊

2 則留言:

  1. 謝謝您提供了如此有益的資訊
    不過身為新手我有一個問題想要請教您
    就是...
    我試圖將json回傳的搜尋結果印出於jList中
    但始終沒有成功
    不知道您是否可以不吝指點>"<
    感謝了!

    回覆刪除
  2. 謝謝您提供的範例,剛好在做這方面的研究

    回覆刪除