배고픈 개발자 이야기

[2021/07/13] 파이썬 기초 (스크래핑, pyplot) 본문

인포섹 아카데미

[2021/07/13] 파이썬 기초 (스크래핑, pyplot)

이융희 2021. 7. 13. 16:50
728x90

- 네이버 영화 평점 수집

 

https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=cur&date=20210427

 

랭킹 : 네이버 영화

영화, 영화인, 예매, 박스오피스 랭킹 정보 제공

movie.naver.com

 

위 사이트는 네이버 영화 순위로 오늘날짜로 맞춰주면 그날 랭킹을 볼 수 있다.

 

아래와 같은 코드로 간단한 영화 랭킹을 긁어올 수 있다.

import urllib.request # http 요청용
from bs4 import BeautifulSoup # 스크래핑용

# 7월 12일 네이버 영화 랭킹 url 요청
response = urllib.request.urlopen("https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=cur&date=20210712")
soup = BeautifulSoup(response, "html.parser")  # parser 객체 생성
titleOfMovie = soup.findAll("div", {"class":"tit5"}) # class tit5 내용 불러오기 (제목)
pointOfMovie = soup.findAll("td", {"class":"point"}) # class point 내용 불러오기 (평점)

for title, point in zip(titleOfMovie, pointOfMovie): # 일괄처리를 위한 packing 
  print("=" * 100)
  print("title.text.strip() = ", title.text.strip())
  print("title.find('a')['href] = ", title.find('a').attrs['href'])
  print("point.text = ", point.text)
  print("=" * 100)

아래와 같은 결과로 긁어와 진다.

 

 

- 기상청 날씨 수집

 

아래와 같이 기상청에서 날씨 데이터를 긁어오고 데이터 처리 / 저장 / 불러오기를 할 수 있다.

import requests
import pandas as pd# 데이터 처리를 위한 모듈
from bs4 import BeautifulSoup

response = requests.get("https://www.weather.go.kr/weather/observation/currentweather.jsp")
soup = BeautifulSoup(response.content, "html.parser")
table = soup.find("table", {"class":"table_develop3"}) # 긁어오는 태그의 상위 태그 테이블 정보

data = []
for tr in table.findAll("tr"): # 하위 태그를 리스트로 받아와 원하는 정보만 저장
  if tr.find('a'):
    data.append([tr.find("a").text, tr.findAll("td")[5].text, tr.findAll("td")[9].text])

with open("weather.csv", "w") as file: # csv 파일생성
  file.write("point,temperature,humidity")  # coloum 이름 생성
  for point, temp, humi in data: # 저장한 하위 태그 내용 추가
    file.write("\n{},{},{}".format(point, temp, humi))

df = pd.read_csv("weather.csv") # 저장한 파일 불러오기

df["point"] # point column 불러오기

df["point"] == "합천" # bool 표기 (참인 row만 true)

df[df["point"] == "합천"] # 합천인 row만 보기

df["point"].isin(["강릉", "흑산도", "합천"]) # 리스트에 해당하는 row만 true

df[df["point"].isin(["강릉","흑산도","합천"])] # 해당 row만 출력

df = df.set_index("point") # index column을 기본(정수)에서 point column으로 set

df.loc[["서울","수원","인천"]] # point 값과 loc함수로 검색 가능

df = pd.read_csv( # index_col 지정하면서 생성가능
    "weather.csv",
    index_col = "point"
)

df.reset_index() # index column 초기화

 

 

- 날씨 데이터 pyplot으로 그리기

 

#그래프의 전체적인 설정을 하는 객체
import matplotlib as mpl
#그래프를 그리는 객체
import matplotlib.pyplot as plt

#그래프의 글자를 선명하게 출력하도록 설정
%config InlineBackend.figure_format = 'retina'
#나눔 글자체 설치 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm
#나눔고딕 글자체의 전체 경로 설정
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
#글자체의 경로와 글자 크기 설정
font = fm.FontProperties(fname=fontpath, size=9)

#폰트 이름 설정
plt.rc('font', family='NanumBarunGothic') 
#폰트 업데이트
mpl.font_manager._rebuild()

#그래프 그림 (가로 5 세로5)
plt.figure(figsize=(5,5))
#X ,Y 좌표 설정
plt.plot([0,1], [0,1], label='한글테스트용')
#범례 표시
plt.legend()
#그래프 그림
plt.show()
#그래프 스타일 목록
plt.style.available
#사용할 style 선택
plt.style.use("ggplot")

# kind:막대그래프, legend:범례
ax = df.plot(kind='bar', title='날씨', figsize=(12, 4), legend=True, fontsize=12)
ax.set_xlabel('도시', fontsize=12)
ax.set_ylabel('기온/습도', fontsize=12)
ax.legend(['기온', '습도'], fontsize=12)

 

- anaconda 환경설정

# Windows 한글 폰트 설정
font_name = mpl.font_manager.FontProperties(fname='C:/Windows/Fonts/malgum.ttf').get_name()
mpl.rc('font', family=font_name)
Comments