是否有人知道是否以及如何以编程方式搜索Google - 特别是如果有Java API?
答案 0 :(得分:133)
一些事实:
Google提供了一个公共搜索网络服务API,该API返回JSON:http://ajax.googleapis.com/ajax/services/search/web。 Documentation here
Java提供java.net.URL
和java.net.URLConnection
来触发和处理HTTP请求。
使用任意Java JSON API将Java中的JSON转换为完全可用的Javabean对象。其中最好的是Google Gson。
现在做数学:
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 + "]"; }
}
}
更新自2010年11月(上述答案后2个月),公共搜索网络服务已被弃用(提供服务的最后一天是9月2014年9月29日)。您最好的选择是直接与诚实的用户代理一起查询http://www.google.com/search,然后使用HTML parser解析结果。如果省略用户代理,则返回403。如果您正在使用用户代理并模拟网络浏览器(例如Chrome或Firefox),那么您将获得更大的HTML响应,这会浪费带宽和性能。
以下是使用Jsoup作为HTML解析器的启动示例:
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);
}
答案 1 :(得分:12)
在Terms of Service of google我们可以阅读:
5.3您同意不通过Google提供的界面以外的任何方式访问(或尝试访问)任何服务,除非您已经在另外的协议中明确允许这样做。谷歌。您明确同意不通过任何自动方式(包括使用脚本或网络爬虫)访问(或尝试访问)任何服务,并应确保您遵守服务中存在的任何robots.txt文件中的说明。 的
所以我猜答案是否定的。SOAP API以上的内容已不再可用
答案 2 :(得分:8)
要使用API搜索google,您应使用Google Custom Search,抓取网页为not allowed
在java中,您可以使用CustomSearch API Client Library for Java
maven依赖是:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
使用Google CustomSearch API客户端库进行代码搜索
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());
}
}
}
如您所见,您需要request an api key和setup an own search engine id, cx。
请注意,您可以通过选择&#34;搜索整个网络&#34;来搜索整个网络。在设置cx期间的基本选项卡设置,但结果与普通浏览器谷歌搜索不完全相同。
目前(回答日期)您每天免费获得100次api通话,然后Google会分享您的利润。
答案 3 :(得分:3)
确实有一个以编程方式搜索谷歌的API。该API称为谷歌自定义搜索。要使用此API,您需要Google Developer API key和cx key。我的博客http://preciselyconcise.com/apis_and_installations/search_google_programmatically.php
解释了从java程序访问谷歌搜索的简单程序答案 4 :(得分:3)
2014年4月谷歌服务条款已经放宽了一点。现在它声明:
&#34;不要滥用我们的服务。例如,不要干扰我们的服务或尝试使用接口以外的方法和我们提供的说明来访问它们。&#34;
所以关于&#34;自动化手段&#34;和脚本现在消失了。显然,它仍然不是(通过谷歌)访问他们的服务的方式,但我认为它现在正式开放解释究竟是什么&#34;界面&#34;是否与处理(呈现或解析)的确切返回HTML有何不同。无论如何,我已经编写了一个Java便利库,由您来决定是否使用它:
答案 5 :(得分:0)
根据去年的TOS修改,我们构建了一个API,可以访问Google的搜索。这仅供我们自己使用,但经过一些要求我们决定打开它。我们计划在未来添加其他搜索引擎!
如果有人想要一种简单的方法来实现/获取搜索结果,您可以自由注册并尝试使用REST API:https://searchapi.io
它返回JSON结果,并且应该很容易实现详细的文档。
令人遗憾的是,Bing和雅虎在这方面领先于Google。他们的API并不便宜,但至少可用。
答案 6 :(得分:0)
作为BalusC的替代方案,因为它已被弃用,您必须使用代理,您可以使用此包。代码示例:
Map<String, String> parameter = new HashMap<>();
parameter.put("q", "Coffee");
parameter.put("location", "Portland");
GoogleSearchResults serp = new GoogleSearchResults(parameter);
JsonObject data = serp.getJson();
JsonArray results = (JsonArray) data.get("organic_results");
JsonObject first_result = results.get(0).getAsJsonObject();
System.out.println("first coffee: " + first_result.get("title").getAsString());
GitHub上的图书馆
答案 7 :(得分:-1)
只是一种选择。也可以使用任何HTML解析器(如Java中的Jsoup)以通用方式搜索google并解析结果。以下是上述示例的链接。
https://www.codeforeach.com/java/example-how-to-search-google-using-java