Python

파이썬 크롤링과 시각화 기본다지기(5)

J개발자 2021. 9. 28. 15:55
이번 장에서는 음원사이트 내 음원차트를 크롤링해보고 , wordcloud를 실습해볼 것이다.
import requests
from bs4 import BeautifulSoup

url = 'https://movie.naver.com/movie/sdb/rank/rmovie.naver'
r = requests.get(url) 
html = r.text
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all('div',class_ = 'tit3')

#td 태그를 find 하면 여러가지 태그들이 나오지만 순위만 가져오기 위한 코드 작성
tr = soup.find_all('tr')
rank =[]
for i in tr:
  td = i.find('td',class_='ac')
  if td != None:
     imgtag = td.find('img')
     if imgtag == None:
       rank.append(None)  #이미지 태그 없는 부분 을 append
     else:
       rank.append(imgtag.get('alt'))
print(rank)

for i in range(len(rank)):
   if rank[i] == None:
     print(rank[i-1],'위: ',title[i].text.replace('\n',''))
     continue
    print(rank[i],'위: ',title[i].text.replace('\n',''))

  • 벅스 음원 순위 출력하기
import requests
from bs4 import BeautifulSoup

url ='https://music.bugs.co.kr/chart'
r = requests.get(url)
html = r.text

soup = BeautifulSoup(html,'html.parser')
titletag = soup.find_all('p',class_='title')

#리스트 컴프리헨션 
li = [line.text.replace('\n','') for line in titletag]
#for i in titletag:
#   li.append(i.text.replace('\n',''))

for i in range(len(li)):
  print(i+1,'위: ',li[i])

 

  • 멜론 음원 순위 출력하기

http://www.useragentstring.com/  

크롤링을 막는 사이트가 존재한다. 직접 사용자 정보를 넘겨줘 본인이 로봇이 아닌 사용자임을 확인시켜줘야 접근가능하다.  위 사이트를 통해 본인 정보를 확인하고 복사하여 딕셔너리를 넘겨줘 해결하자.

import requests
from bs4 import BeautifulSoup 

url = 'https://www.melon.com/chart/index.htm?dayTime=2021092320'
r = requests.get(url.headers = header)
header = {'uesr':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52'}

html=r.text
soup = BeautifulSoup(html,'html.parser')
titletag=soup.find_all('div',class_='ellipsis rank01'

#보기 좋게 리스트에 담기
li=[]
for tag in titletag:
 li.appned(tag.text.replace('\n',''))
 
for i in range(len(li)):
 print('%3d위: ',%(i+1),li[i])
오류코드 내용과 의미(404오류,200)
1__ :현재 작업중
2__ :요청이 성공적
3__ :요청이 완료 되었으나 리다이렉션 필요(만료)
4__ :요청 잘못되었다
5__ :서버의 오류문제(사용자 잘못이 아님)
  • 지니뮤직 음원 순위 출력하기

지니뮤직 사이트는 1~50위가 1페이지 51~100위가 2페이지로 구성되어 있어 아래와 같이 반복문을 돌려 100위까지 연달아 출력되게 하였다.

import reuqests
from bs4 import BeautifulSoup

rank=0
for i in range(2):
	url='https://www.genie.co.kr/chart/top200?ditc=D&ymd=20210923&hh=20&rtm=Y&pg=%d'%(i+1) #1~50 두번 출력
    header1={'user':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 Edg/93.0.961.52'}
    
    res = requests.get(url,headers = header1)
    html = res.text
    soup = BeautifulSoup(html,'html.parser')
    
    title = [line.text.strip() for line in soup.find_all('a',class_='title ellipsis')]
    for i1 in title:
      rank+=1
      print('%3d위: %s'%(rank,i1))

WordCloud 사용해보기
-여러가지 단어들 중에 한눈에 중요도를 파악할 수 있는 것이다. 신문이나 기사등에서 볼 수 있다.
-외부모듈인 wordcloud를 사용한다.
  1. 시각화 -데이터 타입에 알맞은 그래프를 선택한다.
  2. 크롤링 -내가 원하는 데이터만 뽑아오려면 어떤 태그를 가져와야하는지 잘 파악해야한다.
  3. 파일입출력 -내가 원하는 데이터가 어떤 방식으로 구분되어있는지 알아야한다.
import wordcloud
import matplotlib.pyplot as plt

word ={ 
    'Python' : 20,
    'Java' : 15,
    'web'  :10,
    'Ai' : 8,
    'DeepLearning' : 16,
    '딥러닝' :10
}

#객체생성 
#한글 폰트 설정: (fond_path매개변수에 글꼴 경로를 알려준다.)
#배경색변경: (background_color='색')

wc = wordcloud.WordCloud(font_path='/content/drive/MyDrive/1900_python2_jsh/NanumSquareRoundB.ttf',background_color='white')
#(딕셔너리)-->딕셔너리의value값을 빈도로 표현
cloud = wc.generate_from_frequencies(word)
plt.imshow(cloud)
#축제거
plt.axis('off')
plt.show()

import wordcloud 
import matplotlib.pyplot as plt

li =['일자리', '분열', '명예', '정신', '적', '원주민', '기회', '외침', '헌법', '분노', '전국', '이웃', '연합', '존엄', '공포', '악마', '증오', '나라', '자유', '차별', '경의', '가능성', '복구', '전사자', '인종', '적개심', '도전', '안보', '역사', '애국자', '지구', '목숨', '치유', '경청', '결의', '시기', '부활', '진실', '관용', '우리', '회복', '취임', '위험', '수호', '미국', '국민', '통합', '담보', '생존', '동맹', '희망', '바이러스', '헌신', '겨울', '민주주의', '대통령', '승리','사업체']

#아래의 해당 txt파일에서 위li리스트의 단어들이 몇번 등장하는지 count함
words={}
with open('/content/drive/MyDrive/1900_python2_jsh/america.txt','r') as f:
  msg = f.read()
for word in li:
  words[word] = msg.count(word)
#print(words)

#데이터 시각화부분
wc = wordcloud.WordCloud(font_path='/content/drive/MyDrive/1900_python2_jsh/NanumSquareRoundB.ttf',background_color='white')
cloud = wc.generate_from_frequencies(words)
plt.imshow(cloud)
plt.axis('off')
plt.show()