Có ai biết nếu và làm thế nào có thể tìm kiếm Google theo chương trình - đặc biệt là nếu có một API Java cho nó?
Có ai biết nếu và làm thế nào có thể tìm kiếm Google theo chương trình - đặc biệt là nếu có một API Java cho nó?
Câu trả lời:
Một số sự kiện:
Google cung cấp API dịch vụ web tìm kiếm công khai trả về JSON : http://ajax.googleapis.com/ajax/services/search/web . Tài liệu tại đây
Java cung cấp java.net.URL
và java.net.URLConnection
kích hoạt và xử lý các yêu cầu HTTP.
JSON trong Java có thể được chuyển đổi thành một đối tượng Javabean có giá trị đầy đủ bằng cách sử dụng một API Java JSON tùy ý. Một trong những ứng dụng tốt nhất là Google Gson .
Bây giờ làm phép toán:
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());
}
Với lớp Javabean này đại diện cho dữ liệu JSON quan trọng nhất do Google trả về (nó thực sự trả về nhiều dữ liệu hơn, nhưng nó tùy thuộc vào bạn như một bài tập để mở rộng mã Javabean này cho phù hợp):
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
Cập nhật kể từ tháng 11 năm 2010 (2 tháng sau câu trả lời trên), dịch vụ web tìm kiếm công cộng đã không còn được dùng nữa (và ngày cuối cùng dịch vụ được cung cấp là ngày 29 tháng 9 năm 2014). Đặt cược tốt nhất của bạn bây giờ là truy vấn trực tiếp http://www.google.com.vn/search cùng với tác nhân người dùng trung thực và sau đó phân tích kết quả bằng trình phân tích cú pháp HTML . Nếu bạn bỏ qua tác nhân người dùng, thì bạn sẽ nhận lại được 403. Nếu bạn đang sử dụng tác nhân người dùng và mô phỏng trình duyệt web (ví dụ: Chrome hoặc Firefox), thì bạn sẽ nhận được phản hồi HTML lớn hơn nhiều, gây lãng phí băng thông và hiệu suất.
Đây là một ví dụ khởi động bằng cách sử dụng Jsoup làm trình phân tích cú pháp 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);
}
Để tìm kiếm google bằng cách sử dụng API, bạn nên sử dụng Tìm kiếm tùy chỉnh của Google , không được phép cắt trang web
Trong java, bạn có thể sử dụng Thư viện ứng dụng khách API tìm kiếm tùy chỉnh cho Java
Sự phụ thuộc của maven là:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
Tìm kiếm mã mẫu bằng Thư viện ứng dụng API Tìm kiếm tùy chỉnh của Google
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());
}
}
}
Như bạn có thể thấy, bạn sẽ cần yêu cầu một khóa api và thiết lập một id công cụ tìm kiếm riêng, cx .
Lưu ý rằng bạn có thể tìm kiếm toàn bộ web bằng cách chọn "Tìm kiếm toàn bộ web" trên cài đặt tab cơ bản trong quá trình thiết lập cx, nhưng kết quả sẽ không hoàn toàn giống như tìm kiếm trên trình duyệt google thông thường.
Hiện tại (ngày trả lời) bạn nhận được 100 cuộc gọi api miễn phí mỗi ngày, sau đó google like để chia sẻ lợi nhuận của bạn.
Trong Điều khoản dịch vụ của google, chúng ta có thể đọc:
5.3 Bạn đồng ý không truy cập (hoặc cố gắng truy cập) bất kỳ Dịch vụ nào bằng bất kỳ phương tiện nào khác ngoài giao diện do Google cung cấp, trừ khi bạn được phép cụ thể làm như vậy trong một thỏa thuận riêng với Google. Bạn đặc biệt đồng ý không truy cập (hoặc cố gắng truy cập) bất kỳ Dịch vụ nào thông qua bất kỳ phương tiện tự động nào (bao gồm cả việc sử dụng tập lệnh hoặc trình thu thập thông tin web) và sẽ đảm bảo rằng bạn tuân thủ các hướng dẫn được nêu trong bất kỳ tệp robots.txt nào có trên Dịch vụ .
Vì vậy, tôi đoán câu trả lời là Không. Hơn nữa API SOAP không còn nữa
Google TOS đã được nới lỏng một chút vào tháng 4 năm 2014. Bây giờ nó tuyên bố:
"Không lạm dụng Dịch vụ của chúng tôi. Ví dụ: không can thiệp vào Dịch vụ của chúng tôi hoặc cố gắng truy cập chúng bằng phương pháp khác với giao diện và hướng dẫn mà chúng tôi cung cấp."
Vì vậy, đoạn văn về "phương tiện tự động" và tập lệnh đã không còn nữa. Rõ ràng nó vẫn không phải là cách mong muốn (của google) để truy cập vào dịch vụ của họ, nhưng tôi nghĩ rằng bây giờ nó chính thức mở để giải thích chính xác "giao diện" là gì và liệu nó có tạo ra bất kỳ sự khác biệt nào về cách xử lý chính xác HTML được trả về hay không ( kết xuất hoặc phân tích cú pháp). Nhưng dù sao, tôi đã viết một thư viện tiện lợi Java và bạn có quyết định sử dụng nó hay không:
Thật vậy, có một API để tìm kiếm google theo chương trình. API được gọi là tìm kiếm tùy chỉnh của google. Để sử dụng API này, bạn sẽ cần khóa API dành cho nhà phát triển của Google và khóa cx. Một thủ tục đơn giản để truy cập tìm kiếm google từ chương trình java được giải thích trong blog của tôi.
Bây giờ đã chết, đây là liên kết Wayback Machine .
Để thay thế cho câu trả lời BalusC vì nó đã không được dùng nữa và bạn phải sử dụng proxy, bạn có thể sử dụng gói này. Mẫu mã:
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());
Thư viện trên GitHub
Dựa trên những thay đổi TOS năm ngoái, chúng tôi đã xây dựng một API cho phép truy cập vào tìm kiếm của Google. Nó chỉ dành cho mục đích sử dụng của chúng tôi nhưng sau một số yêu cầu, chúng tôi quyết định mở nó ra. Chúng tôi đang có kế hoạch thêm các công cụ tìm kiếm bổ sung trong tương lai!
Nếu bất kỳ ai đang tìm kiếm một cách dễ dàng để triển khai / nhận kết quả tìm kiếm, bạn có thể đăng ký miễn phí và dùng thử REST API: https://searchapi.io
Nó trả về kết quả JSON và phải đủ dễ dàng để triển khai với các tài liệu chi tiết.
Thật tiếc khi Bing và Yahoo đang đi trước Google về mặt này. API của họ không rẻ, nhưng ít nhất là có sẵn.
Chỉ là một sự thay thế. Tìm kiếm google và phân tích cú pháp kết quả cũng có thể được thực hiện theo cách chung chung bằng cách sử dụng bất kỳ Trình phân tích cú pháp HTML nào chẳng hạn như Jsoup trong Java. Sau đây là liên kết đến ví dụ được đề cập.
https://www.codeforeach.com/java/example-how-to-search-google-using-java