2013-08-13 30 views
5

Tôi muốn nhận số kết quả ước tính cho một số truy vấn công cụ tìm kiếm Google nhất định (trên toàn bộ web) bằng cách sử dụng mã Java.cách dễ nhất (hợp pháp) để lập trình nhận số kết quả tìm kiếm trên google?

Tôi chỉ cần thực hiện rất ít truy vấn mỗi ngày, vì vậy lúc đầu tiên Google Web Search API, mặc dù không được chấp nhận, có vẻ đủ tốt (xem ví dụ: How can you search Google Programmatically Java API). Nhưng khi nó bật ra, các con số được trả lại bởi API này rất khác với những con số được trả về bởi www.google.com (xem ví dụ: http://code.google.com/p/google-ajax-apis/issues/detail?id=32). Vì vậy, những con số này khá vô dụng đối với tôi.

Tôi cũng đã thử Google Custom Search engine, hiển thị cùng một vấn đề.

Bạn nghĩ giải pháp đơn giản nhất cho nhiệm vụ của mình là gì?

Trả lời

4
/**** @author RAJESH Kharche */ 
//open Netbeans 
//Choose Java->prject 
//name it GoogleSearchAPP 

package googlesearchapp; 

import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class GoogleSearchAPP { 
    public static void main(String[] args) { 
     try { 
      // TODO code application logic here 

      final int Result; 

      Scanner s1=new Scanner(System.in); 
      String Str; 
      System.out.println("Enter Query to search: ");//get the query to search 
      Str=s1.next(); 
      Result=getResultsCount(Str); 

      System.out.println("Results:"+ Result); 
     } catch (IOException ex) { 
      Logger.getLogger(GoogleSearchAPP.class.getName()).log(Level.SEVERE, null, ex); 
     }  
    } 

    private static int getResultsCount(final String query) throws IOException { 
     final URL url; 
     url = new URL("https://www.google.com/search?q=" + URLEncoder.encode(query, "UTF-8")); 
     final URLConnection connection = url.openConnection(); 

     connection.setConnectTimeout(60000); 
     connection.setReadTimeout(60000); 
     connection.addRequestProperty("User-Agent", "Google Chrome/36");//put the browser name/version 

     final Scanner reader = new Scanner(connection.getInputStream(), "UTF-8"); //scanning a buffer from object returned by http request 

     while(reader.hasNextLine()){ //for each line in buffer 
      final String line = reader.nextLine(); 

      if(!line.contains("\"resultStats\">"))//line by line scanning for "resultstats" field because we want to extract number after it 
       continue; 

      try{   
       return Integer.parseInt(line.split("\"resultStats\">")[1].split("<")[0].replaceAll("[^\\d]", ""));//finally extract the number convert from string to integer 
      }finally{ 
       reader.close(); 
      } 
     } 
     reader.close(); 
     return 0; 
    } 
} 
+1

Bạn có thể thêm một số giải thích cho giải pháp của mình không? – honk

+0

hey nếu bạn muốn tôi gửi cho bạn nội dung được trả về bởi [link] (https://www.google.com/search?q=) trong đối tượng tôi chắc chắn sẽ. –

+0

Dường như bạn đã sử dụng lại mã này từ câu trả lời của @JoshM. Tuy nhiên, bạn đã sửa đổi và mở rộng mã. Lý do để làm như vậy là gì? Mã của bạn tốt hơn/khác với mã của @JoshM là gì? Loại giải thích như vậy sẽ giúp người đọc hiểu được giải pháp của bạn. – honk

0

Điều bạn có thể làm là thực hiện tìm kiếm thực tế trên Google để bắt đầu. Cách dễ nhất có thể để thực hiện việc này là truy cập url https://www.google.com/search?q=QUERY_HERE và sau đó bạn muốn xóa số kết quả khỏi trang đó.

Dưới đây là một ví dụ nhanh như thế nào để làm điều đó:

private static int getResultsCount(final String query) throws IOException { 
    final URL url = new URL("https://www.google.com/search?q=" + URLEncoder.encode(query, "UTF-8")); 
    final URLConnection connection = url.openConnection(); 
    connection.setConnectTimeout(60000); 
    connection.setReadTimeout(60000); 
    connection.addRequestProperty("User-Agent", "Mozilla/5.0"); 
    final Scanner reader = new Scanner(connection.getInputStream(), "UTF-8"); 
    while(reader.hasNextLine()){ 
     final String line = reader.nextLine(); 
     if(!line.contains("<div id=\"resultStats\">")) 
      continue; 
     try{ 
      return Integer.parseInt(line.split("<div id=\"resultStats\">")[1].split("<")[0].replaceAll("[^\\d]", "")); 
     }finally{ 
      reader.close(); 
     } 
    } 
    reader.close(); 
    return 0; 
} 

Đối với việc sử dụng, bạn sẽ làm điều gì đó như:

final int count = getResultsCount("horses"); 
System.out.println("Estimated number of results for horses: " + count); 
+2

Cảm ơn, điều này có vẻ tốt. Nhưng AFAIR điều khoản dịch vụ không cho phép điều này. Họ có? Họ nói điều gì đó giống như người ta phải chỉ sử dụng Google GUI và/hoặc API… – mbee

+0

Chắc chắn có thể xảy ra, nhưng tôi nghĩ điều đó phụ thuộc vào ý định của bạn. Tôi không chắc chắn nếu điều này vi phạm bất kỳ điều khoản của họ hay không, nhưng tôi nghĩ bạn nên có lẽ nhìn vào nó để đảm bảo nó là an toàn. –

+10

FYI. Cách tiếp cận này cuối cùng dẫn đến một lỗi 503 và một captcha. – Quickredfox