본문 바로가기

study/인공지능

[데이콘 스터디] 6주차_함수 정리

대회 : https://dacon.io/competitions/official/229255/overview/

selenium - Colab에서 실행하기(chrome)

Selenium이란?

Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크다. webdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 된다. ‘눈에 보이는’ 컨텐츠라면 모두 가져올 수 있다.

참고 링크


전체 코드 : 1등_코드_날씨데이터_크롤링(colab_버전)

  • 패키지 설치 - selenium과 chromedriver

    !pip install selenium
    !apt-get update # apt install을 정확히 실행하기 위해 설치된 패키지 업데이트
    !apt install chromium-chromedriver #패키지 설치
    !cp /usr/lib/chromium-browser/chromedriver /usr/bin

    cp : 유닉스 셸에서 한 파일을 어떤 장소에서 다른 장소로 또는 다른 파일 시스템으로 옮길때 사용하는 명령어
    /usr/lib/chromium-browser/chromedriver 파일을 /usr/bin로 복사한다.

  • webdriver
    Chrome Headless
    : Chrome 브라우저를 GUI 없이 사용할 수 있는 모드
    리눅스 서버와 같이 GUI를 제공하지 않는 환경에서 '--no-sandbox' 옵션 추가
    disable-dev-shm-usage도 마찬가지로 GUI를 사용할 수 없어서 추가하는 것 같다.
    참고 링크

sys.path.insert : 다른 폴더(경로)에 있는 python 파일 import 가능하도록
경로를 환경변수로 지정 --> 경로를 환경변수로 설정하게 해주면 그 경로 안의 프로그램을 실행시킬 때 마다
경로를 매번 입력하지 않아도 된다.

import sys
sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')

from selenium import webdriver

#chrome의 option 설정
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') #chrome 창이 나오지 않게 해준다.
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

#1등 코드에서의 browser == driver
driver = webdriver.Chrome('chromedriver', chrome_options=chrome_options)
  • 날씨 데이터 크롤링
import pandas as pd
import time

weather\_data\_10 = pd.DataFrame(columns = \['현재일기\_10','현재기온\_10','체감온도\_10','일강수\_10'\])  
url = '[http://www.weather.go.kr/weather/observation/currentweather.jsp?auto\_man=m&type=t99&reg=184&tm=2019.10.25.16%3A00&x=19&y=7'](http://www.weather.go.kr/weather/observation/currentweather.jsp?auto_man=m&type=t99&reg=184&tm=2019.10.25.16%3A00&x=19&y=7')  
driver.get(url) #browser == driver

for i in range(0, 46):  
i+=1

#id를 찾고 그 공간을 비운 후 새로운 값을 넣어준다 (날짜값,10시)  
elem = driver.find\_element\_by\_id('observation\_text')  
elem.clear()  
elem.send\_keys("2019.9.{}.10:00".format(i))

btn = driver.find\_elements\_by\_class\_name('btn')  
btn\[2\].click()

time.sleep(1)  
weathers = driver.find\_elements\_by\_css\_selector('td')  
weather\_data\_10 = weather\_data\_10.append(pd.DataFrame(\[\[weathers\[40\].text,weathers\[44\].text, weathers\[46\].text, weathers\[47\].text\]\],columns=\['현재일기\_10','현재기온\_10','체감온도\_10','일강수\_10'\]))

print('success !')  
driver.close()

 


geopy


먼저 Geocoding이란 고유명칭(주소, 산, 호수 이름등)을 가지고 위도와 경도의 좌표값을 얻는 것을 말한다.
반대로 위도와 경도값으로부터 고유명칭을 얻는것은 리버스 지오코딩(reverse Geocoding)이된다.
geopy는 여러 유명한 Geocoding 웹 서비스를 위한 파이썬 client이다.
geopy를 사용하면 파이썬 개발자가 타사 지오코더 및 기타 데이터 소스를 사용하여 전 세계의 주소, 도시, 국가 및 랜드마크 좌표를 쉽게 찾을 수 있다.
import geopy.distance #거리 계산해주는 패키지 사용
classgeopy.distance.vincenty(*args, **kwargs)
: Thaddeus Vincenty가 고안한 공식을 사용하여 두 점 사이의 측지(위도경도 정확한 위치?) 거리를 계산한다.

coords_jejusi = (33.500770, 126.522761) #제주시의 위도 경도
data['dis_jejusi'] = [geopy.distance.vincenty((data['latitude'].iloc[i],data['longitude'].iloc[i]), coords_jejusi).km for i in range(len(data))]

data의 위도 경도와 제주시의 위도경도의 거리를 계산한다. 여기서 km은 kilometers

출처 : https://geopy.readthedocs.io/en/release-0.96.3/