본문 바로가기

환경, 에너지

[EMS]BeautifulSoup, Selenium

1. 결측값 처리

2. BeautifulSoup

3. Selenium


결측값 처리

1. 결측값 조회

isnull() 결측값인 경우 True, 정상값은 False
notnull() 결측값인 경우 False
isnull().sum(axis=0) 컬럼별 결측값의 개수. 디폴트
isnull().sum(axis=1) 행별 결측값의 개수
df.notnull().sum() 컬럼별 결측값이 아닌 값의 수
notnull().sum(axis=1) 행별 결측값이 아닌 값의 수
value_counts(dropna=False) 결측값을 포함하여 값 별 수 

 

 

2. 결측값 제거 (컬럼, 행)

  • dropna( axis = 1, thresh=500)
  • dropna( axis = 0, subset = 'age', how = 'any') 
df.dropna(axis = 1,thresh=500)
# thresh=500 : 결측값의 개수가 500개 이상인 컬럼 제거

df.dropna(axis = 0, subset = 'age', how = 'any') 
# subset = 'age' : 기준 컬럼. 여러 컬럼 가능[col1, col2,...]
# how = 'any' / 'all' : 한 개만 결측값 / 모든값이 결측값

 

 

3. 결측값 치환

  • fillna() 
  • 이전/ 이후 행 값으로 치환 : method 옵션
df['embarked'].fillna(method = 'ffill', inplace=True)

# method = ffill 직전 행 값
# method = bfill 직후 행 값

 

 

4. 중복 데이터 처리

  • duplicated()
    • 중복데이터 True / False 리턴 (row 전체 기준)
    • 중복된 두번째 부터 True 리턴 (첫번째는 무조건 False)
  • drop_duplicates()
    • 중복되는 row 제거

 


 

BeautifulSoup

: html, xml 태그 분석 모듈

url = 'https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp'
res = req.urlopen(url)
soup = BeautifulSoup(res,'html.parser')
title = soup.find('title').string
wf = soup.find('wf').string
'''
CDATA Section : 순수 문자열 영역. xml로 파싱되지 않는 영역
<!C[DATA [ .... ]]>
'''

 

 

  • 인터넷에서 수신된 내용을 forecast.xml 파일로 저장하기
import os.path # 파일 접근을 위한 패쓰
# os.path.exists(파일명) : 파일이 존재하니?
if not os.path.exists('data/forecast.xml') : 
    # urlretrieve :인터넷을 통해 전달 받은 데이터를 파일로 저장
    req.urlretrieve(url,'data/forecast.xml')

 

 

  • forecast.xml 파일을 읽어서 BeauticulSoup 으로 조회하
fp = open('data/forecast.xml')
soup = BeautifulSoup(fp, 'html.parser')
# select_one (=find) :  태그 한개만 선택
# rss pubDate : rss 태그의 하위 태그 중 pubDate 태그 선택
pubdata = soup.select_one('rss pubDate').string
pubdata


# location 태그들의 하위 태그 중 한개의 city, wf 태그의 내용 출력
# select (=findall) :  태그들. 배열로 리턴
for location in soup.select('location') : # location 태그 전부 목록
    city = location.select_one('city').string # city태그 값 
    wf = location.select_one('wf').string
    tmn = location.select_one('tmn').string
    tmx = location.select_one('tmx').string
    print(city,wf,tmn,tmx)

 

 

 


selenium 

: 브라우저를 직접 제어, 데이터 수집

 

  • 네이버 로그인하기
driver = webdriver.Edge("C:/Users/haeoreum/Documents/edgedriver/msedgedriver.exe") 
driver.get('https://nid.naver.com')  #로그인화면
id = input("네이버 아이디를 입력하세요:") 
driver.execute_script("document.getElementsByName('id')[0].value='"+id+"'")
pw = input("네이버 비밀번호를 입력하세요 : ")
time.sleep(1)
driver.execute_script\
("document.getElementsByName('pw')[0].value='"+pw+"'")
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="log.login"]').click()

driver.close()

 

 

  • 이미지 검색 후 다운받아 저장하기
driver = webdriver.Edge("C:/Users/haeoreum/Documents/edgedriver/msedgedriver.exe")
driver.get('https://search.daum.net/search?nil_suggest=btn&w=img&DA=SBC&q=%EB%A6%AC%EC%8B%9C%EC%95%88%EC%85%94%EC%8A%A4')
time.sleep(3)
images = driver.find_elements('css selector','div.image_main img')
img_url= []
for image in images : 
    url = image.get_attribute('src') #img 태그의 src 속성의 값 가져외기
    # startswith('http') : url 문자열이 http문자로 시작해?
    if url.startswith('http') : # url : 이미지가 저장된 url데이터
        img_url.append(url)

driver.quit()


img_folder = './img'
if not os.path.isdir(img_folder) :  # os.path.isdir(파일) : 파일이 폴더니?
    os.mkdir(img_folder) # 폴더 생성

# enumerate(img_url) : 요소의 순번, img_url 요소   
for index,link in enumerate(img_url) :
    # index : 요소의 번호, 위치값
    # link : 이미지가 저장된 url데이터
    req.urlretrieve(link, f'./img/{index}.jpg') # 다운로드

 

 

'환경, 에너지' 카테고리의 다른 글

[EMS] 에너지 빅데이터 분석  (0) 2024.07.15
[EMS] 데이터 전처리 및 시각화 실습  (0) 2024.07.11
[EMS] folium, numpy  (0) 2024.07.09
[EMS] matplotlib, folium  (0) 2024.07.08
[EMS] Pandas 기본  (0) 2024.07.03