ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 크롤링 - BeautifulSoup+Pandas를 이용한 데이터 분석 3
    빅데이터/BeautifulSoup 2021. 12. 13. 12:47

    인프런 '코딩교양스쿨' 강의 참조

     

     

    • 판다스를 이용하여 앞서 얻은 자료들로 데이터 분석을 해보자
    • 판다스 - 데이터 조작 및 분석을 위해 파이썬 프로그래밍 언어로 작성된 라이브러리

     

    01 Pandas DataFrame 만드는 방법 2 가지

    df1 = pd.DataFrame(
        {"이름:":['Son', 'Messi', 'Ronaldo'],
        "나이:":[28, 33, 35],
        "소속:":['Tottenham', 'Barcelona', 'Juventus']}
    )
    
    -> DF의 기본 형태. 인덱스를 따로 지정하고 싶으면 인덱스 지정 가능
    
    df1 = pd.DataFrame(
        {"이름:":['Son', 'Messi', 'Ronaldo'],
        "나이:":[28, 33, 35],
        "소속:":['Tottenham', 'Barcelona', 'Juventus']},
        index=[1,2,3]
    )

    player_list = [['Son', 28, 'Tottenham'],
                  ['Messi', 33, 'Barcelona'],
                  ['Ronaldo', 35, 'Juventus']]
    df2 = pd.DataFrame(player_list, columns=['Name', 'Age', 'Club'], index=[1,2,3])
    
    df2

     

     

     

    02 크롤링 결과 DF으로 저장 해보기

    1) 리스트 안에 리스트 형식으로 결과 저장

    import requests
    from bs4 import BeautifulSoup as bs
    import pandas as pd
    import time
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'}
    
    player_list = []
    
    for i in range(1, 3):
        
        url = f"https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop/plus/ajax/yw1/0//page/{i}"
    
        r = requests.get(url, headers=headers)
        r.status_code
    
        soup = bs(r.content, 'html.parser')
        
        player_info = soup.find_all('tr', class_=['odd', 'even'])
        
        
        for info in player_info:
            player = info.find_all("td")
            
            number = player[0].get_text()
            name = player[3].get_text()
            position = player[4].get_text()
            age = player[5].get_text()
            nation = player[6].img['alt']
            team = player[7].a['title']
        #     value.append(player[8].b.get_text())
            value = player[8].text.strip()
            
            player_list.append([number, name, position, age, nation, team, value])
        
        time.sleep(1)

     

    2) csv파일로 저장

    df = pd.DataFrame(player_list, columns = ['Number', 'Name', 'Position', 'Age,', 'Nation', 'Team', 'Value'])
    
    df
    
    df.to_csv('pandas.csv', index=False)

    - 인코딩 해결 방법

    파일을 ANSI로 저장해서 열면 된다.

     

    - 엑셀로 변경하여 저장 해야 한다

     

     

     

    03 CSV 파일을 불러와 분석하기

    - 파일 불러오기

    pd.read_csv('pandas.csv')

    *인코딩이 맞지 않으면 판다스가 파일을 읽어 오지 못한다

    *웹 상의 파일도 읽어 올 수 있다. url 주소 + 경로를 정확히 넣으면 된다

     

     

    1) DF 뜯어 보기 

    - 행과 열 개수

    df.shape
    
    (50, 7)
    
    (rows, columns) = df.shape
    rows
    50
    columns
    7

     

    - df 정보

    df.info() - df 전체 정보 요약
    df.head() - df 정보 중 첫번째 5개
    df.tail() - df 정보 중 뒤에서 5개

     

    2) 인덱싱

    - 인덱싱 및 슬라이싱 (loc, iloc)

     

    • 열 번호로 인덱싱

     

    • 컬럼 이름 선택하기

     

    • loc/iloc

     

     

     

    04 정렬

    - 인덱스를 컬럼 명으로 바꾸기

    - 컬럼명 수정 후 저장 하기

     

     

    05 데이터 전처리

     

    1) 데이터 변경 

    #value의 문자 없애기
    df['Value'] = df['Value'].str.replace('€','')
    
    *타입 변경
    df['Value'] = df['Value'].str.replace('m','').astype('float')
    df
    df.head()
    
    df = df.astype({'Age':'int'})

     

    2) 컬럼 삭제 및 변경

     

    * 번외 - 수집시에 데이터 전처리 하기

    • 이 데이터의 인덱싱을 해보면 '€숫자m' 형태인데 01234 혹은 -5-4-3-2-1 형태로 나온다 
    • € = 0, m = -1 이므로 이것을 가지고 제거 하면 된다
    value = player[8].text.strip()
    value = value[1:-1]
    *즉 값을 1:-1 사이의 값만 들고 오라는 뜻

     

     

     

    06 판다스 간단 통계 분석 및 그룹화 분석

    - 간단 통계 함수

    df.describe()
    df['Age'].mean()
    df['Value'].sum()
    df['Nation'].mode() - 가장 많은 것
    df[df['Nation'] == 'Brazil']

    - 그룹화

    g.count()
    g.sum()
    g['Value'].sum()
    
    c = df.groupby('Team')
    c.sum()
    c['Value'].sum().sort_values(ascending=False)

     

Designed by Tistory.