웹 크롤링 에러좀 봐주세요..
조회수 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. 혹시 더 좋은 방식을 알고 계신 분은 댓글 부탁드립니다.
댓글 입력