이번 포스팅에서는 파이썬 크롤링을 정리해본다.

 

이 내용은 파이썬 코딩도장의 책 내용을 따라 실행하면서 겪은 과정에 대한 설명이다.

 

파이썬 코딩 도장은 초판이 발행된지는 몇년되었지만 코딩테스트가 가능한 웹사이트도 저자가 직접 운영하고 있다

 

여러모로 초보자가 읽기에도 좋아서 추천하는 책이다.

 

 

강좌: 파이썬 코딩 도장

모두 펼치기모두 접기

dojang.io

 

 

파이썬 코딩 도장

외우기만 해서는 파이썬도 어렵다!프로그래밍은 연습으로 배우는 것!문법을 외우기만 해서는 파이썬도 배우기 어렵다. 프로그래밍은 개념을 습득하고, 개념을 이해한 다음에 자신만의 프로그��

book.naver.com

*참고로 웹크롤링을 학습 용도로 만드는 것은 어느 정도는 허용이 될 수 있다. 그런데 사업적 용도로 웹이나 앱을 개발해 크롤링 사용하는 것은 반드시 해당 기관에 허가를 받아야 한다.

(당연히 허가를 안해주는 경우도 있다)

 

개인이나 회사가 크롤링 등으로 타인의 서버에 트랙픽을 유발하여 피해가 입증되면 향후 법적인 책임이 중할 수 있으니 각자 주의해야 한다.

 

이 포스팅의 목적은 크롤링의 과정을 공유하고 추가적으로 연구하기 위함이다.

그리고 까먹지 않고 ;;

 

크롤링 시작하기

 

크롤링이란?

 

크롤링은 인터넷을 돌아다니며 웹사이트 등의 공개된 서버에서 자료를 긁어 모으는 것을 의미한다. 구글 같은 검색엔진이 하는 일이 크롤링이다. 예를 들어 누가 웹사이트를 개설하고 업데이트를 해도 아직 나밖에 모른다. 검색로봇이 다녀가기 전까진 모른다.

 

반면 웹사이트에서 업데이트 내용을 검색엔진에게 직접 볼낼 수도 있다. 그런데 자기 웹사이트의 검색 순위를 높이기 위해 검색엔진에게 하루종일 메시지를 보낸다면 그것도 정상이 아닐 것이다. 결국 검색시장을 좌우하는 최종적 갑인 구글이 검색어 순위를 자체 알고리즘에 의해 결정한다고 보면 이해하기 쉽다.

 

검색엔진이 아닌 누군가 크롤링을 한다면 의미있는 정보를 수집하고 가공하고 싶어서 일 것이다.

 

파이썬예제를 통해서 실습해 볼 것이다. 하나의 실습이지만 원리를 이해하면 다른 웹사이트에도 쉽게 적용할 수 있다는 점이 장점이다. 그러니까 조금 길어도 과정 하나하나가 중요하다.

 

우선 전체 소스코드를 한번 슥 보고 지나간다. 하나하나 추후 설명할 것이다.

import requests
from bs4 import BeautifulSoup
import pandas
import matplotlib as mpl
import matplotlib.pyplot as plt


source = requests.get('https://www.weather.go.kr/weather/observation/currentweather.jsp')
soup = BeautifulSoup(source.content,"html.parser")

table = soup.find('table',{'class':'table_develop3'})
data = []

print("#"*30)
print("\nHello! Here's today's weather!\n")
print("#"*30)

for tr in table.find_all('tr'):
    tds = list(tr.find_all('td'))
    for td in tds:
        if td.find('a'):
            point = td.find('a').text
            temp = tds[5].text
            humidity = tds[9].text
            print("{0:<7} {1:<7} {2:<7}".format(point,temp,humidity))
            data.append([point,temp,humidity])

print("#"*30)
print("\nIt ends here. thanks!\n")
print("#"*30)

print(data)

with open('weather.csv','w') as f:
    f.write('지역, 온도, 습도\n')
    for i in data:
        f.write('{0},{1},{2}\n'.format(i[0],i[1],i[2]))

df = pandas.read_csv('weather.csv', index_col='지역' , encoding='euc-kr')

city_df = df.loc[['서울','인천','대전','대구','광주','부산','울산']]

font_name = mpl.font_manager.FontProperties(fname='C:\Windows\Fonts\malgun.ttf').get_name()
mpl.rc('font',family=font_name)

ax = city_df.plot(kind='bar',title='날씨',figsize=(12,4),legend=True,fontsize=15)
ax.set_xlabel('도시',fontsize=15)
ax.set_ylabel('기온/습도',fontsize=15)
ax.legend(['기온','습도'],fontsize=15)

plt.show()

 

*. 모듈 설치

import requests
from bs4 import BeautifulSoup
import pandas
import matplotlib as mpl
import matplotlib.pyplot as plt

크롤링을 하기 위한 모듈을 설치한다. 이것도 여러가지 방식이 있다. 셀레늄 방식도 있고 다양하다.

 

여기서는

 

1) requests 모듈로 웹사이트의 내용을 가져와서

2) bs4 로 html 로 파싱하여

3) pandas로 데이터를 구조화 시키고

4) matplotlib 으로 그래프를 출력할 것이다.

 

이게 코딩도장 책의 크롤링 챕터인데 초보자가 하기에는 생각보다 과정이 복잡했다.

 

물론 책에는 잘 설명이 되있어서 실행은 잘 되었다. 책에는 주피터 노트북으로 하는 과정을 보여주는데 IDE로 하건 파이참으로 하건 상관없다.

 

여기서는 파이참을 사용해서 실행한다.

 

import 문에 있는 모듈은 전부 다운로드 받아야 한다. 파이썬이 설치되있다면 pip 명령어로 다운 받을 수 있다.

 

