본문 바로가기

파이썬(python3)/기타

파이썬 크롤링 001 - 구성요소, 구현방법 / 데이터수집 자동화

안녕하세요 ! 오랜만에 정말 오랜만에 잡다한 기술 내용으로 포스팅을 하네요.

이번에 조금 길게 정리해보고 싶은 주제는 크롤링입니다. 크롤링이 꼭 개발자의 영역은 아닌것 같습니다. 누구나 개발할 수 있는 영역이라 생각하고 복잡한 내용은 조금 공부하면 충분히 할 수 있는 부분이라고 생각됩니다. 첫 번째 포스팅은 구현 방법을 정리하는 정도로 마치고 두번째, 세번째 이어가면서 실제로 어떻게 크롤링 프로그램을 구현하는지 더 할 수 있으면 수집한 데이터를 데이터베이스에 저장하고 관리하는 내용까지 정리해보려고 합니다.

 

이 포스팅을 보고 계시다면 당연히 검색으로 들어오셨을 확률이 매우 높죠. 검색어에는 '크롤링 (crawling)' 이 포함되었을 확률도 매우 높다고 생각됩니다. 따라서 크롤링이 뭐야? 는 넘어가도 되겠죠. 크롤링하는 목적은 당연히 데이터를 수집하기 위함이라고 생각됩니다. 데이터가 어딘가에 존재하는데 내가 원하는 방식대로 표현되고 있지 않아서 혹은 데이터가 여러 군데에 나뉘어서 존재해서 등등의 이유로 우리는 크롤링을 통해 데이터를 수집해서 내가 원하는 방식대로 표현해서 어떤 정보로 가공하고 싶은 니즈가 있죠. 데이터 가공은 이 포스팅의 범위를 벗어나는 내용이니 데이터 수집, 즉 크롤링에 조금 더 집중해볼게요.

 

