2011-11-17 132 views
4

我想要在谷歌上搜索特定關鍵字搜索的所有搜索結果。我已經看到了刮擦的建議,但這似乎是一個壞主意。我已經看到了Gems(我打算使用ruby)來搞定和使用API​​。我也看到了使用API​​的建議。獲取谷歌搜索結果的正確方法是什麼?

有誰知道現在這樣做的最好方法嗎?該API不再被支持,我看到有人報告他們得到了無法使用的數據。寶石是否有助於解決這個問題?

在此先感謝。

回答

1

自定義搜索API最有可能的是不是你要找的東西。我很確定你必須建立一個自定義搜索引擎,你可以使用API​​來查詢,並且這隻能搜索用戶指定的一組域(即你不能執行一般的網頁搜索)。

如果您需要執行一般的Google搜索,那麼抓取是當前唯一的方法。編寫Ruby代碼來執行Google搜索和刮取搜索結果URL(我自己做了一個夏季研究項目)很容易,但它確實違反了Google的TOS,所以要警告。

+0

理查德,我確實有這方面的工作(有點)見:http://stackoverflow.com/questions/8173962/json-parsing -google-api-custom-search-error,這將返回來自整個網絡的結果。是的,您必須設置一個自定義搜索引擎,但是當您執行API查詢時,您實際上並未從中提取。 –

+1

感謝您指出這一點,我完全沒有意識到! –

9

我也會選擇scrape選項,它的速度比谷歌要求的還要快,而且每天你不限於100次搜索查詢。正如理查德指出的那樣,谷歌的TOS是一個問題。 Here's一個例子從來就做到這一點對我的作品 - 如果你想通過代理連接it's也有用:

require 'rubygems' 
require 'mechanize' 

agent = Mechanize.new 
agent.set_proxy '78.186.178.153', 8080 
page = agent.get('http://www.google.com/') 

google_form = page.form('f') 
google_form.q = 'new york city council' 

page = agent.submit(google_form, google_form.buttons.first) 

page.links.each do |link| 
    if link.href.to_s =~/url.q/ 
     str=link.href.to_s 
     strList=str.split(%r{=|&}) 
     url=strList[1] 
     puts url 
    end 
end 
2

你最終會得到503錯誤,如果你正在運行一個刮刀谷歌搜索結果頁面。更可擴展(合法)的方法是使用Google's Custom Search API

該API每天免費提供100個搜索查詢。如果您需要更多,則可以在Google Developers Console中註冊帳單。其他請求每千次查詢花費5美元,每天查詢高達10k次。

下面以JSON格式獲取的谷歌搜索結果的例子:

require 'open-uri' 
require 'httparty' 
require 'pp' 

def get_google_search_results(search_phrase) 
    # assign api key 
    api_key = "Your api key here" 

    # encode search phrase 
    search_phrase_encoded = URI::encode(search_phrase) 

    # get api response 
    response = HTTParty.get("https://www.googleapis.com/customsearch/v1?q=#{search_phrase_encoded}&key=#{api_key}&num=100") 

    # pretty print api response 
    pp response 

    # get the url of the first search result 
    first_search_result_link = response["items"][0]["link"] 

end 

get_google_search_results("Top Movies in Theatres")