Python pandas 웹 사이트 크롤링 예제

파이썬 판다스를 사용해 웹 페이지에 내용을 크롤링 하는 방법을 보겠습니다.

크롤링 취득한 데이터는 DataFrame에 저장해 가공을 하거나 csv 파일로 저장을 할 수 있습니다.

본론으로 들어가 크롤링은 read_html()을 사용해 취득하도록 하겠습니다.

크롤링 할 때 필요한 라이브러리도 미리 설치해두겠습니다.

lxml, html5lib, beautifulsoup4 라이브러리를 설치합니다.

$ pip install lxml html5lib beautifulsoup4

 

파이참을 사용하는 경우에는 파이참에서 설치해도 됩니다.

웹 크롤링 예제는 네이버 증권을 취득해 보도록 하겠습니다.

네이버 증권에서 국내증시 정보를 취득해 확인해보겠습니다.

import pandas as pd

url = 'https://finance.naver.com/sise/lastsearch2.nhn'
dfs = pd.read_html(url,encoding='euc-kr')

print(len(dfs))

결과

테이블을 2개 취득했습니다.

정보를 취득한 화면을 확인해보겠습니다.

화면에는 2개 테이블이 있습니다.

취득한 결과를 확인했을 때도 2개가 있었습니다.

제대로 취득이 된 거 같습니다.

크롤링 해 취득한 데이터를 담아둔 변수 dfs에는 ①테이블 정보와 ②테이블 정보가 들어있습니다.

 

변수 dfs에 들어 있는 ②테이블 정보를 출력해보겠습니다.

import pandas as pd

url = 'https://finance.naver.com/sise/lastsearch2.nhn'
dfs = pd.read_html(url,encoding='euc-kr')

print(dfs[1])

 

결과

주식 정보가 출력되었습니다.

출력된 항목 중에 표시하고 싶은 목록만 설정하고 싶은 경우가 있습니다.

 

순위종목명현재가 항목만 표시하도록 하겠습니다.

import pandas as pd

url = 'https://finance.naver.com/sise/lastsearch2.nhn'
dfs = pd.read_html(url,encoding='euc-kr')

print(dfs[1][['순위', '종목명','현재가']])

 

결과

 

순위, 종목명, 현재가 항목만 출력되었습니다.

출력한 결과 중에 NaN 값이 포함되 보기에 조금 안좋습니다.

NaN 부분을 제거해서 출력하는 방법을 보겠습니다.

import pandas as pd

url = 'https://finance.naver.com/sise/lastsearch2.nhn'
dfs = pd.read_html(url,encoding='euc-kr')

print(dfs[1][['순위', '종목명','현재가']].dropna(how="all"))

 

결과

 

dropna을 사용해 모든 행에 NaN값이 존재하는 행을 모두 삭제하고 출력했습니다.

크롤링 한 페이지에서 취득한 테이블이 1개나 2개 정도라면 원하는 부분을 쉽게 찾을 수 있습니다.

하지만 5개, 10개 등 많은 테이블이 존재하는 페이지를 크롤링 한 경우에는 찾는게 번거로워집니다.

 

이러한 경우에는 match를 사용 편리하게 취득할 수 있습니다.

import pandas as pd

url = 'https://finance.naver.com/sise/lastsearch2.nhn'
dfs = pd.read_html(url,match='순위',encoding='euc-kr')

print(len(dfs))

 

결과

 

match를 사용해 취득하고 싶은 항목을 지정합니다.

결과에는 지정한 문자열이 포함된 표만 취득하게 됩니다.

import pandas as pd

url = 'https://finance.naver.com/sise/lastsearch2.nhn'
dfs = pd.read_html(url,match='순위',encoding='euc-kr')

print(dfs[0][['순위', '종목명','현재가']].dropna(how="all"))

 

결과

 

match를 사용해 취득한 결과도 제대로 표시되고 있습니다.

크롤링 할 페이지에 표가 많은 경우에는 match를 사용해 간편하게 취득하는 것이 좋습니다.

댓글