๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Projects/COVID-19 analysis

xml ๋ฐ์ดํ„ฐ๋ฅผ csv ํŒŒ์ผ๋กœ ์ˆ˜์ง‘ - ๊ณต๊ณต์žฌ๋‚œ๋ฌธ์ž๋ฐ์ดํ„ฐ

1. ๋ฐ์ดํ„ฐ ์‚ดํŽด๋ณด๊ธฐ

๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์š”์ฆ˜ ์ฝ”๋กœ๋‚˜๋กœ ์ธํ•ด ์žฌ๋‚œ๋ฌธ์ž๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š”๋ฐ,, ํ•œ ๋ฒˆ ์ง์ ‘ ์ˆ˜์ง‘ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

-๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ

https://www.data.go.kr/dataset/3058822/openapi.do

๋ฐ์ดํ„ฐ๋Š” ๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ์—์„œ ํ™œ์šฉ์‹ ์ฒญ์„ ํ•˜๋ฉด ์ธ์ฆํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆํ‚ค๋ฅผ ๋ฐ›์œผ์‹œ๋ฉด, ์ถ”๊ฐ€ํ•˜์…”์„œ ์•„๋ž˜๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

http://apis.data.go.kr/1741000/DisasterMsg2/getDisasterMsgList?ServiceKey=์ธ์ฆํ‚ค&type=xml&pageNo=1&numOfRows=50&flag=Y

 

-pageNo : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ

-numOfRows: ๋ช‡๊ฐœ์˜ row ๋ฌถ์Œ์„ ๊ฐ€์ ธ์˜ฌ ๊ฑด์ง€

 

์ €๋Š” ํ•œ๋ฒˆ์— 50๊ฐœ ์ •๋„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด, numOfRows ๋ฅผ 50์œผ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ ํ•„์š”์— ๋”ฐ๋ผ ์กฐ์ •ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”.

 

๋จผ์ €, ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋ฅผ ๋ณด์‹œ๋ฉด, xml๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์ œ๊ฐ€ ํ•„์š”ํ•œ ์ •๋ณด๋Š” 

<row> </row> ์•ˆ์— ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ˆ˜์ง‘ํ•˜๊ธฐ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์งœ๋ด…์‹œ๋‹ค.

 

 

 

2. ์†Œ์Šค์ฝ”๋“œ

import os
from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
from time import sleep


pageNO = [x for x in range(1,88)] 
df = pd.DataFrame(columns=['create_date', 'location_name', 'msg'])
k = 0
for i in range(len(pageNO)):
    URL = 'http://apis.data.go.kr/1741000/DisasterMsg2/getDisasterMsgList?ServiceKey=์ธ์ฆํ‚ค&type=xml&pageNo='+str(pageNO[i])+'&numOfRows=50&flag=Y'
    if i!=0:
        sleep(200) 
    data = urlopen(URL).read()
    soup = BeautifulSoup(data, "html.parser")
        
    for item in soup.findAll("row"):
        df.loc[k] = [item.create_date.text, item.location_name.text, item.msg.text]
        k=k+1
df.to_csv('./SOSmsg.csv',encoding='utf-8-sig')

 

 

3. ์†Œ์Šค์ฝ”๋“œ ์„ค๋ช…

df = pd.DataFrame(columns=['create_date', 'location_name', 'msg'])

๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ columns์˜ ๋ผ๋ฒจ์„ ์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

pageNO = [x for x in range(1,88)]

1ํŽ˜์ด์ง€์—๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” 12์›” ๋ง ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ˆ˜์ง‘ํ•ด์•ผํ•จ์œผ๋กœ, pageNO = [x for x in range(1,88)]  ๋กœ ํ•˜์—ฌ, 1๋ถ€ํ„ฐ 87ํŽ˜์ด์ง€๊นŒ์ง€ ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 sleep(200) 

 

ํ•œ ๋ฒˆ ์ ‘์†ํ•˜๊ณ , 3๋ถ„์ด์ƒ ๋Œ€๊ธฐํ•œ ํ›„ ์ ‘์†ํ•ด์•ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋„‰๋„‰ํžˆ 200์ดˆ๋กœ ๋Œ€๊ธฐ์‹œ๊ฐ„์„ ์žก์•˜์Šต๋‹ˆ๋‹ค.

 

for item in soup.findAll("row"):

df.loc[k] = [item.create_date.text, item.location_name.text, item.msg.text]

row๋ถ€๋ถ„์„ findAll ํ•œ ๋’ค, ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. create_date.text ๋Š” <create_date/></create_date>์‚ฌ์ด์˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

 

df.to_csv('./SOSmsg.csv',encoding='utf-8-sig')

 

ํ•œ๊ธ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด 'utf-8-sig'๋กœ ์ธ์ฝ”๋”ฉํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  csvํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

 

 

3. ํ™•์ธ

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ๋‚˜์„œ, ์ž˜ ์ˆ˜์ง‘์ด ๋˜์—ˆ๋Š”์ง€ csv ํŒŒ์ผ์„ ํ™•์ธํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

์ž˜ ์ˆ˜์ง‘์ด ๋˜์—ˆ๋„ค์š”!

msg ๋ถ€๋ถ„์— [๋™๋Œ€๋ฌธ๊ตฌ์ฒญ] ์–ด๋””์„œ ๋ณด๋‚ธ ์žฌ๋‚œ ๋ฌธ์ž์ธ์ง€ ๋ฐ์ดํ„ฐ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ์—ด๋กœ ๋‚˜๋ˆ„๊ณ  ์‹ถ์€๋ฐ,, ๊ทธ ์ž‘์—…์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์˜ฌ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.