본문 바로가기

Python/Web Crawling

[데이터 수집] 메타코드M '웹 크롤링 기초 강의' #4 (fin) - 관광상품 리뷰 데이터 크롤링 및 분석 프로젝트

728x90
반응형

  메타코드M '웹 크롤링 기초 강의'의 마지막 시간이다. 이번에는 크롤링으로 데이터를 수집하는 것뿐만 아니라 분석과 시각화까지 진행하고자 한다. 

※ 이전글: 2024.03.29 - [Python/Web Crawling] - [데이터 수집] 메타코드M '웹 크롤링 기초 강의' #3 - 기차표 티켓팅 프로젝트

 

메타코드M

빅데이터 , AI 강의 플랫폼 & IT 현직자 모임 플랫폼ㅣ메타코드 커뮤니티 일원이 되시기 바랍니다.

mcode.co.kr

 

Index

     

    4강. 관광상품 리뷰 데이터 크롤링 프로젝트

    사이트 규정 & 페이지 구조 파악, 동적 페이지 데이터 크롤링

      하나투어의 데이터를 크롤링하기 위해 robots.txt를 확인했다. 

    하나투어 robots.txt

      [베스트] 카테고리에서 주간 베스트 중 일본으로 국가를 선택해 가장 첫번째에 있는 여행 상품을 택했다. 여행 후기를 클릭해 내용을 보는데 URL 등의 변화가 없지만 댓글은 계속해서 변하는 것을 확인했다. 이러한 웹 페이지를 크롤링할 때, Selenium이 유용하다.

     

    [100%출발확정] 후쿠오카/규슈 3일 #월드체인특급힐튼 #1일자유 #다자이후 #시티투어 #규슈핵심일

    여행경보단계 외교부에서 운영하는 여행경보단계는 여행유의 / 여행자제 / 철수권고 / 여행금지 4단계로 구분되며 외교부 '해외안전여행' 사이트(www.0404.go.kr)에서 상세정보를 확인할 수 있습니

    www.hanatour.com

     

    XPath 활용 데이터 수집

      Selenium이 무거운 편이라 페이지 로딩이 느릴 수 있다. 그래서 특정 조건을 만족할 때까지 기다려주는 expected_conditions를 불러와 EC라는 약어로 지정하고 진행했다. presence_of_element_located는 괄호 안의 요소를 찾을 때까지 기다려달라는 뜻이다.

      CSS_SELECTOR로 데이터를 가져왔는데 여러 상황에서 쓸 수 있겠지만 단계적으로 구성된 것을 가져올 때 주로 사용되는 듯하다.

    딕셔너리 활용 데이터 크롤링과 저장

      딕셔너리로 리뷰 정보를 저장하는 이유는 key별로 value를 줄 수 있어서 데이터프레임에 데이터를 전달하기 쉽기 때문이다.

    python 한 줄 if문

      if문을 한 줄로 적을 수 있는데 review가 있다면 review에서 텍스트 부분을 가져오고 없으면 아무것도 넣지 말라는 코드이다.   

    리뷰 정보 딕셔너리

      위 이미지처럼 반복문 결과, 딕셔너리 형태로 저장되고 이를 데이터프레임으로 만들어 본다.

    페이지네이션

      1~199페이지까지 돌며 리뷰 데이터를 가져오도록 코딩한다.  

    페이지네이션 3개 코드

      페이지 숫자들을 찾는 3개의 코드이다. 

    페이지 이동

      하나투어 리뷰 페이지는 다음 버튼을 클릭하면 하나씩 올라가는 게 아니라 10개씩 올라가 다음 페이지를 표시한다. 11페이지에서 다음 버튼을 누르면 21페이지를 표시하는 것이다. 

      한 페이지씩 바뀌는 것은 f-string으로 XPath를 표현했고, 다음 버튼을 클릭해 십의 자리가 바뀌는 것을 구현했다. 위 코드는 a 옆 대괄호 안의 숫자가 1씩 커진다는 의미다. try 밑에 if, else를 써서 상세 조건을 부여할 수 있다.

    하나투어 리뷰 데이터 크롤링 결과

      그 결과, 93페이지를 끝으로 916개의 데이터를 가져왔는데 review category가 없는 데이터도 꽤 있는 것으로 보인다.

    데이터 시각화 및 분석     

      저장한 CSV 파일을 불러와서 진행한다. 

      후쿠오카, 규슈 관광상품에 대한 카테고리별, 월별 리뷰 수, 나이별 평균 평점 등을 시각화한다.

    카테고리별 리뷰
    날짜별 리뷰
    나이별 평균 평점

      후쿠오카, 규슈 관광상품은 가족여행으로 가장 좋고, 10대와 80대에서 좋은 반응을 얻고 있다는 것을 알 수 있다. 또 최근 들어 리뷰 수가 늘어나는 추이를 보이고 있는 것도 확인 가능하다. 

    에러 메시지

    시각화 중 에러 메시지 발생

    'FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead. with pd.option_context('mode.use_inf_as_na', True):'

      강의에서는 에러가 발생하지 않았으나 필자의 데이터로 따로 코딩을 했더니 날짜별 데이터를 시각화하는 부분에서 상기 에러가 발생했다. 이를 처리한다면 더 좋은 그래프가 될 것이다.  

    코드 메모

    mdates 활용

      mdates를 불러와서 날짜 데이터를 다양한 형태로 활용할 수 있는 듯하다. 본 강의에서는 mdates로 월별 리뷰 데이터를 나타내는 데 사용했다.

      plt.tight_layout()으로 그래프의 여백을 줄이는 것도 깔끔해서 보기 좋았다.

    python endswith

    특정 문자로 끝나는 것은 str.endswith를 써서 찾을 수 있다. 


      이것으로 메타코드M '웹 크롤링 기초 강의' 관련 포스팅을 마무리짓고자 한다. 늘 그렇듯이 강의를 다 들은 것으로 만족하지 말고 다른 주제로 넘어가 직접 코딩을 하며 실력을 계속 쌓아야 할 것이다. 

    728x90
    반응형