2011-11-17 187 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")