Python 3 사용 요청 및 Beauty Soup을 사용하여 웹 데이터 처리 방법

Python 3 사용 요청 및 Beauty Soup을 사용하여 웹 데이터 처리 방법

2022-05-31 last update

16 minutes reading Data Analysis Development Python Programming Project

소개


인터넷이 우리에게 제공하는 데이터는 우리 누구의 읽기와 이해 능력을 초과하기 때문에 우리는 항상 프로그래밍을 통해 이 정보를 처리하여 이 정보를 이해하기를 희망한다.때때로 이 데이터는 사이트 창설자가 .csv 또는 쉼표를 통해 값 파일을 구분하거나 API(응용 프로그램 프로그래밍 인터페이스)를 통해 우리에게 제공한다.다른 때, 우리는 스스로 인터넷에서 텍스트를 수집해야 한다.
이 강좌는 웹 페이지의 데이터를 이용하기 위해 RequestsBeautiful Soup Python 패키지를 어떻게 사용하는지 소개할 것입니다.Requests 모듈은 Python 프로그램과 웹 서비스를 통합할 수 있으며, Beautiful Soup 모듈은 화면 캡처를 신속하게 완성하기 위한 것입니다.Python 인터랙티브 컨트롤러와 이 두 라이브러리를 사용하면 웹 페이지를 수집하고 사용할 수 있는 텍스트 정보를 어떻게 사용하는지 알 수 있습니다.

선결 조건


