2010-05-14 4 views
41

음, 웹 페이지에서 정보를 가져와 내 프로그램 (자바)으로 가져 오는 방법을 알아 내려고 노력하고 있습니다.웹 사이트 (또는 페이지)에서 정보를 "스캔하여"내 프로그램으로 가져 오는 방법은 무엇입니까?

예를 들어, 내가 정보를 원하는 정확한 페이지를 알고있는 경우, Best Buy 항목 페이지를 단순화하기 위해 어떻게해야 해당 페이지에서 필요한 정보를 얻을 수 있습니까? 제목, 가격, 설명처럼?

이 프로세스는 무엇이라고할까요? 나는 이것을 연구하기 시작하는 것도 모른다.

편집 : 좋아, 나는 JSoup에 대한 테스트 (BalusC에 의해 게시를) 실행 해요,하지만 난이 오류가 계속 :

Exception in thread "main" java.lang.NoSuchMethodError: java.util.LinkedList.peekFirst()Ljava/lang/Object; 
at org.jsoup.parser.TokenQueue.consumeWord(TokenQueue.java:209) 
at org.jsoup.parser.Parser.parseStartTag(Parser.java:117) 
at org.jsoup.parser.Parser.parse(Parser.java:76) 
at org.jsoup.parser.Parser.parse(Parser.java:51) 
at org.jsoup.Jsoup.parse(Jsoup.java:28) 
at org.jsoup.Jsoup.parse(Jsoup.java:56) 
at test.main(test.java:12) 

내가 할 수있는 아파치 코 몬즈

+1

당신에게

웹 페이지 (wgetxpath이 jARVEST의 언어 구조입니다) 내부의 모든 링크를 찾기 LinkedList.peekFirst가 Java 1.6에 등장했기 때문에 LinkedList에 문제가 있습니다. 귀를 사용하는 것 같습니다. LIer 버전 – zamza

+2

이 프로세스는 일반적으로 "화면 스크래핑"이라고하며 SOAP와 같은 API를 사용할 수 없지만 웹 GUI가 사용되는 경우에 사용됩니다. 응용 프로그램을 웹 브라우저로 가장하여 HTML 페이지를 수동으로 파싱하는 것이 포함됩니다. 나는 파싱을 자동화하는 아래에 나열된 API 중 하나를 고려해 보시기 바랍니다. –

답변

83

Jsoup과 같은 HTML 구문 분석기를 사용하십시오. 이것은 other HTML parsers available in Java 위의 것이고 supportsjQueryCSS selectors이므로 내 선호도가 있습니다. 또한 노드 목록을 나타내는 클래스 Elementsenhanced for loop에서 반복 할 수 있도록 Iterable을 구현하므로 평균 Java DOM 파서의 클래스와 같이 NodeNodeList과 같은 자세한 정보를 번거 로움없이 처리 할 수 ​​있습니다.

여기 기본 킥오프 예입니다 (단지 클래스 경로에 latest Jsoup JAR file을 넣어) : 당신이 짐작 하듯이

package com.stackoverflow.q2835505; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     String url = "https://stackoverflow.com/questions/2835505"; 
     Document document = Jsoup.connect(url).get(); 

     String question = document.select("#question .post-text").text(); 
     System.out.println("Question: " + question); 

     Elements answerers = document.select("#answers .user-details a"); 
     for (Element answerer : answerers) { 
      System.out.println("Answerer: " + answerer.text()); 
     } 
    } 

} 

, 이것은 자신의 질문 모든 답변자의 이름을 인쇄합니다.

+1

와우, 이거 멋지다! 그래도 질문이 있는데 그냥 테스트 실행을 위해이 코드를 복사하고 붙여 넣었지만이 오류가 계속 발생합니다 (편집 된 OP를 확인하십시오) – James

+2

