-
Golang: soup를 이용한 네이버 날씨 정보 가져오기컴퓨터/Go language 2021. 2. 14. 17:49728x90반응형
Go
1. 크롤링
우선 데이터를 가져올 사이트는 다음과 같다. ?cpName=ACCUWEATHER을 넘겨서 아큐웨더 제공자 사용함
(아주대 지역 날씨)
Go언어에서 Python의 beautifulsoup4처럼 html 요소를 쉽게 선택할 수 있는 라이브러리는
anaskhan96분의 soup가 제일 괜찮은 것 같다.
설치하기
go get -u github.com/anaskhan96/soup
2. Go언어 소스
맨 위에 보이는 현재 온도 = <div class="temperature_text"><strong>"12"</strong></div>
현재 날씨 = <span class="weather">흐림</span>
기타 정보 = <li class="item_today"></li> 4개가 있으므로 FindAll (select)
([미세먼지, 초미세먼지, 자외선, 일몰 시간])
(기상청은 자정에서 정오 전이 오전, 정오에서 자정 전이 오후이고,
해외 제공사는 일출부터 일몰 전이 낮, 일몰부터 일출 전이 밤입니다.)
주간예보에 있는 오늘 낮, 오늘 밤 부분에 강수 확률과 최고/최저 온도가 있다.
최고, 최저 온도 = <span class="data"></span> 2개가 있으므로 FindAll (select)
강수 확률 = <span class="rainfall"></strong> 2개가 있으므로 FindAll (select)
언제 변할 줄 모름 (2022-06-24 업데이트)
크롤링
Weather란 struct에 정보를 다 string으로 저장할 것이다.
import ( "fmt" "strings" "github.com/anaskhan96/soup" ) // NaverWeather ... const NaverWeather = "https://m.search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%82%A0%EC%94%A8+%EB%A7%A4%ED%83%843%EB%8F%99&oquery=%EB%82%A0%EC%94%A8" // Weather 해외 기상은 일출부터 일몰 전이 낮, 일몰부터 일출 전이 밤 type Weather struct { MaxTemp string `json:"max_temp"` // 최고 온도 MinTemp string `json:"min_temp"` // 최저 온도 CurrentTemp string `json:"current_temp"` // 현재 온도 CurrentStatus string `json:"current_stat"` // 흐림, 맑음 ... RainDay string `json:"rain_day"` // 강수 확률 낮 RainNight string `json:"rain_night"` // 강수 확률 밤 FineDust string `json:"fine_dust"` // 미세먼지 UltraDust string `json:"ultra_dust"` // 초미세먼지 UV string `json:"uv"` // 자외선 지수 Sunset string `json:"sunset"` // 일몰 // Icon string `json:"icon"` // 날씨 아이콘 (ico_animation_wt?) } // GetWeather is a function that parses suwon's weather today func GetWeather() (Weather, error) { var weather Weather resp, err := soup.Get(NaverWeather) if err != nil { fmt.Println("Check your HTML connection.") return weather, err } doc := soup.HTMLParse(resp) currentTemp := doc.Find("div", "class", "temperature_text").Find("strong").Text() + "도" // ! 해외 기상은 일출부터 일몰 전이 낮, 일몰부터 일출 전이 밤 maxTemp := doc.Find("span", "class", "highest") dayTemp := maxTemp.Text() + "도" dayTemp = strings.Replace(dayTemp, "°", "", 1) minTemp := doc.Find("span", "class", "lowest") nightTemp := minTemp.Text() + "도" nightTemp = strings.Replace(nightTemp, "°", "", 1) currentStatElem := doc.Find("span", "class", "weather") currentStat := currentStatElem.Text() // [미세먼지, 초미세먼지, 자외선, 일몰 시간] statuses := doc.FindAll("li", "class", "item_today") fineDust := statuses[0].Find("a").Find("span").Text() ultraDust := statuses[1].Find("a").Find("span").Text() UV := statuses[2].Find("a").Find("span").Text() sunset := statuses[3].Find("a").Find("span").Text() // 강우량 rainElems := doc.FindAll("span", "class", "rainfall") dayRain := rainElems[0].Text() nightRain := rainElems[1].Text() // struct 값 변경 weather.CurrentTemp = currentTemp weather.CurrentStatus = currentStat weather.MaxTemp = dayTemp // Assert that (day temp > night temp) in general weather.MinTemp = nightTemp weather.RainDay = dayRain weather.RainNight = nightRain weather.FineDust = fineDust weather.UltraDust = ultraDust weather.UV = UV weather.Sunset = sunset return weather, nil } func main() { var weather Weather weather = GetWeather() fmt.Println(weather.UV) }
카카오톡 챗봇 예제
// AskWeather :POST /weather func AskWeather(c *gin.Context) { // 수원 영통구 현재 날씨 불러오기 (weather.naver.com) weather, _ := models.GetWeather() simpleText := models.BuildSimpleText(fmt.Sprintf("현재 날씨는 %s, %s\n최저기온 %s, 최고기온은 %s\n낮, 밤 강수 확률 %s, %s\n미세먼지 %s, 초미세먼지 %s, 자외선 %s\n", weather.CurrentStatus, weather.CurrentTemp, weather.MinTemp, weather.MaxTemp, weather.RainDay, weather.RainNight, weather.FineDust, weather.UltraDust, weather.UV)) c.PureJSON(200, simpleText) }
참고
Go언어로 만든 카카오 챗봇
728x90'컴퓨터 > Go language' 카테고리의 다른 글
Golang: 카카오 챗봇 API 응답 JSON 빌더 헬퍼 모듈 (0) 2021.02.21 Golang: JSON <, >, & HTML 기호 escape 하기 (0) 2021.02.09 Golang: Nested structs to JSON (중첩 struct Json만들기) (0) 2021.01.03