Week3_1 파이썬으로 데이터 수집하기
오픈소스 패키지란?
배울 것
- 라이브러리의 개념 이해하기
- 외부 라이브러리 설치(BeautifulSoup4, requests)
파이썬은 오픈소스 생태계 안에서 개발되었기에 누구나 사용, 수정, 재배포가 가능하다.
대표적인 파이썬 오픈소스 패키지
1. 장고(Django)
웹개발에 필요한 여러가지 기능들을 구현해놨음. 장고로 개발된 유명한 것은 인스타그램, 유튜브 등이 있다.
2. 플라스크(Flask)
장고보다 가볍다. 웹개발에 필요한 최소한의 기능만이 구현되어있기에 숙련자가 사용하기 좋다. 플라스크로 개발된 것은 핀터레스트, 링크드인 등이 있다.
3. 판다스(Pandas)
시트형태(엑셀, 구글시트 등)의 데이터를 쉽게 다룰 수 있는 패키지이다. 이는 독립적으로 사용되기보다 데이터분석과같은 통계 툴들과 같이 많이 사용된다.
4. 리퀘스트(Requests)
웹상의 데이터를 가져올 수 있는 패키지이며 웹페이지에서 원하는 데이터를 가져올 때 사용한다.
5. 뷰티풀숲4(BeautifulSoup4)
HTML코드를 파싱하여 원하는 데이터를 추출할 때 사용하는 패키지이다. 데이터수집에서는 Requests를 통해 가져온 데이터를 태그 단위로 자르기 위해 사용한다.
파이썬에서 원하는 패키지를 다운받으려면
pip(Pythan Package Index)
라는 별도의 도구를 통해 다운받는다.
파이썬으로 데이터 수집하기
오픈소스 패키지 활용하기; requests, bs4
request와 BeautifulSoup4를 사용하기 전에 먼저 호출을 해주자.
import requests
from bs4 import BeautifulSoup
# 이때, bs4안에 BeautifulSoup이 있는 것이므로 뒤에 4를 안붙여주어도 된다.
이제 requests라는 패키지 안의 get()함수를 사용해보자.
다음은 get()을 통해 다음 url의 소스를 가져와 raw라는 변수에 저장하는 것이다.
raw = requests.get("https://tv.naver.com/r/")
print(raw)
'''
======출력=======
<Response [200]>
================
'''
<Response [200]>이라 출력된다면 성공적이지만 404
와 같은 숫자가 나온 경우에는 잘못된 것.
이때, 가져온 raw데이터를 출력창에서 소스코드로 보고싶다면?
print(raw.text)
또, 페이지의 소스를 가져오는데 걸린 소요시간을 알고싶다면?
print(raw.elapsed)
이제 BeautifulSoup를 써보자.
html = BeautifulSoup(raw.text, 'html.parser')
print(html)
이를 실행하면 출력창에 그대로 소스코드가 나오는 것을 볼 수 있다.
이때, requests.get()과 BeautifulSoup을 통해 소스코드를 가져오는 것과의 차이가 뭘까?
get함수를 통해 가져온 소스코드는 단순한 '문자열'에 불과하다.
하지만 BeautifulSoup의 html parsing을 통해 가져온 것은 HTML소스코드로써 태그별로 구분하고선택자를 활용가능
하여 원하는 데이터를 찾을 수가 있다.
데이터 수집기 완성하기
네이버티비 페이지 크롤링하기
import requests
from bs4 import BeautifulSoup
raw = requests.get("https://tv.naver.com/r/")
html = BeautifulSoup(raw.text, 'html.parser')
어떤 순서로 먼저 데이터 수집을 할까?
컨테이너 선택자를 통해 1~3위까지의 컨테이너를 수집한 후, 첫번째 컨테이너 안에서 제목, 채널명, 재생수, 좋아요수를 수집하고 그다음에 컨테이너별로 계속 수집하는 것.
- 1~3위 컨테이너 : div.inner
- 제목 : dt.title
- 채널명 : dd.chn
- 재생수 : span.hit
- 좋아요수 : span.like
1. 컨테이너 수집
변수이름 = BS.select("선택자")
이때, BS = html.parser로 파싱된 소스코드
container = html.select("div.inner")
print(container)
출력된 container의 데이터를 보면 대괄호[] 로 둘러쌓인 것을 확인할 수 있다. 이는 데이터가 리스트 형태로 되어있음을 알 수 있다.
select
를 사용하면 html이라는 소스코드 안에 이 선택자를 통해 선택된 모든 데이터를 골라준다.
그런데 데이터가 여러가지 이므로 그 데이터를 리스트의 형식으로 저장해주는 것.
따라서
print(container[0])
을 실행시킬 경우, 리스트의 첫번째 요소에 대한 소스가 나온다.
이 select함수는 위에서 raw.text라는 소스코드를 파싱하여 html이라는에 변수 저장해주었기 때문이다.
파싱된 코드에서 div.inner를 콜라달라는 의미로 이해하면 된다.
2. 영상데이터 수집
title = container[0].select_one("dt.title")
print(title)
이렇게 출력된 title에는 우리가 원하는 '제목'이 있지만, 원하지 않는 태그들도 포함되어 있다.
제목이라는 텍스트 데이터만을 원한다면..?
select를 사용하면 태그 데이터까지 모두 포함되기 때문에 이럴땐title.text
를 넣어주면 태그를 제외하고 내가 원하는 텍스트 데이터만 출력되게 된다.
title = container[0].select_one("dt.title")
print(title.text)
이때,
select와 select_one의 차이
는?
select는 "선택자"에 선택할 수 있는 모든 데이터를 리스트 형식으로 저장한다.
그렇기에 select를 사용해서 내가 원하는 값 하나를 설정하려면 리스트의 인덱싱 방법을 사용해야 한다.
그런데 select_one의 경우... dt.title
을 통해 가져올 수 있는 모든 데이터중에 하나만 가져온다.
title = container[0].select_one("dt.title")
print(title.text)
아니면
title = container[0].select("dt.title")
print(title[0].text)
으로 써도 가능하다.
이때, 제목뿐 아니라 채널명, 조회수, 좋아요수까지 가져와보자.
chn = container[0].select_one("dd.chn")
hit = container[0].select_one("span.hit")
like = container[0].select_one("span.like")
print(chn.text.strip())
print(hit.text.strip())
print(like.text.strip()) # 공백 제거를 위해 .strip()
3. 반복하기
여태 컨테이너 하나만 수집하였는데 이제 모든 컨테이너를 수집하기 위해for문을 활용
해보자
for cont in container:
title = cont.select_one("dt.title")
chn = cont.select_one("dd.chn")
hit = cont.select_one("span.hit")
like = cont.select_one("span.like")
print(title.text.strip())
print(chn.text.strip())
print(hit.text.strip())
print(like.text.strip())
print("="*50) # 각 컨테이너를 구분하기 위한 구분선
크롤링을 하면 다음과 같은 화면이 뜹니다.
현재 크롤링을 하니 최설리님에 관한 영상이 뜨네요.
그녀의 선택이 너무 안타깝고 그녀가 홀로 내몰렸을 상황에 화가나고 눈물이 납니다.. 아무쪼록 그녀가 부디 그곳에서는 편안하고 행복하길 바랍니다..
'Data_Analysis' 카테고리의 다른 글
[코알라univ]3_3. 파이썬으로 데이터 수집하기 (0) | 2019.10.29 |
---|---|
[코알라univ]3_2. 파이썬으로 데이터 수집하기 (0) | 2019.10.28 |
[코알라univ]2. 데이터수집을 위한 기초 파이썬 (0) | 2019.10.10 |
[코알라univ]1. 웹페이지의 이해 (0) | 2019.10.02 |
데이터분석 공부 시작 (0) | 2019.09.19 |