คุณจะค้นหา Google Programmatically Java API [ปิด] ได้อย่างไร


106

มีใครรู้บ้างว่าเป็นไปได้หรือไม่ที่จะค้นหา Google โดยใช้โปรแกรมโดยเฉพาะอย่างยิ่งหากมี Java API


เราได้รับการสนับสนุนสำหรับ nodejs?
Vinod Kumar Marupu

ตัวอย่างการค้นหา google โดยใช้ Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

คำตอบ:


138

ข้อเท็จจริงบางประการ:

  1. Google นำเสนอ API เว็บเซอร์ค้นหาสาธารณะซึ่งจะส่งกลับJSON : http://ajax.googleapis.com/ajax/services/search/web เอกสารที่นี่

  2. Java เสนอjava.net.URLและjava.net.URLConnectionเริ่มทำงานและจัดการคำขอ HTTP

  3. JSON ใน Java สามารถแปลงเป็นอ็อบเจ็กต์ Javabean ที่สมบูรณ์โดยใช้ Java JSON API โดยพลการ หนึ่งในที่ดีที่สุดคือ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 นี้แสดงถึงข้อมูล JSON ที่สำคัญที่สุดตามที่ Google ส่งคืน (จริง ๆ แล้วจะส่งคืนข้อมูลมากกว่า แต่ก็ขึ้นอยู่กับคุณเป็นแบบฝึกหัดเพื่อขยายโค้ด 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 (2 เดือนหลังจากคำตอบด้านบน) เว็บบริการการค้นหาสาธารณะเลิกใช้งานแล้ว (และวันสุดท้ายที่เสนอบริการคือ 29 กันยายน 2014) ทางออกที่ดีที่สุดของคุณคือตอนนี้สอบถามhttp://www.google.com/searchโดยตรงพร้อมกับตัวแทนของผู้ใช้ที่ซื่อสัตย์และแล้วแยกผลโดยใช้parser HTML หากคุณละเว้น user agent คุณจะได้รับ 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);
}

ขอบคุณมาก - นี่ไม่ผิดข้อตกลงสิทธิ์การใช้งานตามที่กล่าวไว้ในคำตอบข้างต้นใช่หรือไม่ ขอบคุณรหัสจริงๆ!
แดน

11
โปรดทราบว่า Google Search API เลิกใช้งานตั้งแต่เดือนพฤศจิกายน 2010 (2 เดือนหลังจากโพสต์คำตอบข้างต้น) ขอแนะนำให้ผู้ใช้ปลายทางเปลี่ยนไปใช้ Google Custom Search API: developers.google.com/custom-search/v1/overview
BalusC

2
@BalusC ไม่ใช่การค้นหาแบบกำหนดเองของ Google สำหรับการค้นหาภายในเว็บไซต์ใดเว็บไซต์หนึ่งแทนที่จะเป็นทั้งเว็บ ??
Pargat

1
นอกจากนี้ถ้าคุณไม่มีชื่อ บริษัท หรือหน้าบอทล่ะ ??
Mike Warren

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

14

หากต้องการค้นหา Google โดยใช้ API คุณควรใช้Google Custom Search ไม่อนุญาตให้มีการขูดหน้าเว็บ

ใน java คุณสามารถใช้CustomSearch API Client Library สำหรับ 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 Client Library

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 ต่อวันฟรีจากนั้น Google ต้องการแบ่งปันผลกำไรของคุณ


12

ในข้อกำหนดในการให้บริการของ Googleเราสามารถอ่าน:

5.3 คุณตกลงที่จะไม่เข้าถึง (หรือพยายามเข้าถึง) บริการใด ๆ ด้วยวิธีการอื่นใดนอกจากผ่านทางอินเทอร์เฟซที่ Google จัดเตรียมไว้ให้เว้นแต่คุณจะได้รับอนุญาตโดยเฉพาะในข้อตกลงแยกต่างหากกับ Google คุณตกลงโดยเฉพาะที่จะไม่เข้าถึง (หรือพยายามเข้าถึง) บริการใด ๆ ด้วยวิธีการอัตโนมัติใด ๆ (รวมถึงการใช้สคริปต์หรือโปรแกรมรวบรวมข้อมูลเว็บ) และจะต้องตรวจสอบให้แน่ใจว่าคุณปฏิบัติตามคำแนะนำที่ระบุไว้ในไฟล์ robots.txt ใด ๆ ที่มีอยู่ในบริการ .

ดังนั้นฉันเดาว่าคำตอบคือไม่ More over SOAP APIไม่สามารถใช้ได้อีกต่อไป


