파이썬 크롤링하는데 http url에 /이 아닌 #이 있을 때 크롤링을 어떻게 해야 할까요?

조회수 921회

안녕하세요 최근에 파이썬 크롤링을 열심히 해보고 있는 왕초보입니다.ㅠㅠ

bs4, selenium을 배우고 크롤링을 해보고 있습니다. html도 배웠구요. 아직 시작한지 4주도 안 됐는데, 웬만한 사이트의 html은 크롤링하기 쉽고, 로그인해서 크롤링하는 것도 별로 어렵지 않고.. 근데 몇몇 사이트를 크롤링하다보니, url의 유형이 색다른 것이 나오더군요...!

예를 들면, abc.com/abc/abc#bcd:100 과 같이 #을 포함한 url이 나온 것입니다!!!

저는 다른 url과 마찬가지로 이 사이트도 크롤링하려고 했는데, 자꾸 element가 없다고 오류가 뜨는 것 아니겠어요? 왜 그러는지 원인을 계속 찾다가 크롬에서 보는 html과 selenium을 이용해 받아오는 html을 비교해봤는데, selenium에서 받아오는 html이 크롬의 html보다 누락된 정보가 많더군요.

누락된 정보의 특징은, #뒤의 내용이 바뀔 때마다 변화되는 html코드라는 것이었습니다.

그래서 언제나와 같이 구글링을 통해 정보를 찾아봤는데 쉽게 나오지 않더군요. 단지 알아낸 건, jsp와 관련이 있어 간단한 크롤러가 인식을 못 한다는 것을 알아냈고, 크롤링하기 어려우며(불가능?), #!을 크롤링하는 방법만 알아냈습니다.

그래서 질문을 요약하면, 크롤링을 할 때 #이 들어간 링크를 크롤하는 건 가능한가요? 또 가능하다면 어떤 방법으로 하나요? jsp를 배워야 하나요? 답변해주시면 감사하겠습니다 ㅠㅠ

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

1 답변

  • # 이하의 값들은 해당 페이지에서 어떻게 사용하느냐에 따라서 다릅니다.

    Header의 anchor값으로 사용되는게 고전적인 용례이긴 합니다.

    하지만 특정 SPA 사이트에서는 해당 해시값으로 history를 관리하는데 이용하기도 하며 아예 커스텀하게 페이지 상태값을 위해 사용하기도 합니다.

    보통 말씀하신 경우는 대부분 해당 페이지가 로딩 된 이후에 동적으로 추가 동작이 이루어지면서 HTML을 추가하거나 재구성하고 있을거에요.

    정적 페이지 크롤링의 특성상 페이지 로딩 이후에 이루어지는 작업들에 대해서는 감지하지 못하고 서버에서 응답 받은 상태를 그대로 파싱합니다. 그래서 실제 브라우저에서 렌더링 된 상태와는 다른 상태가 크롤링 되는 것이고요.

    보통 셀레니움이나 headless 브라우저에서는 페이지 접속 후, 일정시간 sleep을 사용하여 이러한 동적인 작업을 기다린 후 페이지를 파싱하도록 하여 동적인 변화 이후의 상태를 크롤링합니다.

    이것도 뭐 완벽하지는 않습니다. 동적인 작업이 만약 서버요청이 이루어지는 Ajax 이후의 콜백에서 이루어진다면, 그 서버요청에 대한 응답시간이 sleep시간보다 느릴경우에 결국 문제가 되거든요. 이런 건 대기 시간을 조절하여 감안하셔야 합니다.

    • 제가 크롤링을 많이 해보지 않아서 일반적인 상황에서의 대응법을 적었습니다. 뭔가 각 크롤러에서 제공하는 특별한 기능으로 해결이 가능한지는 잘 모르겠네요. doodoji 2019.3.8 14:19
    • 그렇군요! 답변 감사해요! 셀레늄을 좀 더 공부하거나 일정시간 sleep을 사용하는 방법으로 해봐야겠네요.. 설명이 빈약한데도 잘 이해해주셨네요!! 정보가 많은 도움이 됐어요~~ 알 수 없는 사용자 2019.3.8 15:02

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

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

(ಠ_ಠ)
(ಠ‿ಠ)