import requests as req
from bs4 import BeautifulSoup as bs
#1. 사이트 정보 요청
req.get("https://www.melon.com/chart/index.htm")
응답이 406이 나온 이유 = 서버에서 브라우저가 아님을 감지
요청을 할 때 브라우저의 정보를 담아서 재 요청한다.
browser = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"}
res = req.get("https://www.melon.com/chart/index.htm",headers = browser)
#2. HTMl 데이터로 변환
soup = bs(res.text, "lxml")
#3 가수 100명, 노래 100곡 수집 = 요소 수집
노래제목 수집
선택자를 분석할 때 class,id 구분자가 없다면 자식 선택자를 활용하자.
* 부모가 구분자가 있을 때 까지 분석해야한다. -> 범위를 좁히기 위해서
* 클래스값 중간에 공백 존재 = 클래스가 여러개 -> 공백을 지우고 클래스를 .으로 이어준다.
title = soup.select("div.ellipsis.rank01 > span > a")
가수이름 수집
singer = soup.select("div.ellipsis.rank02 > span")
#4. 데이터 검증(데이터의 개수, 중복여부)
데이터의 개수가 중요하다면 반드시 검증을 먼저하고 진행한다.
len(title)
크롤링 1회차 정리
- 크롤링 = 인터넷 상에 존재하는 데이터를 수집하는 기술
- requests = 파이썬에서 브라우저 역할을 대신하는 라이브러리
- get("url") = 특정 사이트의 정보를 요청
- .text = HTML 데이터만 추출은 가능 (타입이 String)
- bs = req로 받아온 text데이터를 HTML 데이터로 변환(파싱)
- bs(res.text, "lxml")
- String데이터가 HTML데이터로 변환
- 요소 수집 = select("선택자")
- 선택자는 최대한 정확하게 적는다(범위를 좁힌다.)
- class, id가 있다면 바로 사용이 가능
- 없는 경우에는 부모 태그를 활용한 계층선택자
- 반드시 부모태그도 구분자가 있을 때 까지 분석한다
- 클래스 중간에 공백이 있다면 = 복수의 클래스
- 해결책 : 공백을 지우고 .으로 클래스를 연결한다.
- 데이터 검증
- 수집하고자 하는 데이터가 개수가 중요한 경우
- 데이터의 개수, 데이터의 중복여부
- 오후 수업내용
- 멜론차트 수집 -> 데이터프레임 -> 파일로 저장
- 환율정보 수집(수집이 안된다.) -> 숨은 데이터 찾기
반복문을 통해서 리스트 값들을 확인
for i in singer :
print(i.text)
데이터를 수집할때 원하는 결과가 나오지 않는다면, 반드시 주변 태그들을 살펴보자
크롤링은 다른 사람이 만들어놓은 코드를 분석해서 수집만 가능 -> 코드의 수정을 불가능
가수이름, 노래제목을 컨텐츠만 저장
title_list에 title안에 값을 하나씩 꺼내서 글자만 저장한다.
title_list = []
singer_list = []
for i in title :
title_list.append(i.text)
for i in singer :
singer_list.append(i.text)
반복문을 합치기
코드를 완성할 땐 효율성과 유지보수성을 늘 생각하자.
title_list = []
singer_list = []
for i in range(len(title)) :
title_list.append(title[i].text)
singer_list.append(singer[i].text)
pandas를 통해서 표를 제작
import pandas as pd
컬럼과 데이터 구조를 만들기 위해서 딕셔너리를 활용
리스트 vs 딕셔너리
리스트 = 데이터를 인덱스로 조회 = 같은 의미의 데이터만 저장
딕셔너리 = 데이터를 키값으로 조회 = 다른 의미의 데이터를 저장
data = {"가수" : singer_list, "제목" : title_list}
melon = pd.DataFrame(data)
파일로 저장
대화 : melon을 csv로
파일을 저장할 때 주의할 점!
1) 파일이름, 확장자를 작성하자
2) 한글이 포함된 경우에는 인코딩을 해주자 utf-8, euc-kr, utf-8-sig
melon.to_csv("멜론차트.csv",encoding="utf-8-sig")