Python/웹 크롤링

[웹 크롤링] 2. 네이버 실시간 검색어 가져오기

최문경 블로그 2019. 8. 17. 14:24

저번 포스팅에서 우리는 사용자와 서버간의 관계에 대해 간략히 알아보고 이에 대한 이해를 바탕으로 파이썬 코드를 사용하여 네이버의 전체 코드를 가져와봤다.

 

이번 시간에는 네이버 전체 코드 중에서 실시간 검색어를 가져오는 방법에 대해 알아보자.

 

만약 우리가 사람에게 웹상의 어떤 정보를 수집해서 엑셀 등에 저장하라고 지시한다면 해당 정보가 웹상의 어디에 위치해 있는지 말해 주어야 한다.

 

실시간 검색어의 경우 네이버 메인 페이지의 오른쪽 위에 있다. 따라서 사람에게 지시할 경우 오른쪽 위에서 실시간 검색어를 찾으라고 지시해 주어야 한다.

 

하지만 이렇게 웹상의 화면으로 정보를 인식하는 것은 사람의 경우이고, 컴퓨터는 코드로 정보를 인식한다.

 

따라서 사람에게 일을 시키듯 '오른쪽 위에 있는'이라고 정보의 위치를 알려 주는 것이 아니라 '어떤 코드에 있는'이라고 코드를 기준으로 정보를 찾아오라고 일을 시켜야 한다.

이렇게 응답으로 주어진 긴 코드상에서 원하는 부분을 찾아 주는 모듈이 '뷰디풀스프(Beatiful Soup)'이다.

 

 

 

 

응답으로 받은 코드는 정확히 말해서 HTML 코드이다.

 

따라서, Beautiful Soup을 이용하기 위해서는 HTML의 성질을 알아야 한다.

물론 우리는 웹 개발 능력이 필요한 것이 아니므로 필요한 정도, 딱 최소한의 양만을 공부해 보겠다.

 

HTML은 웹에서 내용구조를 담당한다.

만약 우리가 웹에서 '파이썬으로 시작하는 퀀트 주식 투자'라는 제목을 봤다면 그 뒤에는 이 웹 화면을 위해 '<h1>파이썬으로 시작하는 퀀트 주식 투자</h1>'이라는 HTML 코드가 작정되어 있을 것이다. (참고. h는 head의 앞글자를 따서 만든 태그이다, 제목을 쓸 때 사용한다.)

 

여기서 나타내고자 하는 정보나 내용을 감싸고 있는 '<> </>'를 태그 또는 요소라고 한다.

태그는 이름이 있는데 <>안에 있는 맨 처음 단어나 글자가 그 태그의 이름이다 위의 태그의 이름은 'h1'태그이다. 만약 '<p>파이썬</p>'라고 되어 있다면 p태그 HTML 코드라 할 수 있다.

HTML에는 다양한 태그들이 있고 각 태그들은 의미를 가지고 있지만 여기서는 웹 프로그래밍을 하는 것이 아니므로 자세히 알 필요는 없다.

 

 

이제 다시 네이버에서 개발자 모드(F12)를 켜보자.

 

 

 

 

 

 

태그에 대해서 알고 나니까 태그가 눈에 들어오는 걸 느낄 수 있을 것이다. 하지만 여기서 우리가 찾고 싶은 실시간 검색어를 어떻게 찾을 수 있을까? ctrl+F로 지금 실시간 검색어를 찾을 수도 있겠지만 더 편리한 방법이 있다.

 

왼쪽 위의 화살표를 클릭한 후

 

 

 

 아래 처럼 실시간 검색어를 클릭하면 된다.

그러면 실시간 검색어 내용의 코드가 '<span class='ah_k'>내용</span>'과 같은 구조로 구성되어 있는 것을 확인 할 수 있다.

따라서, 실시간 검색어 내용이 들어있는 태그는 span태그라 할 수 있다.

span이 무엇을 의미하는지는 여기서 중요하지 않다.

중요한 것은 우리가 찾고 싶은 내용이 span이라는 태그 안에 들어 있다는 사실이다.

따라서, 이제 우리는 파이썬에게 span태그로 둘러싸인 코드를 찾아 달라고 하면 되는 것이다.

 

 

하지만, 한 페이지의 코드 안에서도 같은 이름의 태그가 많을 수 있기 때문에 태그명만 가지고 검색하는 것은 한계가 있다. 이렇게 수많은 같은 태그들을 서로 구별해 주는 것이 속성이다. 

 

'<span class='ah_k'>내용</span>' 에서 'class'와 같은 것이 속성이다 그리고 class 속성에 대응하는 'ah_k'와 같은 것들을 속성 값이라 한다. 여기서는 class 속성 하나만 사용이 되었지만, 한 태그 안에 그 속성은 여러 개가 사용될 수도 있다.

 

 

이제 컴퓨터에게 어떻게 명령을 내려야 할 지 감이 오지 않는가?

class속성을 가지고 있고 속성값이 ah_k인 span태그들을 모두 찾아오라고 명령을 내리면 우리의 목표인 실시간 검색어를 가져올 것이다.

 

 

 

먼저 bs4를 임포트 해준다. 주의할 것은 import BeautifulSoup이 아니라 import bs4라는 것이다.

 

그 다음, 검색할 대상이 되는 코드를 bs4 모듈의 BeautifulSoup함수에 전달하여야 한다.

그러면 BeautifulSoup함수가 원본 코드를 받아 검색 기능이 있는 뷰티풀스프 형 데이터로 변환시켜 준다.

그 결과를 naver_bs라는 변수에 저장하자. 그리고 'lxml'이라고 문자열을 입력하였는데, 이는 앞의 코드의 형태를 BeautifulSoup 함수에게 알려주는 옵션이다.

 

대부분 웹에서 requests로 가져오는 데이터는 lxml 옵션으로 입력해주면 된다.

 

 

 

이제 naver_bs에는 검색할 수 있는 형태가 저장되어 있다. 이제 find라는 함수와 find_all이라는 함수를 사용해 찾아보자.

 

 

위처럼 첫 번째 인자에는 찾고자하는 내용의 태그를 넣어주고 두 번째 인자에는 속성과 속성값을 넣어주면 된다. 여기서 주의 할 점은 class가 아니라 class_(언더바 추가)라는 점이다. 출력 결과를 보면 하나만 출력되었다 이렇게 find는 같은 코드들이 있다면 그중에 맨 첫 번째 것만 가져오는 것이다.

 

따라서, 현재 실시간 검색어 1위는 펀치넬로인 것이다.

펀치넬로 앞뒤로 붙은 코드들을 보기 싫다면 아래처럼 text를 뒤에 붙여주면 된다.

 

 

 

 

 

 

여기서 만족할 수는 없다. 우리는 모든 실시간 검색어를 알고 싶다. 이 때 찾고자하는 모든 내용을 가져와주는 함수가 find_all이다. 사용방법은 find와 같다.

 

잘 출력된 모습을 볼 수있다.

하지만 여기서 find처럼 앞뒤 코드를 자르기 위해 text를 사용하면 오류가 난다.

왜냐하면 find_all함수는 리스트 형태로 내용을 출력해주기 때문이다.

따라서 하나씩 꺼내서 text처리를 해주어야 한다. 아래처럼 반복문을 사용하면 될 것이다.

 

 

여기까지가 파이썬으로 웹에 있는 정보를 긁어 오는 웹 크롤링의 기본이다. 다음에는 더 어려운 내용으로 돌아오겠습니다.

 

 

- 끝-

 

 

참고 책 퀀트 전략 파이썬으로 세워라