본문 바로가기
코알라UNIV

3주차 파이썬으로 데이터 수집하기

by 인듯아닌듯 2019. 10. 17.

매주차에 배우는 양은 정량적이지만, 기존의 알고있던것과 접목되면서 새로이 알게되는 정보와 생겨나는 오류들은 나의 머리속을 주머니속에서 꼬인 이어폰 줄처럼 꼬이게 한다. 배움이 커질 수록 이해는 올라가지만 복잡도는 기하급수적으로 증가한다. 그래서 글을 작성하면서 다시 정리하고자한다.

 

-모임전 정리

우리는 requests와 BeautifulSoup를 이용해서 크롤링을 한다.

다양한 페이지를 크롤링하면서 두 라이브러리의 모듈과 익숙해졌다.

또 "Container와 선택자를 어떻게 잡아야하는가" 에대한 깊은 고민 끝에 어느정도  최적화를 시킬 수 있었다.

(->네이버 블로그에 개인적으로 정리해놓음)

 

 

자잘구래한 생각과 정보를 얻게 되었는데, 그것을 나열하고자한다.

Requests와 BeautifulSoup에 관하여,

1.html에서 가능했던 :not(span) :nth-child(1) 은 BeautifulSoup에 와서는 사용할 수 없는 것으로 확인

->startag라는 사이트를 크롤링하면서, :not(.classname) 사용 가능한 것으로 확인됨 10/30

2.Container의 마지막이 li 였다면, Container에 담긴 정보는 <li></li>로시작해서 안에 들어있다. 따라서 선택자를 li부터 써도된다.

3. Web에 쓰여진 형식이 대부분은 유니코드(문자기반)이지만, 바이트코드(이미지기반)인 경우가 있다. 이때는 크롤링을 해주어도 글자가 깨져서 나오는데, 이때의 해결법은 raw.text(유니코드)가 아닌 raw.cotent(바이트코드)로 변환후 UTF-8를 이용하여 인코딩해주면 다시 유니코드화 된다.

4. Melon 음악에 대한 크롤링

1)최적화가 필요한 이유이자, 하나의 셀에 값이 두개 들어가는 경우가 문제가됨

듀엣곡이여서 가수가 두명!

먼저 Container는 #lst50 으로 해야한다. hidden으로 숨겨져있는 51~100위가 있다.

따라서 Html select를 통해 따라가서 div.ellipsis rank02 > a를 하면 55개가 나오게되고, requests는 select_one에서 하나의 값만을 담기 때문에 뒤에 나오는 Camila Cabello 데이터는 소실되게된다.

따라서 두값을 모두 포함하게 해주려면 div.ellipsis rank02 span 을 하면 두값을 모두 가져올 수 있다.

 

2)이번주차에는 파이썬 코딩을 통해서 같은형식의 다양한 페이지를 한번에 출력해낼 수 있었다.

지금까지는 #id 에 대한 맹신이 있었는데, 그것도 완전한 정답은 아니였다.

page1에서는 container의 #lst_50이 페이지가 변하면서 #lst_100이 되어버린 것이다. 따라서 오히려 구조로 잡는 것이 두 페이지를 모두 아우룰 수 있는 container가 될 수 있을 것 같았다.

하지만 그러한 container는 찾을 수 없었고, 이러한 것이 requests의 약점이자 한계 인것 같았다.

1~50위 에서는 container가 tr#lst50으로 묶이는 모습
51~100위 에서는 container가 tr#lst100으로 묶이는 모습

각 페이지마다 오히려 구조는 같고 #id값은 개별적이라서, 반복문 보다는 조건문을 사용해서 페이지를 선택하여 크롤링을 하도록 코딩을 짰다.

 

1. 1주차에 생각했었던 크롤링이 결국은 해킹연관있지 않을까하는 물음에 있어서, 이번 주차에 안티크롤링을 배우면서 예상을 빗나가지않았다. 현재 우리가 Data Science를 하고 있는만큼 데이터의 가치는 높다. 특히 웹사이트에서 보여주는 데이터는 아마도 DB시스템에서 정제된 Data이므로 그 가치는 상당할 것이다. 그렇기 때문에, 자신들이 만들어놓은 데이터를 빼앗기지 않기위해 여러가지 노력을하고있다.

 

2. 내제적으로는 컴퓨터의 효율과 속도에 대한 신경을 쓰려고했던거같다. 아무래도 최근에 자료구조에 대한 책을 읽다보니 Back-end에 대한 내용들이 신선하게 다가왔기 때문일 것이다. 하지만, 현재는 가독성과 쓰기 편한 것에 집중을 해야겠다. 이역시 효율과 성능만큼이나 중요한 것으로 사람이 일을 처리하고 유지보수하는데에 있어서 협업하고 의사전달을 잘하기위해서는 코드 역시 가장 읽기 좋은 형태가 좋은 코드라는 생각도 든다. 예를들면 파이썬이 현재 Java, C의 영역을 넘보면서 사용영역을 넓히는 것 역시 파이썬은 가독성이 좋기 때문이다. 현재 컨테이너와 선택자를 잡는 것을 최적화 한 것도 이와 같은 이유이다.

 

3. 우리팀의 시각디자인과 친구가 본인의 전공과 관심사에 맞춰서 네이버라이브러리뉴스를 통해 '유행'이라는 키워드를 통해 많은 정보를 얻고 싶어하였다.

네이버 뉴스라이브러리

html의 구성으로 설명하자면 <input>으로 입력된 정보가 <form>을 통해 서버로 이동될 변수들이 많았다.

그래서 키워드검색에 유행이라고 쳤을 뿐인데도, 알 수 없는 수와 문자의 나열로 표기되었다.

https://newslibrary.naver.com/search/searchByKeyword.nhn#%7B%22mode%22%3A1%2C%22sort%22%3A0%2C%22trans%22%3A1%2C%22pageSize%22%3A10%2C%22keyword%22%3A%22%EC%9C%A0%ED%96%89%22%2C%22status%22%3A%22success%22%2C%22startIndex%22%3A1%2C%22page%22%3A1%2C%22startDate%22%3A%221920-04-01%22%2C%22endDate%22%3A%221999-12-31%22%7D

이 복잡한 코드에서 어떤문자의 변화가 우리가 원하는 페이지를 가게 해주는지 알아내야했다. 그래서 멤버중 한명이 제안하기를 이 문장 전체를 구조에따라 끊어쓰기보다는 두개의 도메인을 복사해서 비교해보자는 생각을 했다. 그래서 우리는 page변화값은 빨간 숫자가 page번호라는 것을 쉽게 알 수 있었다.

 

앞으로도 이용할 일이 많을 것 같아서, python파일로 문자열을 비교하는 알고리즘을 간단하게 짜보았다.

문자열 비교.py
0.00MB

이 프로그램을 이용해서, 하나하나 조작변인을 변경하면서 '네이버뉴스라이브러리'가 어떤 html주소변화를 통해 페이지가 바뀌는지 확인해보고자 했다.

하지만 네이버는 크롤링은 다 막아놨다고한다. (https://www.naver.com/robots.txt)

없던일로 하고 파이썬 코드만 짜보기로 한다.

 

+Tip  

python 단축키

shift+F6 :변수명 한번에 변경

shift / shift + Tab :한꺼번에 들여쓰기, 한번에 빽스텝

Alt + 클릭 : 다중커서

html

div 위치에 검사누르면 바로 특정선택자까지 가줌 (+ctrl shift c 와 같은 기능)