윈도우 쪽이 설치가 좀 더 어려운 편이라고 한다. 원래 오류가 잘 나니까..

 

cmd 에 들어가서 설치한다. 환경변수 설정이 되있어야 한다.

> pip install requests
> pip install bs4
> pip install pandas
> pip install matplotlib

python module 설치
python module 설치

 

설치가 다 되었으면 import 문을 걸고 시작한다. 기상청 웹사이트를 방문한다. 도시별 현재날씨 > 지상관측자료 > 관측자료 > 날씨 > 기상청 이다.

여기에 requests를 보내서 웹페이지를 가져온다. BeautifulSoup 는 가져온 웹에서 html을 분리하여 soup 변수에 저장시킨다. 여기에는 html 소스코드와 관련 정보가 저장되어 있다. 여기서 날씨 정보를 찾는 것이다. 날씨 정보를 찾는 것은...

source = requests.get('https://www.weather.go.kr/weather/observation/currentweather.jsp')
soup = BeautifulSoup(source.content,"html.parser")

 

기상청 웹사이트에서 찾는다. 마우스 우클릭 검사를 누른다.

 

요소 검사를 해보면 지점을 담고 있는 테이블의 클래스가 table_develop3 인 것을 알 수 있다.

 

table = soup.find('table',{'class':'table_develop3'})
data = []

파싱한 html 에서 tabledmf 찾고, 테이블 중에 class 가 table_develop3인 것을 찾는다. date는 조금 있다가 사용할 리스트를 선언한 것이다.

 

흐름이 중요하니까 소스코드를 같이 보면서 진행해야 한다.

 

print("#"*30)
print("\nHello! Here's today's weather!\n")
print("#"*30)

이것은 콘솔의 도입부다. html 을 파싱한 자료가 길어져서 뒤지다 보면 소스코드의 진행을 알 수가 없다. 표식으로 넣어두면 찾기가 쉽다.

 

for tr in table.find_all('tr'):
    tds = list(tr.find_all('td'))
    for td in tds:
        if td.find('a'):
            point = td.find('a').text
            temp = tds[5].text
            humidity = tds[9].text
            print("{0:<7} {1:<7} {2:<7}".format(point,temp,humidity))
            data.append([point,temp,humidity])

여기는 가져온 html을 다듬는 중요한 부분이다. 처음 for문 다음에 tr을 print 출력하면

 

이렇게 <tr> 태그들부터 시작된다. 아까 선택한 테이블 안에있는 tr태그들을 모두 가져온 것이다. 이걸 사용하려면 html 구조를 조금 알아야 된다. 테이블의 구조는 아래와 같다.

 

<table>

<tbody>

<tr>

<th>

</th>

</tr>

<tr>

<td>

</td>

</tr>

</tbody>

</table>

 

tr 아래에 th와 td 가 있다. tr은 테이블 로우 (행) th는 테이블 헤드 td 는 테이블 데이타이다.

 

여기서는 th 는 안가져오고 td 데이터만 가져올 것이다. td 중의 a요소의 텍스트는 지점의 이름이다. a는 링크가 걸려있다. 지점명으로 들어가면 시간에 따른 상세한 날씨 기록이 들어있다. a요소가 있는 줄이 기준이 되므로 조건식으로 검사하여 행을 선택한다.

 

a요소도 td의 안에 들어있다. 다음의 td 요소는 5와 9인데 td[인덱스].text 방식으로 값을 가져온다. 

인덱스로 따지면 a요소는 tds[0] 이다. 현재 기온이 tds[5] 습도가 tds[9] 사이의 간격을 세어보면 동일하다.

 

나머지는 크롤링이 성공한 것인지 확인하기 위해 콘솔에 출력하기 위한 코드이다.

 

중간에 한 단계씩 콘솔에 찍어보며 진행하는 것이 좋다. 한단계 씩 오류를 찾을 수 있으면 어렵지 않다.

 

 

*. 다음은 가져온 데이터를 파일에 csv 형식으로 저장한다. 첫줄을 지역 온도 습도로 이름짓고 나머지는 포맷지시자로 파일에 쓴다.

with open('weather.csv','w') as f:
    f.write('지역, 온도, 습도\n')
    for i in data:
        f.write('{0},{1},{2}\n'.format(i[0],i[1],i[2]))

df = pandas.read_csv('weather.csv', index_col='지역' , encoding='euc-kr')

city_df = df.loc[['서울','인천','대전','대구','광주','부산','울산']]

결과가 100개 정도 지역의 자료가 저장되었다.

 

100개를 그래프로 출력하는 것은 무리니까 대도시를 중심으로 선택한다. 지금은 판다스의 메소드를 사용하고 있는 것이다.

 

판다스 또한 수치 처리등 전문가들이 사용하는 파이썬 모듈인데 지금은 예제니까 한번 따라서 해본다. 별도로 배워야 알 수 있는 모듈이다.  그 아래쪽 코드는 matplotlib 조작 코드이다. 이 모듈도 별도로 배워야 사용할 수 있지만 여기서는 이런게 있다는 것만 알면 충분하다. 중요한 것은 데이터를 실시간으로 크롤링했다는 것이고. 가져온 데이터를 어떻게 사용할 것인가는 별도의 문제다.

 

matplotlib 그래프 기능. 주피터 노트북 사용자들은 웹브라우저에서 바로 사용가능하다.

 

사용법을 한번 숙지하면 다양한 시도를 해볼 수 있다.

 

 

무분별한 크롤링은 타인의 웹사이트에 피해를 줄 수 있으니 허용된 범위내에서만 사용한다.

공유하기

facebook twitter kakaoTalk kakaostory naver band