[멜론 TOP 100]
[실습]멜론 차트 TOP100 가져오기
1. 페이지 불러오기
● 보안상 접근 불가한 경우 우회접속하는 방법
-개발자모드(F12)Network-F5-맨 위에 있는 document 문서 열기
-Headers-User-Agent 값 복사
-변수={’User-Agent’: User-Agent 값}
-req.get(url, headers=변수)
2. bs 객체화하기: soup=bs(res.text, 'lxml')
3. 원하는 태그 선택하기
-클래스명에 공백이 있는 경우 온점(.)으로 대체하기 예)ellipsis rank01→ellipsis.rank01
-공백은 자손선택자를 의미하므로 'ellipsis'의 자손선택자 'rank01'로 이해함
-클래스명에 공백이 있는 이유: 클래스가 여러 개이기 때문
예)ellipsis rank01→ellipsis 클래스의 rank01 클래스
● 노래제목 태그: song=soup.select('div.ellipsis.rank01>span>a')
● 가수명 태그: singer=soup.select('span.checkEllipsis')
-span태그 안에 있는 a태그를 수집하면 한 노래를 함께 부른 가수들이 있는 경우
가수명이 여러 번 출력됨→span 태그를 입력하면 한꺼번에 수집됨
-크롤링하기 전에 페이지 구성을 잘 살펴보기!
4. 반복문을 활용하여 TOP100 출력: 빈 리스트 생성-contents를 반복해서 리스트에 저장
song_list=[] #노래제목
singer_list=[] #가수
rank_list=[] #순위
for i in range(len(song)): #모든 리스트를 반복하기 위해 range 함수 사용
song_list.append(song[i].text)
singer_list.append(singer[i].text)
rank_list.append(i+1) #1~100위로 출력하기 위해 i+1
5. 리스트를 dataframe에 저장하기
1)딕셔너리 생성: dic={'노래 제목': song_list, '가수명': singer_list, '순위': rank_list}
2)데이터 프레임 생성: melon=pd.DataFrame(dic)
3)순위를 인덱스로 변경: melon.set_index('순위', inplace=True)
4)csv 파일로 내보내기: melon.to_csv('파일제목명'.csv', encoding='인코딩 방식')
-엑셀: melon.to_csv('멜론차트.csv', encoding='euc-kr' )
-텍스트 형식: melon.to_csv('멜론차트.txt', encoding='euc-kr' )
[바디럽 리뷰 데이터 수집]
1. 라이브러리 불러오기: requests, BeautifulSoup import하기
2. iframe 태그: 화면에는 존재하지만 실제 데이터는 다른 서버에 존재하는 것
● 실제 데이터가 저장된 iframe 주소 찾는 방법
-개발자도구(F12)-iframe 검색(Ctrl+F)-실제 사용되는 iframe 찾기(블럭 생성)
-실제 데이터 주소: iframe-src에 적힌 주소
-해당 주소를 활용하여 페이지를 불러와서 데이터 수집
3. 페이지 불러오기: 우회접속하기
url='바디럽 리뷰 페이지 주소(iframe src 주소값)'
user_agent='user_agent 값'
h={'User-Agent':user_agent}
res=req.get(url, headers=h)
4. bs 객체화: soup=bs(res.text, 'lxml')
5. 리뷰 데이터 추출(태그 선택하기): soup.select('div.클래스명')
-출력결과 없음→iframe 태그를 통해 다른 서버에 있는 리뷰 데이터를 보여주고 있음
-실제 데이터가 저장된 iframe 주소로 찾아가서 contents를 추출해야 함
6. 데이터 전처리
1)공백 제거: 텍스트.strip() 예)review[0].text.strip()
2)문자열 제거
-해당 문자열 있는지 확인(in 연산자): 원하는 문자열 in '데이터'(결과값 boolean)
예)'네이버 페이 구매평' in naver_review
-해당 문자열 슬라이싱: 리뷰 수가 각각 다르므로 뒤에서부터 슬라이싱
예)naver_review[ -38:]
-데이터에서 문자열 제거(replace 함수): 슬라이싱한 값을 공백으로 대체
예)naver_review.replace(naver_review[ -38:], '')
7. 반복문을 활용하여 1페이지 리뷰 수집
naver_review=[]
review_list
for i in range(len(review)):
naver_review.append(review[i].text.strip()) #공백제거
if '네이버 페이 구매평' in naver_review: #네이버 구매평 제거
naver_review=naver_review.replace(naver_review[-38:], '')
review_list.append(naver_review) #데이터 전처리가 된 데이터 저장
8. 반복문을 활용하여 1~10페이지 리뷰 수집
-페이지가 바뀌면 url에 있는 page 수가 변경됨
-url에서 페이지 수가 계속 변경되도록 변수로 만들기
(원래 페이지 주소)
‘https://review4.cre.ma/bodyluv.kr/mobile/products/reviews?app=0&device=mobile&ifra
me=1&iframe_id=crema-product-reviews-1&page=2&parent_url=https…(생략)’
(페이지 수 변수로 변경)
url=f'https://review4.cre.ma/bodyluv.kr/mobile/products/reviews?app=0&device=mobile
&iframe=1&iframe_id=crema-product-reviews-1&page={page_num}parent_…(생략)’
for page_num in range(1,11): #페이지의 범위
url=‘page를 page_num으로 변경한 주소’
for i in range(len(review)):
naver_review.append(review[i].text.strip()) #공백제거
if '네이버 페이 구매평' in naver_review: #네이버 구매평 제거
naver_review=naver_review.replace(naver_review[-38:], '')
review_list.append(naver_review) #데이터 전처리된 리뷰 저장
review_list
9. 데이터 수집 진행률 확인하기
(참고) 선택자 종류
10.워드 클라우드
1)pandas 라이브러리 불러오기
2)딕셔너리에 리뷰 데이터 추가하고 데이터 프레임 만들기
3)리뷰 데이터 파일로 만들기
-csv 파일로 변환하기: re_df.to_csv('컬러샤워기.txt', encoding='utf-8')
-파일 열기: f=open('컬러샤워기.txt', 'r', encoding='utf-8')
-파일 읽기: data=f.read()
-파일 닫기: f.close()
4)wordcloud 다운로드: pip install wordcloud
5)matplotlib 라이브러리 불러오기
6)wordcloud 만들기: wordcloud('폰트경로', '배경색', ‘글자색;).generate(파일 변수)
wc=WordCloud(font_path='C:/Windows/Fonts/Malgunbd.ttf',
background_color='white',
colormap='Dark2').generate(data)
-폰트 저장위치: C:\Windows\Fonts
-역슬래시(\)→슬래시 /로 변경
7)단어의 비중 보여주기
wc.words_
8)워드 클라우드 이미지 만들기
-크기 지정: plt.figure(figsize=(가로, 세로))
-축 제거: plt.axis(‘off’)
-이미지 보여주기: plt.imshow(워드클라우드명)
-파일 저장하기: plt.savefig(‘./파일명.jpg)
'크롤링' 카테고리의 다른 글
[크롤링]5. 이미지 데이터 수집 (0) | 2023.07.04 |
---|---|
[크롤링]4. selenium 실습 (0) | 2023.06.29 |
[크롤링]3. selenium 라이브러리 (0) | 2023.06.28 |
[크롤링]1. 크롤링 기초 (0) | 2023.06.26 |