웹 크롤링 에러좀 봐주세요..

조회수 1213회

안녕하세요. 자바와 크롤링을 공부하는 학생입니다.

제가 youtube.com의 재생목록을 크롤랭해서 앱에서 리사이클러뷰로 나타내려고 합니다. 아래와 같이 코딩했는데, 리사이클러뷰 자리엔 아무것도 안 만들어 지고 빈 화면이더라구요...

무엇이 문제일까요?? 전문가님들의 조언 부탁드립니다.

@Override
protected Void doInBackground(Void... params) {
    try {
        Document doc = Jsoup.connect("https://www.youtube.com/playlist?list=PLOb0oDPP-6vb0PHm5B-XNEAkPIFkm5po7").get();
        Elements mElementDataSize = doc.select("div[class=style-scope ytd-playlist-video-list-renderer]")
                .select("ytd-playlist-video-renderer");

        for(Element elem : mElementDataSize){
            String my_title = elem.select("h3[class=style-scope ytd-playlist-video-renderer] span")
                    .text();

            itemData.add(new ItemData(my_title));
        }

        Log.d("debug :", "List " + mElementDataSize);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

이미지 ▲mElementDataSize 부분을 작성할 때는 "https://www.youtube.com/playlist?list=PLOb0oDPP-6vb0PHm5B-XNEAkPIFkm5po7" 이 사이트의 F12누르면 나오는 소스를 참고했습니다.

이미지 ▲(String) my_title 부분을 작성할 때도 "https://www.youtube.com/playlist?list=PLOb0oDPP-6vb0PHm5B-XNEAkPIFkm5po7" 이 사이트의 F12누르면 나오는 소스를 참고했습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 안타깝지만,

    시도해보신 정적 페이지를 가정하고 크롤링 하는 방식으로는 해당 페이지는 불가합니다.

    해당 방식으로 크롤링 시도가 가능한 문서는

    view-source:https://hashcode.co.kr/ (크롬 주소창에 붙여넣기 해 보세요.)

    이렇게 서버 요청시 응답에 원하는 목록이 HTML태그로 구성되어 있는 페이지 입니다.

    이렇게 되어 있어야 최소한 시도라도 해 볼 수 있어요. 해당 응답 데이터를 받아서 넣어주어야 XML 혹은 HTML 파싱 및 셀렉팅 라이브러리가 제대로 파싱을 해 줍니다.

    이 상태에서도 내가 원하는 정보가 페이지 내에서 추가로 비동기 통신을 통해 받는 것이라거나 혹은 자바스크립트로 생성해 내는 것이라면 이는 크롤링 대상이 될 수 없습니다. HTML 파싱 라이브러리들은 자바스크립트를 실행시키지 못합니다. 자바스크립트를 실행해서 렌더링 된 결과를 모르니까 실행 이후에 HTML에 반영한 데이터는 가져올 수 없죠.

    https://www.youtube.com/playlist?list=PLOb0oDPP-6vb0PHm5B-XNEAkPIFkm5po7

    위 페이지도 마찬가지입니다. 질문자님이 보고 있는 HTML은 해당 페이지에서 자바스크립트가 완전히 실행 된 이 후의 렌더링 결과를 보고 있는거에요.

    F12에서 보이는 HTML만 봐서는 될 것 같고, 자바 크롤링 코드상에서 결과 데이터가 안 나오는게 이상해 보일 겁니다.

    하지만 페이지 접속해서 오른쪽 클릭 후, 이미지

    해당 목록을 클릭해서 문서를 봐 보세요. 이게 서버에서 받는 응답 그대로를 보여줍니다. 여기에 해당 태그나 셀렉터로 쓸 속성 혹은 컴포넌트를 볼 수 없다면 크롤링 불가능합니다.

    가능한 방법은...

    헤드리스 브라우저를 통해 자바스크립트가 모두 실행된 결과를 크롤링하는 방식을 취하면 됩니다. 헤드리스 브라우저를 하나 골라서 그 API 를 직접 컨트롤 해도 됩니다. 아니면 조금 더 사용자 친화적인 셀레니움이나 puppeteer 등을 통해서 얻어낼 수도 있습니다.

    이 모든 작업은 앱에서 이루어지는 것이 아니라

    가상 브라우징 환경을 갖출 수 있는 원격 서버에서 하고 앱에서는 그 크롤링 결과를 네트워크로 받아서 보여주는 형태가 맞을 것 같네요.

    또 다른 가능성은... 안드로이드 웹뷰를 활용한 방법입니다.

    웹뷰 자체가 이미 훌륭한 브라우저이기 때문에 헤드리스 브라우저를 대신할 수 있죠.

    이건 제가 잘 모르기 때문에 스택오버플로우에서 삽질한 흔적을 대신 링크해 드립니다.

    P.S. 혹시 더 좋은 방식을 알고 계신 분은 댓글 부탁드립니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)