Google 프로그래밍 방식으로 Java API를 검색하는 방법 [닫기]


105

프로그래밍 방식으로 Google을 검색 할 수 있는지, 특히 Java API가있는 경우 어떻게 할 수 있는지 아는 사람이 있습니까?


nodejs에 대한 지원이 있습니까?
Vinod Kumar Marupu 2017 년

: Jsoup HTML 파서 - 예 검색 자바 사용하여 Google에 codeforeach.com/java/example-how-to-search-google-using-java
프라 샨스

답변:


138

몇 가지 사실 :

  1. Google은 JSON 을 반환하는 공개 검색 웹 서비스 API를 제공합니다 . http://ajax.googleapis.com/ajax/services/search/web . 여기에 문서화

  2. Java는 HTTP 요청을 제공 java.net.URL하고 실행 java.net.URLConnection하고 처리합니다.

  3. JSON은 임의의 Java JSON API를 사용하여 Java에서 완전한 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());
}

Google에서 반환하는 가장 중요한 JSON 데이터를 나타내는이 Javabean 클래스를 사용합니다 (실제로 더 많은 데이터를 반환하지만 이에 따라이 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 년 11 월 이후 업데이트 (위 답변 2 개월 후), 공개 검색 웹 서비스는 더 이상 사용되지 않습니다 (서비스가 제공되는 마지막 날은 2014 년 9 월 29 일이었습니다). 이제 가장 좋은 방법은 정직한 사용자 에이전트와 함께 http://www.google.com/search를 직접 쿼리 한 다음 HTML 파서를 사용하여 결과를 구문 분석하는 것 입니다. 사용자 에이전트를 생략하면 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);
}

감사합니다. 위 답변에서 언급 한 라이선스 계약을 위반하지 않습니까? 코드 감사합니다!
Dan

11
Google Search API는 2010 년 11 월 (위 답변이 게시 된 지 2 개월 후)부터 지원이 중단되었습니다. Endusers는 구글 맞춤 검색 API로 이동하는 것이 좋습니다 : developers.google.com/custom-search/v1/overview
BalusC

2
@BalusC Google의 맞춤 검색은 전체 웹이 아닌 특정 웹 사이트 내에서만 검색하는 것이 아닌가요 ??
Pargat 2012-06-24

1
또한 회사 이름이나 봇 페이지가 없으면 어떻게해야합니까 ??
Mike Warren

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

13

API를 사용하여 Google을 검색하려면 Google 맞춤 검색 을 사용해야합니다. 웹 페이지 스크랩은 허용되지 않습니다.

자바에서는 자바 용 CustomSearch API 클라이언트 라이브러리를 사용할 수 있습니다.

Maven 종속성은 다음과 같습니다.

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-customsearch</artifactId>
    <version>v1-rev57-1.23.0</version>
</dependency> 

Google CustomSearch 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 호출을 무료로 받고 Google은 수익을 공유하고 싶습니다.


12

에서 구글의 서비스 약관 우리가 읽을 수 있습니다 :

5.3 귀하는 Google과의 별도 계약에서 특별히 허용하지 않는 한 Google에서 제공하는 인터페이스 이외의 방법으로 서비스에 액세스하거나 액세스를 시도하지 않을 것에 동의합니다. 귀하는 자동화 된 수단 (스크립트 또는 웹 크롤러 사용 포함)을 통해 서비스에 액세스 (또는 액세스를 시도)하지 않기로 특별히 동의하며 서비스에있는 robots.txt 파일에 명시된 지침을 준수하는지 확인해야합니다. .

그래서 대답은 아니오입니다. SOAP API 에 대한 더 이상 사용할 수 없습니다.


7
그러나 AJAX API는 Google에서 제공하므로 이러한 서비스 약관을 위반하지 않고 사용할 수 있어야합니다.
Jean Hominal

이는 API를 거치지 않는 로봇에 적용될 수 있습니다.
James P.

3

Google TOS는 2014 년 4 월에 약간 완화되었습니다. 현재 다음과 같이 표시됩니다.

"우리 서비스를 오용하지 마십시오. 예를 들어, 우리 서비스를 방해하거나 우리가 제공하는 인터페이스 및 지침 이외의 방법을 사용하여 서비스에 액세스하려고 시도하지 마십시오."

그래서 "자동화 된 수단"과 스크립트에 대한 구절은 이제 사라졌습니다. 분명히 여전히 Google이 원하는 방식으로 서비스에 액세스하는 것은 아니지만 "인터페이스"가 정확히 무엇인지, 정확히 반환 된 HTML이 처리되는 방식에 따라 차이가 있는지 여부에 대한 해석이 공식적으로 열려 있다고 생각합니다 ( 렌더링 또는 구문 분석 됨). 어쨌든 저는 Java 편의 라이브러리를 작성했으며 사용 여부를 결정하는 것은 귀하에게 달려 있습니다.

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


실제로 작동하는 Java로 작성된 솔루션을 조사한 후 몇 시간이 지나면 솔루션이 Java 환경 내 에서이 작업을 수행하는 가장 실용적인 방법 인 것 같습니다. 코드는 ... 그런데 일부 조정이 필요
디 가오

GitHub의에 문제를 열 주시기 바랍니다
알렉스 Fedulov에게

2

실제로 프로그래밍 방식으로 Google을 검색하는 API가 있습니다. API를 Google 맞춤 검색이라고합니다. 이 API를 사용하려면 Google Developer API 키와 cx 키가 필요합니다. Java 프로그램에서 Google 검색에 액세스하는 간단한 절차는 내 블로그에 설명되어 있습니다.

이제 죽었습니다. 여기 에 웨이 백 머신 링크가 있습니다.


블로그에서 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 변경을 고려하여 Google 검색에 액세스 할 수있는 API를 구축했습니다. 그것은 우리 자신만을위한 것이었지만 몇 가지 요청 후에 우리는 그것을 열기로 결정했습니다. 앞으로 더 많은 검색 엔진을 추가 할 계획입니다!

누구나 쉽게 검색 결과를 구현 / 획득 할 수있는 방법을 찾고 있다면 무료로 가입하고 REST API를 사용해 볼 수 있습니다. https://searchapi.io

JSON 결과를 반환하며 상세한 문서로 구현하기에 충분히 쉬워야합니다.

이와 관련하여 Bing과 Yahoo가 Google에서 훨씬 앞서 있다는 것은 부끄러운 일입니다. 그들의 API는 저렴하지는 않지만 적어도 사용할 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.