기본 개념도

  위 그림에 포함된 요소들을 하나씩 정리해봐요.

 

  스케줄러(Scheduler): Cron으로 등록하는게 일반적이라고 이야기 할 수 있겠습니다. 정해진 시간에 크롤러 모듈 혹은 코드를 실행해줘 ! 라고 생각하시면 되겠죠? Airflow 같은 것도 있습니다. 조금 더 본격적인 스케줄러라고 보시면 되고요. 사람도 스케줄러가 될 수 있습니다. 매일 오전 9시에 사람이 크롤러 모듈을 실행하면 스케줄러 같은 기능을 하는 것이죠. 물론 부정확하겠죠? 어떤 날은 9시 1분, 어떤 날은 깜빡하고 10시에 실행할지도 모르니까요. 매일 매시간 수행되어야 하는 크롤러도 있을 수 있죠. 이런 경우에는 사람은 잠을 자야 하니까 cron 등록을 하는게 좋겠습니다. 

 

  크롤러(Crawler): 웹 브라우저가 하는 일과 크게 다르지 않습니다. 단지 사람이 크롬을 켜고, URL 주소를 입력하고 엔터치고 화면이 나타나기까지 기다리고 하는 과정을 코드가 하는 것이죠. 크롤러와 뒤에 이야기할 파서(Parser)를 합칠 수도 있고, 데이터 가공하는 부분을 뒤에 붙일 수도 있고 그렇습니다. 저는 크롤러와 파서를 분리해서 이야기 드리고 싶네요. 다시 정리하면 크롤러는 수집하려는 URL에 접속해서 데이터를 가지고 오는 단계라고 이해하시면 되겠습니다. 

 

  파서(Parser): 크롤러가 수집한 정리되지 않은 HTML 코드가 잔뜩 있는 데이터 중에서 필요한 부분만 파싱(Parsing)하는 일을 합니다. 파이썬에서는 주로 Beautifulsoup4를 사용하시면 적은 코드로 원하는 부분만 잘라낼 수 있습니다. 저는 오히려 크롤러보다 파서가 더 중요하다고 봅니다. 그냥 데이터를 쭉 가지고 오는 코드는 비교적 쉽고, 간단합니다. 파서는 크롤러가 가지고 온 데이터의 구조를 이해해야 하기 때문에 조금 더 복잡한 경우가 많죠. 수정도 크롤러에 비해 더 빈번하게 이뤄지고요. 

 

  DB: 데이터베이스에 저장하는 것도 파서가 한다고 위에 그림에서 되어 있습니다. 누가하던지 크게 상관없지만, 데이터베이스에 저장하기 위한 내용을 파서가 만들어내니까, 만들고 DB에 저장한다 정도로 이해하시면 됩니다. 

 

  URL: 어떤 URL도 상관이 없습니다. 하지만 로그인해야만 볼 수 있는 페이지, 그냥 아무나 URL만 치면 볼 수 있는 페이지는 개발 내용이 다릅니다. 당연히 로그인해야만 볼 수 있는 페이지가 더 어렵겠죠. 

 

 

  크롤러와 파서 구현하는 방법은 너무너무너무 많겠죠?

 

  언어선택: 대부분의 프로그래밍 언어에서 가능합니다. 편하신 것을 선택하시면 됩니다. 저는 파이썬을 주로 사용하니까 파이썬을 선택하고 있고요. 언어가 다른 언어에 비해서 접근이 쉬우니 비개발자 분들도 많이 선택하실 것 같습니다.

 

  스케줄러: 구현보다는 있는것 잘 가져다 쓰는게 좋겠습니다. cron만으로도 충분하고요. 조금 더 신경쓰실 분들은 Airflow 적용도 괜찮습니다. 

 

  크롤링대상: 어떤 URL 입니다. https://ngee.tistory.com/이 될 수도 있고요. https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EC%98%81%ED%99%94&oquery=%EC%97%B0%EC%95%A0&tqi=Upwpisp0YiRssZSAA9NssssssC0-113869 이런 네이버 검색결과 페이지 일 수도 있죠. 구글도 되고요. https://www.google.com/search?q=%EC%84%9C%EC%9A%B8&oq=%EC%84%9C%EC%9A%B8&aqs=chrome..69i57j69i65l2j69i61l3.638j0j4&sourceid=chrome&ie=UTF-8 3개의 URL은 모두 로그인 없이 접근이 가능한 페이지입니다. 하지만 아래 URL 한 번 들어가보세요. https://ngee.tistory.com/manage/ 로그인이 필요하기 때문에 로그인 페이지로 이동하죠? 두개는 조금 접근 방법이 다릅니다. 먼저 로그인이 필요 없는 페이지는 그냥 해당 URL에 접근하면 끝입니다. 로그인은 조금 복잡해지죠. 코드로 로그인 후 크롤링 하려는 페이지에 접속해야 하기 때문이에요. 어찌대뜬 URL입니다.

 

  크롤링방법: 파이썬 코드만으로도 크롤링이 가능합니다. 혹은 Selenium을 활용해서 직접 브라우저를 띄우고 버튼을 누른다던지, 스크롤을 움직여서 데이터를 더 불러오는 등의 작업을 하고 크롤링을 수행하도록 하는 방법도 있죠. URL에 접속하면 벌어지는 일들에 대해서 자세히는 아니더라도 간단하게는 알고 계시는게 좋을 것 같아요. 접속하면 서버에서 HTML, Javascript 등등의 코드를 보내줍니다. 웹브라우저로 접속하면 서버가 보내준 코드를 쭉 읽어서 화면으로 만들어서 보여주고요. 크롤링 코드로 접속하면 화면으로 보여주는게 아니라 서버가 보내온 코드를 파서에게 보내주기만 하면 되겠죠? 데이터 중에서 원하는 부분만 파싱해주는게 파서의 역할이니까요.

 

  파서대상: 크롤러가 서버에게서 받은 데이터 입니다. 

 

  파싱방법: 파이썬을 사용하신다면 주로 Beautifulsoup4를 사용하시게 될거에요. 주로 HTML 태그로 감싸진 데이터 중에 일부를 파싱하게 됩니다. 따라서 HTML의 기본적인 내용을 알고 계시다면 훨씬 사용이 수월합니다. Id, Class에 대해서 알고 계셔야 핀셋으로 집어내듯 데이터를 파싱하실 수 있습니다. 

 

  파싱 후 DB 저장방법: 파싱을 완료 한 뒤에는 여러 가지 방법으로 데이터를 기록할 수 있죠. 엑셀, cvs와 같은 파일로도 저장할 수 있고요. 혹은 DB에 저장하도록 할 수 있습니다. DB에 저장하는 방법은 해당 DB의 connector 라이브러리를 사용하거나 Django 같은 프레임워크로 개발이 된 시스템이 있다면 특정 URL로 데이터를 보내서 저장하거나 아니면 직접 저장하도록 등등 여러 가지 방법이 있을 수 있습니다. 제가 작성하려는 내용에서는 조금 벗어나는 부분이라 시간이 된다면 추후 작성하도록 하겠습니다.

 

 

  다음에는 파이썬으로 크롤링하는 실제 코드로 만날게요 !

 

 

http://cchart.xyz/

 

cchart.xyz / 데이터 수집,가공 서비스

반복적인 웹 데이터 수집, 가공서비스

cchart.xyz