#Day23 - 리퀘스트와 아름다운 수프를 이용한 사이트 스크랩 방법 1부

오늘은 파이썬을 이용한 웹스크래핑에 대해 알아보겠습니다. Beautiful Soup 및 Requests to scrapeWorldometer's Covid Tracker 라이브러리를 사용할 것입니다. 웹사이트 스크래핑을 시작하기 전에 필요한 패키지를 설치해 보겠습니다.

전제 조건



HTML 및 CSS 선택기에 대한 약간의 지식

패키지 설치




pip install beautifulsoup4, requests


뷰티풀수프 인스턴스 생성



Beautiful Soup은 HTML 파서입니다. 즉, 많은 HTML 코드가 포함된 문자열이 제공되면 예를 들어 필요한 특정 콘텐츠를 추출하는 데 도움이 될 수 있습니다.
  • 테이블
  • 목록
  • 링크
  • 특정 섹션 내의 텍스트

  • HTML 코드가 포함된 문자열을 어떻게 얻습니까? 요청 라이브러리를 사용합니다. 요청 라이브러리를 사용하여 웹페이지에 요청하면 웹페이지의 HTML 콘텐츠를 문자열로 반환합니다.

    import requests
    from bs4 import BeautifulSoup
    
    html = requests.get("https://www.worldometers.info/coronavirus/").text
    print(html)
    print(type(html))
    


    출력은 Worldometer 홈 페이지의 HTML이 됩니다. 변수 'html'의 유형은 str입니다.

    이제 BeautifulSoup의 인스턴스를 만들고 HTML 문자열을 인수로 전달합니다.

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


    몇 가지 유용한 기능



    예쁘다




    print(soup.prettify())
    


    이렇게 하면 들여쓰기가 있는 예쁜 형식으로 HTML 문자열이 인쇄됩니다.

    태그의 첫 번째 인스턴스



    찾기 기능을 사용하겠습니다. worldometer 페이지에서 'div' 태그의 첫 번째 인스턴스를 찾아봅시다.

    print(soup.find("div"))
    print("-x-x-x-x-x-x-x-")
    print(soup.find("div").get_text())
    


    첫 번째 인쇄 문은 div 태그의 첫 번째 인스턴스와 그 안에 있는 다른 모든 HTML 요소를 인쇄합니다. div 블록 내부의 텍스트만 원하는 경우 get_text() 함수를 사용할 수 있습니다.

    태그의 모든 인스턴스 가져오기




    div_elements = soup.find_all("div")
    for element in div_elements:
      print(element)
      print("-x-x-x-x-x-x-x")
      print(element.get_text())
      break
    


    이것은 페이지의 모든 div 요소로 구성된 iterable을 반환합니다. iterable을 반복하고 get_text() 함수를 사용하여 각 div 내부의 텍스트 콘텐츠를 가져올 수 있습니다. 위 코드의 출력과 이전 섹션의 코드가 어떻게 동일한지 확인하십시오. 이는 iterable의 첫 번째 요소가 find()에 의해 반환된 것과 동일한 div 블록이기 때문입니다.

    CSS 클래스 및 ID 지정



    find() 및 find_all() 함수는 다음 인수를 사용할 수 있습니다.

  • class_ = 클래스 이름

  • id = 아이디의 이름

  • 코로나 바이러스 사례 수를 알아봅시다.



    보시다시피 숫자는 클래스 이름이 "maincounter-number"인 div 블록 안에 있습니다. 다음 코드는 숫자를 반환합니다.

    print( soup.find('div',class_='maincounter-number').get_text() )
    


    div를 찾고 있음을 지정하고 클래스 이름 "maincounter-number"를 인수로 전달합니다. 다시 말하지만 get_text() 메서드를 사용하여 텍스트 내용, 즉 숫자를 가져옵니다.

    이제 id를 사용하여 navbar 내부의 텍스트를 가져오도록 합시다.



    id = "navbar-main"입니다.

    print( soup.find('div',id = "navbar-main").get_text() )
    


    보시다시피 코로나 바이러스 사례 수를 파악하려고 할 때와 매우 유사합니다. 유일한 차이점은 class_ 대신 id 값을 설정하는 것입니다.

    CSS 선택기



    요소와 클래스 이름 또는 ID도 결합할 수 있습니다. select() 함수는 find_all() 함수와 유사합니다. 몇 가지 CSS 선택자를 살펴보겠습니다. 아래는 구문입니다.

    soup.find('css_selectors').get_text()
    


  • h1 - 모든 h1 태그를 찾습니다
  • .
  • div p - 내부에 a가 있는 모든 블록
  • div.maincounter-number - 클래스 이름이 "maincounter-number"인 모든 div 블록을 찾습니다
  • .
  • div#navbar-main - ID가 "navbar-main"인 div 블록을 찾습니다
  • .
  • body p a — body 태그 내부의 p 태그 내부에 있는 모든 태그를 찾습니다.

  • select() 함수를 사용하여 navbar 내부의 코로나 바이러스 사례 수와 텍스트를 가져오도록 합시다.

    print( soup.select('div.maincounter-number')[0].get_text())
    
    print( soup.select('div#navbar-main')[0].get_text())
    

    select() 함수는 이터러블을 반환하므로 이를 반복하거나 인덱스를 사용하여 요소 내부의 텍스트를 가져와야 합니다.

    다음 부분에서는 표를 긁어내고 Beautiful Soup을 사용하여 더 많은 사용 사례에 대해 논의할 것입니다.

    좋은 웹페이지 즐겨찾기