Jsoup는 특정 페이지를 파싱할때 편리하게 사용되는 라이브러리 입니다.
네트워크 작업이기 때문에 메인쓰레드에서 사용할 수는 없고
AsynkTask나 RxJava, Coroutine등을 이용해서 비동기를 구현해 주어야 합니다.
일반적인 사용방법은 아래와 같습니다
public static class GetTITLE extends android.os.AsyncTask<Void, Void, String> {
String title;
@Override
public void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
public String doInBackground(Void... params) {
try {
Document doc = Jsoup.connect(URL).timeout(3000).get();
Elements elements = doc.select("title");
title = elements.get(0).text();
} catch (IOException e) {
e.printStackTrace();
}
return title;
}
@Override
public void onPostExecute(String result) {
progressBar.setVisibility(View.GONE);
}
}
Jsoup는 저도 자주 사용하는 라이브러리인데, 요번에 사용하면서 문제가 하나 발생하게 되었습니다.
URL에 접속하면 리다이렉트되는 URL을 파싱해야 하는 일이 있었습니다.
URL 길이를 줄여주는 URL간소화를 거친 주소였는데, 간소화된 주소에 Jsoup를 사용하니
오류를 뿜으며 죽는것이었습니다.
Connection.Response response = Jsoup.connect(URLs).followRedirects(true).execute();
Jsoup에는 위와같이 followRedirects(Boolean)라는 옵션을 추가할 수 있어 이를 사용했는데도
Jsoup는 리다이렉트 되기전 URL만을 파싱할 뿐이었습니다.
제법 해메다가 나중에는 보이지 않는 WebView를 열어 리다이렉트 된 후에 WebView에서 리다이렉트된 Url을 다시
얻어올까 라는 생각까지 하다 보니, 이를 Jsoup에서 똑같이 구현할 수 없을까 하는 생각에 이르게 됩니다.
Document doc = Jsoup.connect(URLs)
.userAgent("Android")
.referrer("https://www.google.com/").get();
*Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
와 같은 좀 더 상세한 값의 userAgent 세팅 값이 있으나 Android로 간단하게 적용해주면 됩니다.
Jsoup는 해당 페이지가 반응형페이지와 같이 모바일과 웹을 구별하는 코드를 가지고 있을 때
Malform URL이 되는것을 방지해 주는 userAgent라는 옵션을 가지고 있는데
이를 이용하니 리다이렉트 된 후의 사이트를 파싱하는 것을 확인 할 수 있었습니다.
'Android > Dev' 카테고리의 다른 글
AsyncTask, Coroutine, RxJava를 이용한 비동기의 구현 (0) | 2020.03.12 |
---|---|
textView를 하이퍼 링크로 만들기 (0) | 2020.03.10 |
windowSoftInputMode : 키보드 입력 시의 화면조절 옵션 (0) | 2020.02.11 |
TabLayout이 태블릿에서 작게 나타날때 (0) | 2020.02.01 |
웹뷰 등에서 OnTouchListener 적용하기 (0) | 2020.01.29 |
댓글