Làm cách nào để bạn có thể tìm kiếm API Java có lập trình của Google [đã đóng]


105

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ó?


Chúng tôi có hỗ trợ cho nodejs?
Vinod Kumar Marupu

Ví dụ để tìm kiếm google sử dụng Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Câu trả lời:


138

Một số sự kiện:

  1. 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

  2. Java cung cấp java.net.URLjava.net.URLConnectionkích hoạt và xử lý các yêu cầu HTTP.

  3. 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 + "]"; }
    }

}

Xem thêm:


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);
}

Cảm ơn rất nhiều - điều này không vi phạm thỏa thuận cấp phép như đã đề cập trong câu trả lời ở trên? Thực sự đánh giá cao mã!
Dan

11
Xin lưu ý rằng API Tìm kiếm của Google đã không còn được dùng nữa kể từ tháng 11 năm 2010 (2 tháng sau khi câu trả lời trên được đăng). Endusers được khuyến khích chuyển sang Google Custom Search API: developers.google.com/custom-search/v1/overview
BalusC

2
@BalusC Không phải tìm kiếm tùy chỉnh của Google chỉ để tìm kiếm bên trong một trang web cụ thể chứ không phải toàn bộ web sao ??
Pargat

1
Ngoài ra, nếu bạn không có tên công ty hoặc trang bot thì sao ??
Mike Warren

1
Trong Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov

13

Để 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 apithiế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.


12

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


7
Tuy nhiên, API AJAX được cung cấp bởi Google - và do đó sẽ có thể sử dụng được mà không vi phạm các điều khoản dịch vụ này.
Jean Hominal

Điều này có thể áp dụng cho các rô bốt không thông qua API.
James P.

3

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:

https://github.com/afedulov/google-web-search


sau nhiều giờ nghiên cứu giải pháp được viết bằng java thực sự hiệu quả, giải pháp của bạn dường như là cách khả thi nhất để thực hiện việc này trong môi trường java. Nhân tiện, mã của bạn cần một số điều chỉnh ...
Digao

cảm thấy tự do để mở một vấn đề trên github
Alex Fedulov

2

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 .


Trong blog của bạn, về phần khóa API, bạn đã đề cập đến điều gì đó về khóa máy chủ, dành cho các chương trình được viết bằng Java. Tôi đang viết bằng Java và muốn biết liệu tôi có nên sử dụng khóa máy chủ hay không và cách tôi sử dụng khóa API trong chương trình của mình. Ngoài ra, tôi có phải tải xuống bất kỳ thư viện nào không?
Mike Warren

0

Để 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


-1

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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.