2012-06-25 2 views
1

Java를 사용하여 Google 검색 쿼리 결과의 HTML을 검색하려고합니다. 즉, 특정 구문에 대해 Google.com에서 검색을 수행하면 결과 웹 페이지의 HTML (해당 설명, URL 등을 포함하여 가능한 일치 항목에 대한 링크가 포함 된 페이지)을 검색하고 싶습니다.검색 엔진 쿼리 결과의 HTML을 검색하려면 어떻게합니까?

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class Main { 

    public static void main (String args[]) { 

     URL url; 
     InputStream is = null; 
     DataInputStream dis; 
     String line; 

     try { 
      url = new URL("https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=UCF&oq=UCF&aq=f&aqi=g4&aql=&gs_l=hp.3..0l4.1066.1471.0.1862.3.3.0.0.0.0.382.1028.2-1j2.3.0...0.0.OxbV2LOXcaY&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&fp=579625c09319dd01&biw=944&bih=951"); 
      is = url.openStream(); // throws an IOException 
      dis = new DataInputStream(new BufferedInputStream(is)); 

      while ((line = dis.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (MalformedURLException mue) { 
      mue.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException ioe) { 
       // nothing to see here 
      } 
     } 
    } 
} 

에서 :이 코드에 사용 된 URL은에서 구글 검색 쿼리를 수행하여 얻은 How do you Programmatically Download a Webpage in Java

는 내가 관련 포스트에서 볼 수있는 다음 코드를 사용하여이 일을 시도 Google 홈페이지. 어떤 이유로 웹 브라우저의 URL 표시 줄에서 검색하고자하는 문구를 작성한 다음 그 결과 검색 결과 페이지의 URL을 403 오류가 발생하면 이해하지 못합니다.

그러나이 코드는 검색 쿼리 결과 페이지의 HTML을 반환하지 않았습니다. 대신 Google 홈페이지의 소스 코드를 반환했습니다.

Google 검색 결과의 소스 코드를 보려면 검색 결과 페이지의 배경을 마우스 오른쪽 버튼으로 클릭하고 "페이지 소스보기"를 선택하여 소스 코드와 비교해보십시오. Google 홈페이지의 두 가지 모두 동일합니다.

검색 결과 페이지의 소스 코드를 보는 대신 (Ctrl + S를 눌러서) 검색 결과 페이지의 HTML을 저장하면 내가 찾고있는 HTML을 얻을 수 있습니다.

Java를 사용하여 검색 결과 페이지의 HTML을 검색하는 방법이 있습니까?

감사합니다.

답변

2

표준 Google 검색에서 결과 HTML 페이지를 구문 분석하는 대신 공식 Custom Search api을보고 더 유용한 형식으로 결과를 반환하는 것이 더 나을 것입니다. API는 분명히 갈 수있는 방법입니다. 그렇지 않으면 Google이 google.com 프런트 엔드의 HTML 기능을 일부 변경하면 코드가 손상 될 수 있습니다. API는 개발자가 사용하도록 설계되었으며 코드가 훨씬 취약합니다.

귀하의 질문에 대한 답변 : 귀하가 제공하신 정보로는 귀하를 진정으로 도울 수 없습니다. 귀하의 코드는 stackoverflow의 HTML을 검색하는 것 같다; 연결된 질문의 코드 복사 및 붙여 넣기 코드를 전혀 변경하려고 시도 했습니까? 실제로 어떤 URL을 사용하여 Google 검색 결과를 검색합니까?

url = new URL("http://www.google.com/search?q=test");을 사용하여 코드를 실행하려고 시도했지만 개인적으로 HTTP 오류 403이 금지되었습니다. 이 문제를 빠르게 검색하면 웹 요청에 User-Agent 헤더를 제공하지 않으면이 문제가 발생하지만 실제로는 HTML을 반환하는 경우 을 정확히 도울 수는 없습니다. 특정 도움말을 받으려면 추가 정보를 제공해야합니다. 맞춤 검색 API로 전환하면 문제가 해결 될 수 있습니다.


편집 : 새로운 질문은 원래 질문으로 제공; 지금 바로 질문에 대답 할 수 있습니다!

자바가 보내고있는 웹 요청을 패킷 캡처 한 다음 몇 가지 기본 디버깅을 적용한 후 문제를 파악했습니다 ... 살펴 봅시다!다만 "GET /"떠나 ...

GET/HTTP/1.1 
User-Agent: Java/1.6.0_30 
Host: www.google.com 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 

주의 요청이 URL의 대부분을 무시하는 듯 :

여기에 자바가 제공하는 예를 URL로 전송 된 웹 요청입니다. 이상합니다. 나는 이것을보아야했다.

A URL may have appended to it a "fragment", also known as a "ref" or a "reference". The fragment is indicated by the sharp sign character "#" followed by more characters ... This fragment is not technically part of the URL.이의 당신의 URL의 예를 살펴 보자

자바의 URL 클래스의 문서 당으로

(이 모든 웹 페이지에 대한 표준), ...

https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=UCF&oq=UCF&aq=f&aqi=g4&aql=&gs_l=hp.3..0l4.1066.1471.0.1862.3.3.0.0.0.0.382.1028.2-1j2.3.0...0.0.OxbV2LOXcaY&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&fp=579625c09319dd01&biw=944&bih=951

통지 "#"는 파일 경로의 첫 번째 문자입니까? Java는 "#"다음에 나오는 모든 것을 무시하고 있습니다. 왜냐하면 날카로운 표시는 클라이언트/웹 브라우저에서만 사용되기 때문입니다. 그러면 URL이 https://www.google.com/으로 남습니다. 적어도 의도 한대로 작동 했어!

Google이하는 일을 정확히 말할 수는 없지만 날카로운 기호 URL은 Google이 일부 클라이언트 측 (아약스/자바 스크립트) 스크립팅을 통해 검색어 결과를 반환한다는 것을 의미합니다. 적절한 헤더가없는 서버 (예 : no "#"기호)에 직접 보내는 모든 쿼리가 403 금지 된 오류를 반환한다는 것을 기꺼이 알 수 있습니다. API를 사용하도록 권장하는 것처럼 보입니다.

EDIT2가 : Tengji 장는 질문에 "테스트"

URL url; 
    InputStream is = null; 
    DataInputStream dis; 
    String line; 
    URLConnection c; 

    try { 
     url = new URL("https://www.google.com/search?q=test"); 
     c = url.openConnection(); 
     c.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168"); 
     c.connect(); 
     is = c.getInputStream(); 
     dis = new DataInputStream(new BufferedInputStream(is)); 
     while ((line = dis.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (MalformedURLException mue) { 
     mue.printStackTrace(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException ioe) { 
      // nothing to see here 
     } 
    } 
+0

모든 정보를 제공해 주셔서 감사합니다. Google API를 살펴 보겠습니다. 그러나 Java 코드가 원하는 결과를 반환하지 않는 이유를 알고 싶습니다. 내가 사용한 코드로 원래 게시물을 업데이트하고 403 오류를 생성하지 않은 URL을 어떻게 얻었는지에 대한 설명을 추가했습니다. 이게 더 이해할 수 있기를 바랍니다. – Erich

+0

@ Kyndod7 편집에 대한 알림을 받는지 확실하지 않지만 질문에 답변했습니다. 왜 프로그래밍 방식으로 Google에서 내 대학 이름을 검색하려고합니까? :) –

+0

정말 고마워요! 코드를 테스트 할 때 무작위로 UCF를 선택합니다. 내 대학이기도합니다. – Erich

-1

코드에 User-Agent를 설정하지 마십시오.

URLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168");

아니면 읽을 수 "http://www.google.com/robots.txt". 이 파일은 Google 서버에서 허용하는 URL을 알려줍니다.

아래 코드는 성공한 것입니다.

package org.test.stackoverflow; 

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class SearcherRetriver { 
    public static void main (String args[]) { 

     URL url; 
     InputStream is = null; 
     DataInputStream dis; 
     String line; 
     URLConnection c; 

     try { 
      url = new URL("https://www.google.com.hk/#hl=en&output=search&sclient=psy-ab&q=UCF&oq=UCF&aq=f&aqi=g4&aql=&gs_l=hp.3..0l4.1066.1471.0.1862.3.3.0.0.0.0.382.1028.2-1j2.3.0...0.0.OxbV2LOXcaY&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&fp=579625c09319dd01&biw=944&bih=951"); 
      c = url.openConnection(); 
      c.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168"); 
      c.connect(); 
      is = c.getInputStream(); 
      dis = new DataInputStream(new BufferedInputStream(is)); 
      while ((line = dis.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (MalformedURLException mue) { 
      mue.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException ioe) { 
       // nothing to see here 
      } 
     } 
    } 
} 
+0

코드가 작동하지 않습니다. google.com.hk이 아닌 google.com으로 테스트를했는데 차이가 없어야합니다. 왜 작동하지 않는지에 대한 내 대답을보십시오. –

+0

내 코드가 내 컴퓨터에서 유용합니다. @ Kyndod7의 코드는 Google 크롤러의 규칙을 따르지 않습니다. 오류 403이 발생합니다. –

+0

예, 코드는 여전히 실제 검색 결과가 아닌 Google 홈페이지를 반환합니다. 403 오류는 * 실제로 Google 검색 *을 수행하지 않기 때문에 발생하지 않습니다.검색 쿼리의 HTML (저자가 원하는 것)이 아닌 Google 홈페이지 HTML 만 반환됩니다. 요청 헤더를 실제로 * 검색 결과 *를 반환하는 URL과 결합하면 코드가 정확하고 OP의 질문에 대한 답변이 제공됩니다. 그러나 현재 상태에서 OP의 코드가 검색어와 관련된 HTML을 반환하지 않는 이유에 대한 설명은 아닙니다. –

관련 문제