Python과 BeautifulSoup을 사용한 웹 스크래핑 소개

웹 사이트를 방문하고 "이것은 좋은 데이터입니다. xx [관심 삽입]에 사용할 수 있습니다"라고 생각하는 경우가 많습니다. 이 번뜩이는 순간은 "전체 페이지를 복사하거나 다운로드하지 않고 어떻게 내가 관심 있는 데이터만 얻을 수 있을까?"

걱정할 필요 없습니다. BeautifulSoup이 바로 여기 있습니다. BeautifulSoup은 HTML을 스크랩하는 데 유용합니다. 온라인에서 분석할 데이터를 찾으면 BeautifulSoup을 사용하여 이해할 수 있는 구조로 변환할 수 있습니다. 에서 이름을 따온 이 Python 라이브러리를 사용하면 웹 사이트에서 쉽고 빠르게 정보를 가져와 DataFrame에 넣을 수 있습니다.

다운로드 옵션 없이 소스에서 데이터를 가져오는 간단한 예를 살펴보겠습니다. English Premier League table을 사용하여 20개 팀의 위치, 이름 및 포인트를 모두 가져옵니다.



전제 조건
  • 로컬 컴퓨터에 Python3이 설치됨
  • 코드를 작성하기 위한 IDE 또는 텍스트 편집기(이 데모에서는 Atom을 사용함)

  • 1. 뷰티풀수프 설치하기



    터미널을 열고 BeautifulSoup을 설치합니다.

    
    pip install beautifulsoup4
    
    


    2. 그런 다음 텍스트 편집기에서 가져오기:




    
    from bs4 import BeautifulSoup
    
    


    3. 웹사이트 데이터 가져오기 — 요청



    Python에는 콘텐츠를 정말 쉽게 가져올 수 있는 요청 라이브러리가 있습니다. 우리가 해야 할 일은 라이브러리를 가져온 다음 GET하려는 URL을 입력하는 것입니다.

    
    import requests
    
    webpage_request = requests.get(https://www.premierleague.com/tables')
    
    webpage = webpage_request.content
    
    


    결과는 웹 페이지 변수의 전체 HTML 출력입니다.

    b'<!DOCTYPE html>\n<html lang="en">\n<head>\n <meta name="twitter:title" content="Premier League Table, Form Guide & Season Archives"/>\n<meta name="keywords" content="Premier League, Football, Soccer, Official"/> .............
    


    출력을 더 읽기 쉬운 HTML 형식으로 구문 분석할 수 있습니다.

    
    soup = BeautifulSoup(webpage, 'html.parser')
    
    


    수프 분석 결과:

    <!DOCTYPE html>
    
    <html lang="en">
    <head>
    <meta content="Premier League Table, Form Guide &amp; Season Archives" name="twitter:title"/>
    <meta content="Premier League, Football, Soccer, Official" name="keywords"/>
    <meta content="website" property="og:type"/>
    
    


    원하는 데이터를 얻는 데 한 단계 더 가까워졌지만 여전히 필요하지 않은 많은 데이터가 있습니다.

    4. 페이지 속성을 찾습니다.



    이제 웹 페이지로 돌아가서 개발자 탭을 사용하여 위치, 팀 및 점수를 얻는 데 필요한 HTML 요소를 가져와야 합니다. 마우스 오른쪽 버튼을 클릭한 다음 검사로 이동을 선택하여 브라우저 개발자 탭을 열 수 있습니다.



    위치: HTML 클래스 'resultHighlight'에 있는 리그 위치를 먼저 찾고자 합니다.



    팀: 'long' 클래스에 위치



    Points: 클래스의 'points'에 위치
    요소.



    이제 요소/속성 위치, 팀 및 포인트가 무엇인지 알았으므로 BeautifulSoup의 .find_all() 메서드를 사용하여 찾고 있는 모든 데이터를 찾을 수 있습니다. find_all() 메서드는 HTML 요소/속성을 키로 사용하고 요소 이름을 값으로 사용하는 사전을 사용합니다.

    
    league_positions = soup.find_all(attrs={class: resultHighlight})
    
    league_teams = soup.find_all(attrs={class: long})
    
    league_points = soup.find_all(attrs={class: points})
    
    
    

    5. 데이터 정리



    엄청난! 필요한 요소를 얻었지만 여전히 HTML 형식입니다. 이 HTML 데이터를 목록으로 변환합니다(참고: 원하는 데이터 구조를 사용할 수 있음).

    위치는 다음과 같이 인쇄됩니다.

    
    [<span class="resultHighlight">
                                    1
                                </span>, <span class="resultHighlight">
                                    2
                                </span>, <span class="resultHighlight">
                                    4
                                </span>
    
    
    

    이것은 팀과 포인트에 대해서도 유사합니다. Alist comprehension가 이를 깔끔하게 정리합니다. 우리는 를 정렬하고 sorted() 및 set()을 사용하여 고유한 숫자만 가져온 다음 팀과 포인트를 1개의 목록으로 가져옵니다zip.

    # We remove duplicate with a set, then turn it back into a list
    
    position = sorted(
     set(list(
     [int(position.get_text().strip())
     for position in league_positions][:21])))
    
    
    teams = [team.get_text().strip() for team in league_teams][:21]
    
    
    points = [point.get_text().strip() for point in league_points][1:21]
    
    
    # Combine the teams with their points
    
    premier_league_table = list(zip(teams, points))
    
    
    

    6. DataFrame에 넣기



    이제 작업할 두 개의 목록이 있습니다. 리그 위치에 대한 정수 중 1개와 팀 및 포인트의 압축 목록인 1개입니다.

    참고: 위치에 대해 range()를 사용할 수 있었지만 BeautifulSoup으로 수행할 수 있는 방법을 보여주고 싶었습니다.

    # Data into a DataFrame
    
    import pandas as pd
    
    print(Final Premier League standing:, end=(\n))
    
    df = pd.DataFrame(
     premier_league_table,
     index=position,
     columns=[team, points])
    
    # Rename the index column to position
    
    df.index.rename(position, inplace=True)
    
    
    

    7. 데이터 내보내기



    마지막으로 아래 명령을 사용하여 DataFrame을 .csv 파일로 내보냅니다. 현재 작업 디렉토리에서 파일을 찾을 수 있습니다(.py 파일과 동일).

    # Export the data to csv
    df.to_csv(preimer_league_season_2021.csv)
    



    아래 코드를 실행하고 파일을 git repohere에 추가했습니다.



    4초도 걸리지 않았습니다!

    결론



    놀라운! 이제 BeautifulSoup을 사용하여 웹사이트를 데이터로 전환하는 방법의 기본 사항을 알게 되었습니다. 이제 웹에서 분석하고 싶은 몇 가지 흥미로운 데이터를 찾아 토끼굴이 얼마나 멀리 있는지 확인할 수 있습니다. 그러나 사이트 소유자를 존중해야 합니다.

    읽어 주셔서 감사합니다

    시야

    자세한 내용은 plainenglish.io에서 확인하세요.

    좋은 웹페이지 즐겨찾기