본문 바로가기

IT

HTML Parser Jericho 라이브러리

반응형

 안드로이드 프로그램을 배포하면서 사용자들이 항상 최신버전을 사용했으면 하는 경우가 있습니다. 대체적으로 서버에 업데이트한 버전코드를 저장하고 이를 조회하면 간단합니다.


 별도의 서버를 사용하지 않고 체크하는 방법으로는 마켓의 앱정보 페이지에 보면 중간쯤 배포중인 앱의 버전이 표시가 됩니다. 이를 파싱하여 버전정보를 알아내는 방법을 사용해봤습니다.


 웹페이지를 파싱해야 하므로 파서로는 jericho 라이브러리를 사용하였습니다.


코드도 간단하니 다음을 보겠습니다.


import java.io.IOException;
import java.net.URL;
import java.util.Calendar;
import java.util.List;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Source;
import net.htmlparser.jericho.TextExtractor;

public class VersionCheck {
	
	private static Thread thread = null;
	
	public static void main(String[] args) throws IOException {
		
		final String URL = "https://play.google.com/store/apps/details?id=com.kakao.story";
		
		thread = new Thread(new Runnable() {
			@Override
			public void run() {
				long startTime = Calendar.getInstance().getTimeInMillis();
				
				for (int i = 0 ; i < 1; i++) {
					System.out.println("softwareVersion = " + getURLtoText(URL));
				}
				
				long lastTime = Calendar.getInstance().getTimeInMillis();
				
				System.out.println((lastTime - startTime) + " milliSeconds");
			}
		});
		thread.start();
		
	}
	
	public static String getURLtoText(String strURL) {
		Source source = null;
		String version = "";
		
		try {
			URL url = new URL(strURL);
			source = new Source(url);
			List list = source.getAllElements(HTMLElementName.DIV);
			
			Element element = null;
			
			for (int i = 0; i < list.size(); i++) {
				element = list.get(i);
				String attributevalue = element.getAttributeValue("itemprop");
				
				if (attributevalue != null) {
					if (attributevalue.equals("softwareVersion")) {
						TextExtractor textExtractor = element.getTextExtractor(); // here
						version = textExtractor.toString();
						return version;
					}
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}
}

 jericho 라이브러리는 http://jericho.htmlparser.net/docs/index.html 에서 다운로드 페이지에서 다운받을 수 있습니다.


 배포하는 프로그램의 플레이스토어에서 검색하여 URL을 검색합니다. 테스트로는 카카오스토리의 URL로 테스트하였습니다. 실제 파싱하는 부분인 getURLtoText() 라는 메소드를 보시면 됩니다.


 1. URL에서 new Source()를 이용하여 페이지정보를 읽어오고,


 2. 그중 버전정보를 담고 있는 DIV 엘리먼트를 모조리 읽어옵니다. (얼마전까지는 DD 엘리먼트에 있었는데 리뉴얼이후 DIV 엘리먼트로 변경이 있네요.)


 3. 여러개의 DIV 엘리먼트가 리스트로 불러와지는데 이중에서 "itemprop" 의 속성을 추출합니다.


 4. 추출된 속성값이 softwareVersion 이라는 속성을 가지고 있는 엘리먼트가 있으면 getTextExtractor() 메소드를 이용하여 버전네임을 추출합니다.


 간단히 추출이 되는데요... 웹파싱의 좋지 않은 점이 꽤 있습니다.


 1. 구글에서 언제 또 홈페이지를 리뉴얼할지 모른다. (DD 엘리먼트에서 DIV 엘리먼트로 변경된 것과 같이)

 2. 페이지를 로딩하지 못하면 아예 파싱이 불가능하다.

 3. 속도가 느리다.;;; (저의 경우 대략 1~2초정도 걸리더군요.)


 필요에 따라서 한번 작업해봤는데요.. 어지간하면 서버에 버전체크를 위한 테이블을 구성하는 것이 정답으로 보입니다.


 끝.

반응형