웹을 이용하다가 직접 분석해보고 싶은 텍스트가 생기면, 주로 크롤링을 하게 된다. 크롤링을 처음 시작했을 때는 수집하려는 요소(구매리뷰 제목, 본문, 날짜 등)을 각각 수집하는 코드를 우선 구현한다. 그런데 분석을 위해 많은 양의 데이터를 수집하려다 보면 여러 페이지를 수집하는 부분에서 막힐 때가 많았다. python이 익숙하지 않던 초반에는 특히 for문을 돌리는 것, 리스트로 수집한 값을 데이터프레임으로 방법 등을 어떻게 접근해야 할지 난감했다. 구글링을 해보아도 특정 요소를 크롤링하는 기초적인 부분을 다룬 글이 많고, 저런 내용이 있어도 자세한 설명을 생략하여 내 python 실력으로는 이해하기 어렵거나, 수집하려는 웹사이트/데이터 구조에 맞지 않는 경우도 있었다.

최근에 사이드 프로젝트를 위해 몇몇 사이트의 구매리뷰, 상품명 등을 수집하려다 보니 사이트 UI별로 접근 방식이 다양한 것 같아 정리해 보았다. 이번 작업을 하면서 이전에 정리해둔 글을 참고하니 꽤 효율적이었어서 이 글도 미래의 작업을 위해 정리해본다.


1. 여러 페이지 수집은 왜 어려운가?

한 페이지를 수집하는 것은 쉽다. 구글링을 해보면 참고할만한 블로그 글이 많은 편이기 때문이다. 그러나 많은 웹사이트들이 첫 조회 화면에 보여주는 아이템의 개수를 100개, 적으면 20개 정도로 제한한다. 따라서 많은 양이 데이터를 수집하려면 필수적으로 스크롤다운, 버튼 클릭 등을 다루어야 하게 된다. 나도 이 부분 때문에 Selenium을 접하게 되었다.

<잡아라! 텍스트마이닝 with 파이썬>에서 관련 내용을 인용해본다.

“셀레니움은 브라우저가 웹사이트를 불러오고, 필요한 데이터를 가져오고…(중략)… 등의 행동을 자동화합니다. 따라서 BeautifulSoup보다는 더 복잡한 구조의 웹사이트를 크롤링할 수 있습니다.” (p.157)

책에 언급된 케이스는 아래와 같다.

  • 스크롤을 계속 내려야 새로운 텍스트가 보이는 웹구조
  • 뒤로 가기/앞으로 가기가 필요한 웹구조


2. 여러 페이지를 로딩하는 UI별 케이스

위의 케이스를 조금 더 세분화해보았다. 이번에 시도해 본 구글 플레이스토어, 네이버쇼핑, 예스24를 위주로 본 것이다.

1) 스크롤 다운

스크롤을 내려서 ‘더 보기’ 버튼을 클릭해야 하거나, 무한 스크롤의 개념으로 계속 데이터가 로딩되는 경우가 있다. 구글 플레이의 앱 리뷰가 후자의 경우로 되어 있다. 초보자여서 Selenium을 사용하기 부담스럽거나, 급한대로 몇십~몇백 건만 수집해보려는 경우라면 수동으로 스크롤다운해서 수집하는 것도 가능은 하다. 하지만 수집한 데이터를 살펴보면 오류가 있거나, 생각했던 것과 달라서 다시 수집해야 할 경우가 생길 수 있다. 이러한 시행착오 과정에서 비효율이 발생한다. 또한 결과를 분석하다 보면 더 많은 양을 확보하고 싶어지기 마련인데, 몇천 건의 데이터를 수집하려 하면 수동으로 스크롤다운 하는 것도 오래 걸린다. 그래서 Selenium을 이용해 반복되는 스크롤다운을 자동화할 필요가 있다.

관련해서 몇 번 시행착오를 해보니 top-down적인 접근이 효율적이라는 생각이 들었다. 자동이든 수동이든 스크롤다운을 한 뒤에는 수집하려는 요소만 수집하지 말고, 전체 웹요소를 먼저 수집한 뒤 그 안에서 필요한 데이터를 추출하는 접근법이 좋은 것 같다.

  • 아래 글이 그런 접근법을 언급하고 있다. 전체 html 소스를 가져온 뒤, 필요한 요소를 정적수집하라고 한다.
    • https://coding-kindergarten.tistory.com/34
  • 검색해본 글 중에 아래 글이 Selenium으로 구글플레이 앱리뷰를 무한 스크롤하는 코드를 포함하고 있었다.


2) 페이지네이션이 있는 경우

2-1) ‘다음 페이지로 이동’ 버튼이 있는 경우
버튼을 눌렀을 때 지금 보고 있는 1페이지에서 2페이지로 이동하는 경우다. 한 페이지를 수집한 뒤, ‘다음’버튼을 누르도록 for문을 구성하면 된다.

  • 아래는 ‘챗GPT로 검색한 네이버뉴스 결과 URL이다.
    • https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query=%EC%B1%97GPT

