如何以编程方式搜索Google Java API [已关闭]
有谁知道是否以及如何以编程方式搜索Google - 特别是如果有Java API?
有谁知道是否以及如何以编程方式搜索Google - 特别是如果有Java API?
一些事实:
Google提供了一个公共搜索网络服务API,该API返回JSON:http://ajax.googleapis.com/ajax/services/search/web。此处的文档
Java提供java.net.URL
和java.net.URLConnection
来触发和处理HTTP请求。
Java中的JSON可以使用任意Java JSON API转换为完全可用的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 + "]"; }
}
}
###See还:
自 2010 年 11 月(上述答案发布 2 个月后)更新以来,公共搜索 Web 服务已弃用(提供服务的最后一天是 2014 年 9 月 29 日)。现在,您最好的办法是直接查询 http://www.google.com/search 以及诚实的用户代理,然后使用HTML解析器解析结果。如果省略用户代理,则返回 403。如果你躺在用户代理中并模拟一个Web浏览器(例如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);
}
要使用API搜索谷歌,您应该使用谷歌自定义搜索,不允许抓取网页
在java中,您可以使用Java的CustomSearch API Client Library for Java。
专家依赖关系是:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
使用 Google 自定义搜索 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());
}
}
}
如您所见,您需要请求api密钥并设置自己的搜索引擎ID cx。
请注意,在设置cx期间,您可以通过在基本选项卡设置中选择“搜索整个网络”来搜索整个网络,但结果将与普通浏览器Google搜索不完全相同。
目前(回答日期)您每天免费获得100个api调用,然后谷歌喜欢分享您的利润。