크롤링

[크롤링]2. 크롤링 실습

CodeJaram 2023. 6. 27. 08:08

[멜론 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