공부/판다스 데이터분석

[ Pandas ] 웹, API를 활용하여 데이터 수집하기

haena02 2023. 1. 28. 20:53
반응형

1. 웹을 활용해서 데이터 수집하기

 

1.1 HTML 웹 페이지에서 표 속성 가져오기

 

read_html() 함수는 HTML 웹 페이지에 있는 <table>태그의 데이터를 모두 찾아서 데이터 프레임으로 변환한다.

표 데이터들은 별도의 데이터 프레임으로 변환되기 때문에 여러개의 데이터 프레임을 원소로 갖는 리스트가 반환된다.

 

웹페이지의 정보를 parsing하기 위해서는 read_html() 함수 인자에 url이나 html파일을 넣어주면 된다. 

 

 

1.2 웹 스크래핑

 

BeautifulSoup 과 같은 웹 크롤링 도구로 수집한 데이터들을 데이터프레임으로 정리하는 방법을 알아보자.

먼저 스크래핑한 내용들을 파이썬 리스트, 딕셔너리 등으로 정리한 뒤,

DataFrame() 함수에 리스트나 딕셔너리 형태로 전달하여 데이터 프레임으로 변환한다. 

 

2. API 활용하여 데이터 수집하기

 

인터넷 서비스 업체에서 제공하는 API를 통해서 수집한 데이터를 자료구조로 변환해보자.

대부분의 API는 판다스에서 쉽게 읽어올 수 있는 파일형식 (csv, json, xml 등)이다.

따라서 API를 통해 가져온 정보들은 쉽게 데이터 프레임으로 변환할 수 있다. 

 

구글 지오코딩 API를 예로들어보자.

지오코딩이란 장소 이름이나 주소를 입력하면 위도와 경도 좌표를로 변환해주는 서비스이다!

이 서비스를 이용하려면 API키를 발급받아야한다. 

 

지오코딩같은 경우에는 라이브러리를 따로 설치해야한다.

지오코딩은 딕셔너리와 비슷한 형태를 띈다.

 

# -*- coding: utf-8 -*-

## google 지오코딩 API 통해 위도, 경도 데이터 가져오기 

# 라이브러리 가져오기
import googlemaps
import pandas as pd

# my_key = "----발급받은 API 키를 입력-----"

# 구글맵스 객체 생성하기
maps = googlemaps.Client(key=my_key)  # my key값 입력

lat = []  #위도
lng = []  #경도

# 장소(또는 주소) 리스트
places = ["서울시청", "국립국악원", "해운대해수욕장"]

i=0
for place in places:   
    i = i + 1
    try:
        print(i, place)
        # 지오코딩 API 결과값 호출하여 geo_location 변수에 저장
        geo_location = maps.geocode(place)[0].get('geometry')
        lat.append(geo_location['location']['lat'])
        lng.append(geo_location['location']['lng'])
        
    except:
        lat.append('')
        lng.append('')
        print(i)

# 데이터프레임으로 변환하기
df = pd.DataFrame({'위도':lat, '경도':lng}, index=places)
print('\n')
print(df)

 

 

 

3. 데이터 저장하기

 

3.1 하나의 데이터 저장하기

DataFrame객체.to_csv("파일이름(경로)")  #CSV 파일로 저장
DataFrame객체.to_json("파일이름(경로)")  #json 파일로 저장
DataFrame객체.to_excel("파일이름(경로)")  #excel 파일로 저장

 

3.2 여러개의 데이터프레임 하나의 엑셀 파일로 저장

 

여러개의 데이터프레임을 하나의 엑셀파일의 여러개의 시트로 저장할 수 있다.

먼저 ExcelWriter()함수를 이용해서 엑셀 파일의 워크북 객체를 만들고 거기에 하나씩 시트를 추가해주면된다.

writer = pandas.ExcelWriter(엑셀파일이름(경로))
df1.to_excel(writer, sheet_name="sheet1")  //df1를 sheet1라는 이름으로 저장
df2.to_excel(writer, sheet_name="sheet2")  //df2를 sheet2라는 이름으로 저장
writer.save()

 

반응형