7
อย่างไรก็ตาม AJAX API ให้บริการโดย Google ดังนั้นจึงควรใช้งานได้โดยไม่ละเมิดข้อกำหนดในการให้บริการเหล่านี้
Jean Hominal

สิ่งนี้อาจใช้กับโรบ็อตที่ไม่ได้ผ่าน API
James P.

3

Google TOS ได้รับการผ่อนปรนเล็กน้อยในเดือนเมษายน 2014 ตอนนี้ระบุว่า:

"อย่าใช้บริการของเราในทางที่ผิดตัวอย่างเช่นอย่ารบกวนบริการของเราหรือพยายามเข้าถึงโดยใช้วิธีการอื่นที่ไม่ใช่อินเทอร์เฟซและคำแนะนำที่เรามีให้"

ดังนั้นข้อความเกี่ยวกับ "วิธีการอัตโนมัติ" และสคริปต์ก็หายไปแล้ว เห็นได้ชัดว่ามันยังคงไม่ใช่วิธีที่ต้องการ (โดย Google) ในการเข้าถึงบริการของพวกเขา แต่ฉันคิดว่าตอนนี้เปิดให้ตีความอย่างเป็นทางการว่า "อินเทอร์เฟซ" คืออะไรและสร้างความแตกต่างหรือไม่ตามวิธีการประมวลผล HTML ที่ส่งคืน ( แสดงผลหรือแยกวิเคราะห์) อย่างไรก็ตามฉันได้เขียนไลบรารีความสะดวกสบายของ Java แล้วและขึ้นอยู่กับคุณที่จะตัดสินใจว่าจะใช้หรือไม่:

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


หลังจากผ่านไปหลายชั่วโมงในการค้นคว้าหาโซลูชันที่เขียนด้วย java ซึ่งใช้งานได้จริงโซลูชันของคุณดูเหมือนจะเป็นวิธีที่มีประสิทธิภาพมากที่สุดในการทำสิ่งนี้ภายในสภาพแวดล้อม java โค้ดของคุณจำเป็นต้องมีการปรับเปลี่ยนบางอย่าง ...
Digao


2

แท้จริงแล้วมี API สำหรับค้นหา google โดยทางโปรแกรม API เรียกว่า Google Custom Search สำหรับการใช้ API นี้คุณจะต้องมีคีย์ Google Developer API และคีย์ cx ขั้นตอนง่ายๆในการเข้าถึงการค้นหาของ Google จากโปรแกรม java มีอธิบายไว้ในบล็อกของฉัน

ตอนนี้ตายไปแล้วนี่คือการเชื่อมโยง Wayback เครื่อง


ในบล็อกของคุณในส่วนเกี่ยวกับคีย์ API คุณได้กล่าวถึงบางอย่างเกี่ยวกับคีย์เซิร์ฟเวอร์สำหรับโปรแกรมที่เขียนด้วย Java ฉันเขียนของฉันใน Java และต้องการทราบว่าฉันควรใช้คีย์เซิร์ฟเวอร์หรือไม่และฉันจะใช้คีย์ API ในโปรแกรมของฉันได้อย่างไร นอกจากนี้ฉันจะต้องดาวน์โหลดไลบรารีใด ๆ ?
Mike Warren

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


-1

จากการเปลี่ยนแปลง TOS เมื่อปีที่แล้วเราได้สร้าง API ที่ให้การเข้าถึงการค้นหาของ Google มีไว้เพื่อใช้งานของเราเองเท่านั้น แต่หลังจากมีคำขอบางอย่างเราจึงตัดสินใจเปิดขึ้น เรากำลังวางแผนที่จะเพิ่มเครื่องมือค้นหาเพิ่มเติมในอนาคต!

หากใครก็ตามที่กำลังมองหาวิธีง่ายๆในการนำไปใช้ / รับผลการค้นหาคุณสามารถสมัครและทดลองใช้ REST API ได้ฟรี: https://searchapi.io

ส่งคืนผลลัพธ์ JSON และควรจะง่ายพอที่จะนำไปใช้กับเอกสารโดยละเอียด

เป็นเรื่องน่าเสียดายที่ Bing และ Yahoo นำหน้า Google ไปหลายไมล์ในเรื่องนี้ API ของพวกเขาไม่ถูก แต่อย่างน้อยก็ใช้ได้


-1

เป็นเพียงทางเลือก การค้นหา google และการแยกวิเคราะห์ผลลัพธ์สามารถทำได้โดยทั่วไปโดยใช้ HTML Parser เช่น Jsoup ใน Java ต่อไปนี้เป็นลิงค์ไปยังตัวอย่างที่กล่าวถึง

https://www.codeforeach.com/java/example-how-to-search-google-using-java

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.