이 강좌를 완성하려면 Python 3의 개발 환경이 필요합니다.운영 체제에 적용되는 How To Install and Set Up a Local Programming Environment for Python 3 또는 How To Install Python 3 and Set Up a Programming Environment on an Ubuntu 20.04 Server 시리즈의 지침에 따라 필요한 모든 것을 구성할 수 있습니다.
또한 다음을 숙지해야 합니다.
  • Python Interactive Console
  • Importing Modules in Python 3
  • HTML 구조 및 태그
  • 개발 환경을 설정하고 이러한 Python 프로그래밍 개념을 명심하면 요청과 Beautiful Soup을 처리하기 시작합니다.

    요청 설치 중


    우선 Python 3 프로그래밍 환경을 활성화합시다.환경이 있는 디렉토리에 있는지 확인하고 다음 명령을 실행합니다.
    1. . my_env/bin/activate
    웹 페이지를 처리하기 위해서 이 페이지를 요청해야 합니다.요청 라이브러리에서는 Python 프로그램에서 읽을 수 있는 방식으로 HTTP를 사용할 수 있습니다.
    프로그래밍 환경을 활성화하면 pip 설치 요청을 사용합니다.
    1. pip install requests
    요청 라이브러리를 설치하면 다음 출력을 받을 수 있습니다.
    Output
    Collecting requests Downloading requests-2.26.0-py2.py3-none-any.whl (88kB) 100% |████████████████████████████████| 92kB 3.1MB/s ... Installing collected packages: chardet, urllib3, certifi, idna, requests Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 requests-2.26.0 urllib3-1.21.1
    이전에 요청이 설치되어 있으면 터미널 창에서 다음과 같은 피드백을 받을 수 있습니다.
    Output
    Requirement already satisfied ...
    요청을 프로그래밍 환경에 설치한 후에 다음 모듈을 계속 설치할 수 있습니다.

    수프를 설치하다


    우리가 요청에 대해 한 바와 같이, 우리는 pip를 사용하여 예쁜 Soup을 설치할 것이다.다음 명령을 사용하여 현재 버전의 Beauty Soup 4를 설치할 수 있습니다.
    1. pip install beautifulsoup4
    이 명령을 실행하면 다음과 같은 출력이 표시됩니다.
    Output
    Collecting beautifulsoup4 Downloading beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) |████████████████████████████████| 97 kB 6.8 MB/s Collecting soupsieve>1.2 Downloading soupsieve-2.3.1-py3-none-any.whl (37 kB) Installing collected packages: soupsieve, beautifulsoup4 Successfully installed beautifulsoup4-4.10.0 soupsieve-2.3.1
    현재, Beautiful Soup과 Requests가 설치되어 있으며, 우리는 라이브러리 스크랩 사이트를 어떻게 사용하는지 계속 이해할 수 있습니다.

    요청이 포함된 웹 페이지 수집


    현재 우리가 사용할 두 개의 Python 라이브러리가 설치되어 있으며, 우리는 점차적으로 기본 웹 페이지를 조회하는 것을 익숙하게 할 수 있다.
    먼저 Python Interactive Console:
    1. python
    예제 웹 페이지를 수집하기 위해 Requests 모듈을 가져옵니다.
    1. import requests
    예제 웹 페이지 mockturtle.html의 URL(아래)을 variable url에 할당합니다.
    1. url = 'https://assets./articles/eng_python/beautiful-soup/mockturtle.html'
    다음은 page method을 사용하여 이 페이지의 요청 결과를 변수 request.get()에 분배할 수 있습니다.우리는 페이지의 URL(url 변수에 할당)을 이 방법에 전달합니다.
    1. page = requests.get(url)
    변수 page에 대한 응답 객체가 할당되었습니다.
    >>> page
    <Response [200]>
    >>> 
    
    위의 응답 대상은 방괄호 중의 status_code 속성을 알려 줍니다. (이 예에서 200)이 속성을 명시적으로 호출할 수 있습니다.
    >>> page.status_code
    200
    >>> 
    
    반환된 코드 200은 페이지 다운로드에 성공했음을 알려 줍니다.숫자 2으로 시작하는 코드는 일반적으로 성공을 표시하지만, 4 또는 5으로 시작하는 코드는 오류가 발생했음을 나타낸다.W3C’s Status Code Definitions에서 HTTP 상태 코드에 대한 자세한 내용을 확인할 수 있습니다.
    웹 데이터를 처리하기 위해서, 우리는 웹 파일에서 텍스트 기반의 내용을 방문해야 한다.우리는 page.text을 사용하여 서버 응답의 내용을 읽을 수 있습니다 (바이트 단위로 응답에 접근하려면 page.content).
    1. page.text
    ENTER을 누르면 다음과 같은 출력을 받을 수 있습니다.
    Output
    '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n<head>\n <meta http-equiv="content-type" content="text/html; charset=us-ascii" />\n\n <title>Turtle Soup</title>\n</head>\n\n<body>\n <h1>Turtle Soup</h1>\n\n <p class="verse" id="first">Beautiful Soup, so rich and green,<br />\n Waiting in a hot tureen!<br />\n Who for such dainties would not stoop?<br />\n Soup of the evening, beautiful Soup!<br />\n Soup of the evening, beautiful Soup!<br /></p>\n\n <p class="chorus" id="second">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n Beautiful, beautiful Soup!<br /></p>\n\n <p class="verse" id="third">Beautiful Soup! Who cares for fish,<br />\n Game or any other dish?<br />\n Who would not give all else for two<br />\n Pennyworth only of Beautiful Soup?<br />\n Pennyworth only of beautiful Soup?<br /></p>\n\n <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n Beautiful, beauti--FUL SOUP!<br /></p>\n</body>\n</html>\n' >>>
    여기에서 페이지의 전체 텍스트가 인쇄된 것을 보았습니다. 여기에는 모든 HTML 태그가 포함되어 있습니다.그러나 간격이 많지 않기 때문에 읽기가 어렵다.
    다음 절에서 우리는 Beauty Soup 모듈을 이용하여 이 텍스트 데이터를 더욱 인성화된 방식으로 처리할 수 있다.

    정교하고 아름다운 수프 한 페이지를 훑어보다


    Beautiful Soup 라이브러리는 비폐쇄 태그 또는 tag soup 및 기타 형식 오류가 있는 태그가 있는 HTML 및 XML 문서에서 확인 트리를 작성합니다.이 기능은 웹 페이지의 텍스트를 우리가 본 요청 모듈에서 온 텍스트보다 더욱 읽을 수 있게 할 것이다.
    우선, 우리는 아름다운 수프를 Python 컨트롤러로 가져옵니다.
    1. from bs4 import BeautifulSoup
    다음은 모듈을 통해 page.text 문서를 실행하여 BeautifulSoup 대상을 제공할 것입니다. 즉, 이 분석 페이지의 분석 트리는 HTML에서 Python에 내장된 html.parser 을 실행함으로써 얻을 수 있습니다.구조된 객체는 mockturtle.html 문서를 중첩된 데이터 구조로 표시합니다.이것은 변수 soup에 분배되었다.
    1. soup = BeautifulSoup(page.text, 'html.parser')
    터미널에 페이지의 내용을 표시하기 위해 prettify() 방법으로 출력하여 멋진 Soup 해석 트리를 형식이 좋은 유니코드 문자열로 변환할 수 있습니다.
    1. print(soup.prettify())
    그러면 각 HTML 태그가 자신의 행에 표시됩니다.
    Output
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type"/> <title> Turtle Soup </title> </head> <body> <h1> Turtle Soup </h1> <p class="verse" id="first"> Beautiful Soup, so rich and green, <br/> Waiting in a hot tureen! <br/> Who for such dainties would not stoop? <br/> Soup of the evening, beautiful Soup! ... </html>
    위의 출력에서 줄마다 표시가 있는 것을 볼 수 있습니다. 그리고 이 표시는 끼워 넣은 것입니다. 왜냐하면 Beautiful Soup은 트리 모드를 사용했기 때문입니다.

    태그 인스턴스 찾기


    Beauty Soup의 find_all 방법을 사용하여 페이지에서 단일 태그를 추출할 수 있습니다.그러면 문서에서 지정된 태그의 모든 인스턴스가 반환됩니다.
    1. soup.find_all('p')
    우리의 대상에서 이 방법을 실행하면 노래의 전체 텍스트 및 관련 <p> 태그와 이 요청 태그에 포함된 모든 태그를 되돌려줍니다. 이 태그는 줄 바꾸기 <br/>을 포함합니다.
    Output
    [<p class="verse" id="first">Beautiful Soup, so rich and green,<br/> Waiting in a hot tureen!<br/> Who for such dainties would not stoop?<br/> Soup of the evening, beautiful Soup!<br/> Soup of the evening, beautiful Soup!<br/></p>, <p class="chorus" id="second">Beau--ootiful Soo--oop!<br/> ... Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beauti--FUL SOUP!<br/></p>]
    위의 출력에서 데이터가 네모난 괄호 [ ]에 포함되어 있음을 알 수 있습니다.이것은 그것이 Python list data type이라는 것을 의미한다.
    이것은 목록이기 때문에 우리는 그 중의 특정 항목(예를 들어 세 번째 <p> 요소)을 호출하고 get_text() 방법으로 이 표시에서 모든 텍스트를 추출할 수 있다.
    1. soup.find_all('p')[2].get_text()
    이 예제에서는 세 번째 <p> 요소의 출력을 수신합니다.
    Output
    'Beautiful Soup! Who cares for fish,\n Game or any other dish?\n Who would not give all else for two\n Pennyworth only of Beautiful Soup?\n Pennyworth only of beautiful Soup?'
    \n 줄 바꿈 문자열도 위에서 되돌아온 문자열에 표시됩니다.

    클래스 및 ID별로 태그 찾기


    Beautiful Soup을 사용하여 웹 데이터를 처리할 때 CSS 선택기 (예: class와 ID) 를 참조하는 HTML 요소를 볼 수 있습니다.find_all() 방법을 사용하고 클래스와 ID 문자열을 매개 변수로 전달함으로써 우리는 특정한 클래스와 ID를 대상으로 할 수 있다.
    우선 chorus류의 모든 실례를 찾아보겠습니다.Beautiful Soup에서 클래스의 문자열을 키워드 매개변수 class_에 지정합니다.
    1. soup.find_all(class_='chorus')
    위의 행을 실행하면 다음 목록을 출력으로 받습니다.
    Output
    [<p class="chorus" id="second">Beau--ootiful Soo--oop!<br/> Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beautiful Soup!<br/></p>, <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br/> Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beauti--FUL SOUP!<br/></p>]
    <p> 클래스의 두 chorus 태그 세그먼트를 터미널에 인쇄합니다.
    또한 chorus 태그에서만 <p> 클래스를 검색하도록 지정할 수 있습니다.
    1. soup.find_all('p', class_='chorus')
    위의 줄을 실행하면 이전과 같은 출력이 발생합니다.
    HTML 태그와 연관된 ID를 찾기 위해 Beautiful Soup을 사용할 수도 있습니다.이 예에서는 키워드 매개변수 'third'에 문자열 id을 할당합니다.
    1. soup.find_all(id='third')
    위의 행을 실행하면 다음과 같은 출력을 받을 수 있습니다.
    Output
    [<p class="verse" id="third">Beautiful Soup! Who cares for fish,<br/> Game or any other dish?<br/> Who would not give all else for two<br/> Pennyworth only of Beautiful Soup?<br/> Pennyworth only of beautiful Soup?<br/></p>]
    id가 <p>third 라벨과 관련된 텍스트는 관련 라벨과 함께 터미널에 출력됩니다.

    결론


    이 강좌는 Python의 Requests 모듈을 사용하여 웹 페이지를 검색하고 이 웹 페이지의 텍스트 데이터를 초보적으로 캡처하여 Beautiful Soup을 이해하도록 안내합니다.
    여기에서 웹 스크랩 프로그램을 계속 만들 수 있습니다. 이 프로그램은 튜토리얼 How To Scrape Web Pages with Beautiful Soup and Python 3에 따라 웹에서 수집한 데이터에 따라 CSV 파일을 만들 것입니다.