如何以编程方式searchGoogle API
有谁知道是否以及如何以编程方式searchGoogle – 特别是如果有Java API的话?
一些事实:
-
Google提供了一个返回JSON的公开searchwebservice API: http : //ajax.googleapis.com/ajax/services/search/web 。 文档在这里
-
Java提供了
java.net.URL
和java.net.URLConnection
来触发和处理HTTP请求。 -
可以使用任意的Java JSON API将Java中的JSON转换为完全可用的Javabean对象。 其中最棒的是Google Gson 。
现在做math:
public static void main(String[] args) throws Exception { String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="; String search = "stackoverflow"; String charset = "UTF-8"; URL url = new URL(google + URLEncoder.encode(search, charset)); Reader reader = new InputStreamReader(url.openStream(), charset); GoogleResults results = new Gson().fromJson(reader, GoogleResults.class); // Show title and URL of 1st result. System.out.println(results.getResponseData().getResults().get(0).getTitle()); System.out.println(results.getResponseData().getResults().get(0).getUrl()); }
使用这个Javabean类代表Google返回的最重要的JSON数据(实际上它会返回更多的数据,但是作为一个练习来扩展这个Javabean代码):
public class GoogleResults { private ResponseData responseData; public ResponseData getResponseData() { return responseData; } public void setResponseData(ResponseData responseData) { this.responseData = responseData; } public String toString() { return "ResponseData[" + responseData + "]"; } static class ResponseData { private List<Result> results; public List<Result> getResults() { return results; } public void setResults(List<Result> results) { this.results = results; } public String toString() { return "Results[" + results + "]"; } } static class Result { private String url; private String title; public String getUrl() { return url; } public String getTitle() { return title; } public void setUrl(String url) { this.url = url; } public void setTitle(String title) { this.title = title; } public String toString() { return "Result[url:" + url +",title:" + title + "]"; } } }
也可以看看:
- 如何使用
java.net.URLConnection
触发和处理HTTP请求 - 如何将JSON转换为Java
自2010年11月以来的更新 (上述回答后的2个月),公开searchWeb服务已经被弃用 (服务的最后一天是2014年9月29日)。 现在最好的办法是直接查询http://www.google.com/search以及诚实的用户代理,然后使用HTMLparsing器parsing结果。; 如果你省略了用户代理,那么你得到了403回。 如果你躺在用户代理和模拟一个网页浏览器(例如Chrome或Firefox),那么你会得到一个更大的HTML回应,这是一个浪费带宽和性能。
下面是一个使用Jsoup作为HTMLparsing器的启动示例:
String google = "http://www.google.com/search?q="; String search = "stackoverflow"; String charset = "UTF-8"; String userAgent = "ExampleBot 1.0 (+http://example.com/bot)"; // Change this to your company's name and bot homepage! Elements links = Jsoup.connect(google + URLEncoder.encode(search, charset)).userAgent(userAgent).get().select(".g>.r>a"); for (Element link : links) { String title = link.text(); String url = link.absUrl("href"); // Google returns URLs in format "http://www.google.com/url?q=<url>&sa=U&ei=<someKey>". url = URLDecoder.decode(url.substring(url.indexOf('=') + 1, url.indexOf('&')), "UTF-8"); if (!url.startsWith("http")) { continue; // Ads/news/etc. } System.out.println("Title: " + title); System.out.println("URL: " + url); }
在谷歌的服务条款,我们可以阅读:
5.3除非通过与Google单独签署的协议明确允许,否则您同意不以任何方式通过Google提供的界面访问(或尝试访问)任何服务。 您特别同意不通过任何自动方式(包括使用脚本或networking抓取工具)访问(或尝试访问)任何服务,并确保您遵守服务中提供的任何robots.txt文件中的说明。
所以我想答案是否定的。更多的SOAP API不再可用
确实有一个API以编程方式search谷歌。 该API被称为谷歌自定义search。 要使用此API,您需要一个Google Developer API密钥和一个cx密钥 。 在我的博客http://preciselyconcise.com/apis_and_installations/search_google_programmatically.php中解释了一个从java程序访问Googlesearch的简单过程;
Google TOS在2014年4月已经放松了一些。现在它说:
“不要滥用我们的服务,例如,不要干涉我们的服务,或者尝试使用我们提供的界面和说明以外的方法来访问它们。”
所以关于“自动化手段”和脚本的文章现在已经消失了。 它显然仍然不是所希望的(通过谷歌)访问他们的服务的方式,但我认为它现在正式开放来解释什么是“接口”是什么,以及是否有任何区别如何处理返回的HTML(渲染或parsing)。 无论如何,我已经写了一个Java便利库,由您来决定是否使用它:
考虑到去年的TOS改动,我们build立了一个API来访问Google的search。 这只是为了我们自己的使用,但经过一些要求,我们决定打开它。 我们计划在未来添加更多的search引擎!
任何人都应该寻找一个简单的方法来实现/获取search结果,你可以自由地注册并给REST API一个尝试: https : //searchapi.io
它返回JSON结果,应该很容易实现与详细的文档。
Bing和雅虎在Google这方面遥遥领先,这真是一个耻辱。 他们的API不便宜,但至less可用。
要使用APIsearchGoogle,您应该使用Google自定义search , 不允许抓取网页
在Java中,您可以使用Java的CustomSearch API客户端库
maven的依赖是:
<dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-customsearch</artifactId> <version>v1-rev57-1.23.0</version> </dependency>
使用Google CustomSearch API客户端库search示例代码
public static void main(String[] args) throws GeneralSecurityException, IOException { String searchQuery = "test"; //The query to search String cx = "002845322276752338984:vxqzfa86nqc"; //Your search engine //Instance Customsearch Customsearch cs = new Customsearch.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null) .setApplicationName("MyApplication") .setGoogleClientRequestInitializer(new CustomsearchRequestInitializer("your api key")) .build(); //Set search parameter Customsearch.Cse.List list = cs.cse().list(searchQuery).setCx(cx); //Execute search Search result = list.execute(); if (result.getItems()!=null){ for (Result ri : result.getItems()) { //Get title, link, body etc. from search System.out.println(ri.getTitle() + ", " + ri.getLink()); } } }
正如你所看到的,你将需要请求一个API密钥,并build立一个自己的search引擎ID,CX 。
请注意,在安装cx时,您可以通过在基本选项卡设置中select“search整个networking”来search整个networking,但结果与正常的浏览器谷歌search不完全相同。
目前(回答date),你每天可以免费获得100个API,然后谷歌喜欢分享你的利润。