@James : Java 1.6 이상이 필요합니다 (이미 3 년 이상 경과) . 언급 된 ['LinkedList # peekFirst()'] (http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html#peekFirst%28%29) 메소드는 Java 1.6에서 소개되었습니다. . JVM (JDK)을 업그레이드하거나 IDE (Eclipse?)를 Java 6 준수 모드로 구성하십시오. – BalusC

+8

.NET 프로그래머가 관심이있는 경우 jsoup를 .NET으로 포팅했습니다 (http://nsoup.codeplex.com/). 희망이 누구도 도움이됩니다. – GeReV

3

당신을 html 파서를 사용할 수 있습니다 (많은 유용한 링크 : java html parser).

이 과정을 '웹 사이트 콘텐츠 포착'이라고합니다. 검색에서 '웹 사이트 콘텐츠 자바를 잡아라.

-1

cURL 라이브러리를 살펴보십시오. 나는 Java에서 그것을 사용한 적이 없지만 바인딩이 있어야합니다. 기본적으로, 당신은 '긁기'를 원하는 페이지에 cURL 요청을 보냅니다. 요청은 소스 코드가있는 문자열을 페이지에 반환합니다. 거기에서 정규식을 사용하여 소스 코드에서 원하는 모든 데이터를 구문 분석합니다. 그게 일반적으로 당신이 어떻게 할거야.

+3

[정규식을 사용하여 HTML을 구문 분석하지 마십시오] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). – BalusC

9

이것은 스크린 스크래핑이라고 불리며, 위키 백과에는이 문서가 더 구체적으로 표시되어 있습니다. web scraping. 추악하고 혼란스러워 보이지 않는 브라우저 깨짐 현상 HTML이 있기 때문에 큰 도전이 될 수 있습니다. 행운을 빈다.

1

고유하고 텍스트 근처의 문자열을 찾을 수 있는지 알아 보려면 HTML을보고 싶을 것입니다. 그런 다음 줄/문자 오프셋을 사용하여 데이터에 접근 할 수 있습니다.

C#에서 System.XML.Linq에있는 것과 유사한 XML 클래스가없는 경우 Java에서 어색 할 수 있습니다.

4

프로세스 자체는 일반적으로 "스크래핑"이라고합니다. 페이지를 가져온 후에는 TagSoup과 같은 파서를 사용하여 페이지를 처리 ​​할 수 ​​있습니다.

4

나는 JTidy을 사용할 것입니다. JSoup과 비슷하지만 JSoup은 잘 모릅니다. JTidy는 손상된 HTML을 처리하고 w3c 문서를 반환하므로이 내용을 XSLT의 소스로 사용하여 실제로 관심이있는 내용을 추출 할 수 있습니다.XSLT를 모른다면 JSoup과 함께 갈 수도 있습니다. Document 모델은 w3c보다 더 잘 작동합니다.

편집 : JSoup 웹 사이트에서 간략하게 살펴보면 JSoup이 실제로 더 나은 선택 일 수 있음을 보여줍니다. 그것은 문서에서 물건을 추출 상자에 CSS 선택기를 지원하는 것 같다. XSLT를 사용하는 것보다 작업하기가 훨씬 쉽습니다.

1

JSoup 솔루션은 매우 중요하지만, 추출해야하는 경우 정말 간단한 일이이 정규식을 사용하는 것이 더 쉬울 수 또는 수 있습니다 경우 String.indexOf 다른 사람이 이미

+0

정규식을 사용하는 것이 더 쉬운 이유는 무엇입니까? 내가 정규식을 시도하고 진짜로 실제 HTML을 처리 할 수없는 가능성이 위험한 구문 분석 html을 사용합니다. Jsoup는 즉시 사용할 수있는 솔루션이며 몇 줄의 코드만으로도 HTML로 할 일은 무엇이든 할 수 있습니다. – newbie

+0

간략화 된 예제 - 원하는 모든 페이지가 생성 된 날짜를 추출한다고 가정 해보십시오. 그래서 당신은 HTML을보고' 07/07/07'와 같은 것을 보게됩니다. 음, 그렇다면 String을 사용할 것입니다.indexOf 또는 textBetween ("", "")과 같은 내 자신의 유틸리티 중 일부. 추가 혜택은 전체 HTML을 구문 분석 할 필요가 없다는 것입니다. 나는 moveBefore (String what), moveAfter (String what), getTextUpTo (String what) 등의 메소드를 사용하여 집에서 자란 StringScanner 클래스로 html에서 데이터를 추출하는 데 성공했다. 문제는 얼마나 복잡한가에 달려있다. – Anton

1

jARVEST을 시도해 볼 수도 있습니다.

웹 사이트를 스파이더 - 스크래핑 (spider-scrape-transform)하기 위해 순수 자바 엔진을 사용하는 JRuby DSL을 기반으로합니다.

: 자바 프로그램 내부

wget | xpath('//a/@href') 

:

Jarvest jarvest = new Jarvest(); 
    String[] results = jarvest.exec(
    "wget | xpath('//a/@href')", //robot! 
    "http://www.google.com" //inputs 
); 
    for (String s : results){ 
    System.out.println(s); 
    }