오른쪽 화살표를 클릭하면 2페이지로 이동하는 것을 알 수 있다. 이 경우 한 페이지의 수집이 끝나면 화살표 버튼을 클릭하도록 for문을 구성하면 원하는 만큼 반복 수집할 수 있다. 네이버뉴스는 상대적으로 여러 페이지 크롤링이 용이해서인지, 구글링해보면 참고할 수 있는 블로그 글이 많은 편이다.


2-2) ‘다음 페이지로 이동’ 버튼이 없어, 1,2,3….페이지를 각각 눌러야 하는 경우
네이버쇼핑의 쇼핑몰리뷰가 이렇게 되어 있다.

데스커 노트북책상 쇼핑몰리뷰

화면에 보이는 오른쪽 화살표 버튼은 1~10페이지에서 11~20페이지로 이동하는 버튼이다. (즉, 현재 보이는 10페이지를 기준으로 '다음 10페이지'를 로딩하는 버튼) 따라서 1페이지를 수집한 뒤에는 2페이지, 3페이지 버튼을 이어서 눌러주어야 한다. 이 부분은 아직 구현해보지 못해서 추가적인 검색과 시행착오가 필요하다. 아래 블로그 글을 보면 코드에 페이지 개념이 담겨있는데 직접 돌려보아야 이해가 될 것 같아서 일단 URL만 보관해 둔다. 2022년 3월 글이고 페이징 부분 캡처 이미지가 없어서, 당시에 네이버 쇼핑몰리뷰의 UI가 달랐을 가능성도 있어서 확인이 필요하다. 네이버 쇼핑몰 리뷰 크롤링
#### 3) URL 주소를 활용할 수 있는 경우 오래된 사이트의 경우, URL이 로딩할 페이지나 한번에 로딩할 아이템 개수를 포함하는 경우가 있다. 이 경우 URL 주소 텍스트만 바꿔주면 되므로 조작하기 가장 용이하다. 그래서인지 초보자를 위한 크롤링 강의에서 위와 같은 사이트를 예시로 들 때가 있다. 아래 예시의 예스24는 아이템 리스트의 상단/하단에 '20개씩 보기', '40개씩 보기' 등의 드랍다운 박스가 있다. 이 값을 URL을 통해 서버에 던지는 구조이기 때문에 활용이 가능하다. <예시1 : 예스24> - 예스24는 도서 카테고리별 보기 화면의 URL이 다음과 같다. (국내도서>IT>OS/데이터베이스) - http://www.yes24.com/24/Category/Display/001001003025 - 그러나 '20개씩 보기' 드랍다운의 값을 '40개씩 보기'로 바꾸면 URL이 해당 값을 포함한 값으로 바뀐다. - http://www.yes24.com/24/Category/Display/001001003025?FetchSize=40 - 이 값을 너무 큰 값으로 바꾸는 것은 주의해야 한다. 웹사이트 서버에 부담을 주지 않기 위해 자체적으로 제한값이 걸려있을 수 있고, 또한 예스24한테도 미안한 일이기 때문이다. 적절한 값을 주는게 좋을 것 같고, 내 경우 아래와 같이 1,000개까지는 정상적으로 수집되는 것을 확인했다.
```python # 제어할 브라우저를 띄운다. driver = webdriver.Chrome(service = Service(ChromeDriverManager().install())) # 웹페이지에 접속한다. (로딩할 아이템 개수를 1000개로 지정) url="http://www.yes24.com/24/category/display/001001001013?fetchsize=1000" driver.get(url) ```
<예시2 : 교보문고> - 교보문고의 도서 카테고리별 보기 화면의 URL은 다음과 같다. - https://product.kyobobook.co.kr/category/KOR/0707#?page=1&type=all&sort=new - 여기서 페이지 번호를 2로 바꾸면 다음 페이지로 이동이 가능하다. - https://product.kyobobook.co.kr/category/KOR/0707#?page=1&type=all&sort=new 관심가는 어떤 분야의 텍스트를 빠른 시간에 수집해서 분석해보고 싶다면, 위와 같은 구조의 사이트를 찾아서 먼저 접근해보는 것도 좋을 것 같다. 여러모로 시간 효율을 높일 수 있다.
#### 마무리하며 - 사례를 찾아보다 보니 Selenium만 사용하는 것보다는 (1) 여러 페이지 크롤링에 Selenium을 사용하고, (2) 필요시 BeautifulSoup을 병행 사용해서 데이터를 추출하는 게 좋아 보인다. 특히 무한 스크롤 방식일 경우 그런 것 같다. - 크롤링을 배우던 초반에는 정석대로만 따라했는데, 코드를 읽을 수 있게 된 지금은 for문을 사용하는 코드도 일부 차용해서 따라해볼 수 있을 것 같다. 다양한 사이트/많은 양의 데이터 크롤링을 많이 해보아서 노하우가 있는 분들의 블로그를 찾아서 갈무리해둬야겠다. - 인프런에서 검색해보니 크롤링 강의가 예전보다 많이 늘었다. 강의별 목차를 훑어보며 전체 개념을 정리하고 내가 부족한 부분을 파악해두는 것도 좋을 것 같다.