bit가 눈 앞에서 왔다갔다

우왕~ 공지 떳다! - jsoup 크롤링 본문

카테고리 없음

우왕~ 공지 떳다! - jsoup 크롤링

헬린인형 2021. 9. 4. 20:01

크롤링 부분만!

class MyTask extends AsyncTask<Void, String, String>
    {
        ArrayAdapter<String> adapter;
        @Override
        protected void onPreExecute() { //어댑터 연결
            adapter = (ArrayAdapter<String>)listView.getAdapter();
        }

        @Override
        protected String doInBackground(Void... voids) {  //리스트에 정보 추가
            final StringBuilder builder = new StringBuilder();
            String url1 = "https://software.cbnu.ac.kr/bbs/bbs.php?db=notice";
            String my_link = null;
            String contents="";

            try {
                Connection con = Jsoup.connect(url1);
                Document doc = con.get();

                Elements mElementDatas = doc.select("#body_line > nobr ");
                String text = mElementDatas.text();

                int i = 0;
                for (Element elem : mElementDatas) {   //제목, 해당 링크
                    String my_title = elem.select("a span b").text();
                    title = my_title;
                    publishProgress(title);

                    //내부 내용 크롤링, 내부 내용으로 이어지는 link 추출
                    my_link = elem.select("a").attr("href");
                    String url2 = my_link;
                    Connection con2 = Jsoup.connect("https://software.cbnu.ac.kr" + url2);
                    Document doc2 = con2.get();

                    doc2.select("br").append("\\n");
                    doc2.select("p").prepend("\\n");
                    doc2.select("div").prepend("\\n");
                    if(i==0) doc2.select("span").prepend("\\n");


                    Elements EDatas = doc2.select("#articles");    // articles에서 따옴
                    String[] result;
                    for (Element elem2 : EDatas) {
                        //span, p
                        String content1 = elem2.select("p").text();
                        String content2 = elem2.select("span").text();
                        //String content3 = elem2.select("table").text();

                        String content =content1;
                        if(i==0) {
                            content = content2;
                        }
                        String total = content.replaceAll("\\\\n", "\n");
                        content_arr.add(Jsoup.clean(total,"", Whitelist.none(), new Document.OutputSettings().prettyPrint(false)));

                    }
                    i++;
                    if (i > 15) {
                        break;
                    }
                }
            }catch (IOException e) {
                builder.append("Error");
            }

            return "All the datas were added successfully";
        }

jsoup으로 크롤링 구현할 때 이클립스에서 먼저 하고 에뮬레이터로 옮겼다.

뭔가 아직 안드로이드 스튜디오는 좀 낯설고, 결과를 확인하려고 할 때마다 에뮬을 켜야하는, 에뮬 키려면 또 오래 걸리는데, 그거 기다려야하는 게 마음에 안들기도 했다.

물론 그러지 않아도 됐던 방법이 있었을 수도 있었겠지만.

우리 학교 학과 홈페이지에 아쉬운 점이 있었다면 이상하게, 공지글 중에 하나가 글 작성 태그가 다른 거랑 달랐다는 점이었다.

다른 거는 <p>에 있었는데, 어떤 거 하나만 <span>에 있었다.

처음에 그걸 못발견하고 <p>만 생각하면서 했다가 중간에 발견하고 span도 추가했다.

 String content2 = elem2.select("span").text();

 

그리고 크롤링하니까 엔터가 다 날라가 버렸음...

엔터 날라가는거 잡아오기 힘들었다ㅠ

구글링, 유튜브 엄청 찾아봤어야 했다...

그 결과 추가한 게 이거

doc2.select("br").append("\\n");
doc2.select("p").prepend("\\n");
doc2.select("div").prepend("\\n");
if(i==0) doc2.select("span").prepend("\\n");

그리고

String total = content.replaceAll("\\\\n", "\n");
content_arr.add(Jsoup.clean(total,"", Whitelist.none(), new Document.OutputSettings().prettyPrint(false)));

이렇게 하니까 우리 학과 홈페이지 공지글을 깔끔하게 보여줬다.

반응형
Comments