# 크롤러 구현을 위한 사전조사

## 기술 스택 선정

이번 프로젝트에서는 빅데이터라는 주제와 세종대학교라는 특정한 범위 내에서의 주제의 정보가 필요하다. 그 수많은 정보를 직접 스크랩할 수 없으므로, 웹에서 표현되는 세종대학교에 맞는 특정 정보를 자동으로 크롤링해주는 프로그램을 제작할 필요성이 있다. 이를 위해서 Python의 라이브러리로 존재하는 **BeautifulSoup와 Selenium**을 선정하였다.

## **BeautifulSoup**

![BeautifulSoup를 사용한 Scrapping Code](https://3577294876-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuOP2y-EE_LM8fqMPe1%2F-LuOPZX-oUuSEcCkt9BZ%2Fimage.png?alt=media\&token=a31c964c-3168-4da6-a2a4-18e42e56d1c8)

BeautifulSoup 라이브러리는 **HTML 과 XML 파일로부터 특정 데이터를 가져오기 위해서 HTML의 태그들을 구성을 트리 형태**로 만들어주어서, 특정 태그에 접근하기 쉽게 만들어주는 라이브러리이다.&#x20;

또한 웹은 HTTP 통신으로 데이터를 주고받기 때문에, 웹 크롤러도 이 데이터를 받기 위해서 Requests 라는 Python 라이브러리가 필요하다. 동작 구성은 아래와 같다. Requests 라이브러리로 HTML 파일의 데이터를 받은 후, BeautifulSoup 라이브러리를 통해서 HTML 파일의 데이터에 있는 태그들을 트리형태로 구성한다.&#x20;

그 이후 사용자가 원하는 태그에 접근하여, 해당 태그 속에 있는 유의미한 정보를 가져와서 데이터베이스에 저장한다. BeautifulSoup의 장점은 Requests를 사용한 HTTP 통신을 이용하기 때문에 웹에서 보여주는 시각적인 정보를 Browser에 표시할 필요가 없다.&#x20;

그러므로 정보 파싱 및 크롤링 속도가 빠르다. 하지만 **단점으로서는 Sing Page Application 구조 및 Javascript를 이용한 비동기 처리된 데이터들은 파싱할 수 없다는 단점**이 있다.

## Selenium

![Selenium을 사용한 Web Scrapping Code](https://3577294876-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuOP2y-EE_LM8fqMPe1%2F-LuOPj_vg-AZ1r6CftqQ%2Fimage.png?alt=media\&token=6af2f0a7-da8a-47c3-b75c-51050a9f4666)

Selenium 라이브러리는 일방적으로 **Web App을 테스트할 때 주로 사용하는 프레임워크**이다. 일종의 Web 동작 자동화 라이브러리로서 **사용자가 Browser을 직접 조작하지 않아도 자동으로 탐색해주고 원하는 정보를 찾는다.**&#x20;

Selenium의 기능 중에서는 컴퓨터가 직접 Web Browser을 띄운 후 지정 명령에 따라서 동작할 수 있도록 webdriver이라는 Api를 제공한다. 따라서 Selenium을 사용하기 위해서는 사용할 Browser의 driver이 필요하다.&#x20;

이 후, Python을 통한 Selenium의 Api와 Browser Driver을 연결하면, 자동화된 Web 동작이 가능하다. Selenium의 장점은 직접 Web Driver을 통해서 원하는 정보에 접근하기 때문에 실제 사용자가 웹을 이용하였을 때, 얻을 수 있는 정보에 모두 접근 가능하다는 장점이 있다.&#x20;

**하지만 실제 웹 브라우저와 같은 Web Driver을 사용하기 때문에, 사용자가 필요 없는 정보도 전부 보여지게 된다. 그래서 내가 필요한 정보를 얻는데까지의 속도가 느리다는 단점**도 있다.

## BeautifulSoup vs Selenium

Python의 BeautifulSoup와 Selenium 라이브러리의 차이는 다음 표와 같다.

| BeautifulSoup                                                                           | Selenium                                                                                           |
| --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| <p></p><ul><li>문서 Text를 가져오기 때문에, 크롤링속도가 빠름.</li><li>비동기 통신을 이용한 정보에는 접근이 힘듦.</li></ul> | <p></p><ul><li>Web Driver 기반 크롤링이기 때문에, 정보 수집 속도가 다소 느림.</li><li>비동기 통신을 이요한 정보에도 접근 가능.</li></ul> |

실제로 사용하는 Web 사이트에서는 비동기(Async)통신과 동기(Sync)통신이 공존하고 있다. 예로 들면, HTML 파일은 그대로 존재하면서 **Javascript 및 Jquery를 이용한 비동기식 통신에서는 Selenium이 반 필수적**이다.&#x20;

하지만 Selenium을 사용하지 않아도 충분히 **가능한 사이트에서는 BeautifulSoup를 사용하는 것을 크롤링 속도를 높일 수 있으므로**, 이번 프로젝트에서는 BeautifulSoup를 사용하는 것을 기본으로 설정하며, BeautifulSoup를 이용해서 수집하지 못하는 Web 사이트 경우에는 Selenium을 이용해서 정보를 수집하는 것을 지향하는 방향으로 나아간다.

## Robots.txt 및 서버 부하 방지

대다수의 Web 사이트에서는 Robots.txt 라는 파일을 Web Server에 가지고 있다. 이 Robots.txt 파일에는 해당 **웹 사이트에 로봇이 접근하는 것을 방지하기 위한 접근 제한에 대한 설명을 기술**하고 있다.&#x20;

이 파일은 본래 로봇으로 인한 요청으로 Web Serve에 부하가 가지 않도록 하는 안내도이다. 그러므로 본 프로젝트에서의 크롤링 프로그램에서는 프로젝트를 진행할 때, **Robots.txt 파일을 준수하며 크롤링 프로그램으로 인한 요청으로 해당 Web Server에 부하가 가지 않도록 하기 위해서, 크롤링 속도를 고의적으로 낮추었으며, 필요한 정보 수집 이외의 목적으로 정보를 수집하지 않도록 프로그램 제작**을 하도록 지향한다.

## References&#x20;

{% embed url="<https://support.google.com/webmasters/answer/6062608?hl=ko>" %}

{% embed url="<https://www.crummy.com/software/BeautifulSoup/bs4/doc/>" %}
