[Android] Jsoup을 이용해 fragment에서 웹크롤링하기
2020. 4. 22. 19:29
1. Jsoup 다운받아 설치 및 라이브러리 추가
2. manifest 권한 추가
3. fragment에서 웹크롤링
1. Jsoup 다운받아 설치 및 라이브러리 추가
Jsoup사이트에 들어가서 jsoup-1.13.1.jar 파일을 다운 받는다.
Project로 변경 후 app - libs에 다운받은 파일을 넣어준 후
jar파일을 우클릭해서 "Add as Library..." 클릭해서 라이브러리에 추가시켜준다.
2. manifest 권한 추가
<uses-permission android:name="android.permission.INTERNET" />
<manifest> 태그 내부에 해당 권한을 추가한다.
3. fragment에서 웹크롤링
질병관리본부 코로나19 데이터를 예로 map_city1 ~ map_city18까지 지역별 데이터가 담겨있는데 선택자나 태그를 이용해 원하는 데이터까지 접근해서 해당데이터를 가져오실 수 있습니다.
public class ListData{
private String tv_name;
private String tv_cases;
private String tv_cases_p;
private String tv_deaths;
private String tv_recovered;
public ListData(String tv_name, String tv_cases, String tv_cases_p, String tv_deaths, String tv_recovered){
this.tv_name = tv_name;
this.tv_cases = tv_cases;
this.tv_cases_p = tv_cases_p;
this.tv_deaths = tv_deaths;
this.tv_recovered = tv_recovered;
}
public String getTv_name() {
return tv_name;
}
public void setTv_name(String tv_name) {
this.tv_name = tv_name;
}
public String getTv_cases() {
return tv_cases;
}
public void setTv_cases(String tv_cases) {
this.tv_cases = tv_cases;
}
public String getTv_cases_p() {
return tv_cases_p;
}
public void setTv_cases_p(String tv_cases_p) {
this.tv_cases_p = tv_cases_p;
}
public String getTv_deaths() {
return tv_deaths;
}
public void setTv_deaths(String tv_deaths) {
this.tv_deaths = tv_deaths;
}
public String getTv_recovered() {
return tv_recovered;
}
public void setTv_recovered(String tv_recovered) {
this.tv_recovered = tv_recovered;
}
}
담아주기 위해서 ListData클래스를 만들고
public class FragmentRegion extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_region, container, false);
regionData task = new regionData();
task.execute();
return view;
}
private class regionData extends AsyncTask<Void, Void, ArrayList<ListData>> {
@Override
protected ArrayList<ListData> doInBackground(Void... voids) {
ArrayList<ListData> arrayList = new ArrayList<ListData>();
try {
/* Jsoup을 이용해 데이터 가져오기 */
Document document = Jsoup.connect("http://ncov.mohw.go.kr/").get();
Elements doc = document.select("div.rpsa_detail > div > div");
int region_num = 0;
String region = null;
String region_cases = null;
String region_cases_p = null;
String region_deaths = null;
String region_recovered = null;
for(int i=1; i<doc.size(); i++) {
region = doc.get(i).select("h4").text();
region_cases = doc.get(i).select("li").get(0).select("div").get(1).select("span").text();
region_cases_p = doc.get(i).select("li").get(1).select("div").get(1).select("span").text();
region_deaths = doc.get(i).select("li").get(2).select("div").get(1).select("span").text();
region_recovered = doc.get(i).select("li").get(3).select("div").get(1).select("span").text();
if(region_cases_p.equals("(0)")){
region_cases_p = "";
}
arrayList.add(new ListData(region, region_cases, region_cases_p, region_deaths, region_recovered));
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayList;
}
@Override
protected void onPostExecute(ArrayList<ListData> arrayList) {
// doInBackground 완료 후 실행시킬 코드
}
}
}
위와 같이 doInBackground에서 try catch를 이용해 크롤링을 하고
onPostExecute에서 doInBackground가 완료된 후 실행시킬 코드를 작성하시면 됩니다.
그리고 onCreateView에서 execute()시켜주셔야 doInBackground가 작동합니다.
(+ URL주소가 http로 시작하는 경우에는 https://sseong66.tistory.com/30 에 업로드 된 내용과 같이 진행하시면 문제없이 작동합니다.)
'안드로이드 > Android' 카테고리의 다른 글
[Android] 오픈소스 UI 사용하기 (0) | 2020.05.22 |
---|---|
[Android] Jsoup 웹크롤링 http 사이트 연결방법 (0) | 2020.04.22 |
[Android] 애드몹 광고 (0) | 2020.04.17 |
[Android] ScalableLayout (0) | 2020.04.17 |
[Android] RecyclerView (0) | 2020.04.10 |