웹사이트 검색

Python 3에서 요청 및 아름다운 수프를 사용하여 웹 데이터로 작업하는 방법


소개

웹은 우리가 읽고 이해할 수 있는 것보다 더 많은 데이터를 제공하기 때문에 우리는 종종 정보를 이해하기 위해 프로그래밍 방식으로 작업하기를 원합니다. 때때로 해당 데이터는 웹사이트 제작자가 .csv 또는 쉼표로 구분된 값 파일이나 API(Application Programming Interface)를 통해 당사에 제공합니다. 다른 경우에는 웹에서 직접 텍스트를 수집해야 합니다.

이 튜토리얼은 웹 페이지의 데이터를 사용하기 위해 Beautiful Soup Python 패키지로 작업하는 방법을 설명합니다. Requests 모듈을 사용하면 Python 프로그램을 웹 서비스와 통합할 수 있으며 Beautiful Soup 모듈은 화면 스크래핑을 빠르게 완료하도록 설계되었습니다. Python 대화형 콘솔과 이 두 라이브러리를 사용하여 웹 페이지를 수집하고 거기에서 사용 가능한 텍스트 정보로 작업하는 방법을 살펴보겠습니다.

전제 조건

이 자습서를 완료하려면 Python 3용 개발 환경이 필요합니다. Ubuntu 20.04 서버에서 Python 3을 설치하고 프로그래밍 환경을 설정하는 방법 시리즈에서 사용 가능한 운영 체제에 대한 적절한 가이드를 따라 모든 것을 구성할 수 있습니다. 필요.

또한 다음에 대해 잘 알고 있어야 합니다.

  • Python 대화형 콘솔
  • Python 3에서 모듈 가져오기
  • HTML 구조 및 태그 지정

개발 환경을 설정하고 이러한 Python 프로그래밍 개념을 염두에 두고 Requests 및 Beautiful Soup 작업을 시작하겠습니다.

요청 설치

Python 3 프로그래밍 환경을 활성화하여 시작하겠습니다. 환경이 있는 디렉터리에 있는지 확인하고 다음 명령을 실행합니다.

  1. . my_env/bin/activate

웹 페이지로 작업하려면 페이지를 요청해야 합니다. 요청 라이브러리를 사용하면 Python 프로그램 내에서 사람이 읽을 수 있는 방식으로 HTTP를 사용할 수 있습니다.

프로그래밍 환경이 활성화되면 pip로 요청을 설치합니다.

  1. pip install requests

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

Requests가 이전에 설치된 경우 터미널 창에서 다음과 유사한 피드백을 받았을 것입니다.

Output
Requirement already satisfied ...

프로그래밍 환경에 Requests가 설치되면 계속해서 다음 모듈을 설치할 수 있습니다.

아름다운 수프 설치

Requests에서 했던 것처럼 pip로 Beautiful Soup을 설치할 것입니다. Beautiful 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 대화형 콘솔로 이동해 보겠습니다.

  1. python

여기에서 샘플 웹 페이지를 수집할 수 있도록 요청 모듈을 가져옵니다.

  1. import requests

샘플 웹 페이지 mockturtle.html의 URL(아래)을 변수 url에 할당합니다.

  1. url = 'https://assets.linux-console.net/articles/eng_python/beautiful-soup/mockturtle.html'

다음으로 request.get() 메서드를 사용하여 해당 페이지의 요청 결과를 변수 page에 할당할 수 있습니다. 페이지의 URL( url 변수에 할당됨)을 해당 메서드에 전달합니다.

  1. page = requests.get(url)

변수 page에는 Response 개체가 할당됩니다.

>>> page
<Response [200]>
>>> 

위의 응답 개체는 대괄호 안에 status_code 속성을 알려줍니다(이 경우 200). 이 특성은 명시적으로 호출할 수 있습니다.

>>> page.status_code
200
>>> 

반환된 코드 200은 페이지가 성공적으로 다운로드되었음을 알려줍니다. 숫자 2로 시작하는 코드는 일반적으로 성공을 나타내고 4 또는 5로 시작하는 코드는 오류가 발생했음을 나타냅니다. W3C의 상태 코드 정의에서 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 태그와 함께 인쇄된 것을 볼 수 있습니다. 다만 여백이 많지 않아 읽기가 어렵다.

다음 섹션에서는 Beautiful Soup 모듈을 활용하여 이 텍스트 데이터를 보다 인간 친화적인 방식으로 작업할 수 있습니다.

아름다운 수프로 페이지를 넘기기

Beautiful Soup 라이브러리는 구문 분석된 HTML 및 XML 문서(닫히지 않은 태그 또는 태그 수프 및 기타 잘못된 마크업이 있는 문서 포함)에서 구문 분석 트리를 생성합니다. 이 기능은 웹 페이지 텍스트를 요청 모듈에서 본 것보다 더 읽기 쉽게 만듭니다.

시작하려면 Beautiful Soup을 Python 콘솔로 가져옵니다.

  1. from bs4 import BeautifulSoup

다음으로 모듈을 통해 page.text 문서를 실행하여 BeautifulSoup 객체를 제공합니다. HTML을 통해 Python의 내장 html.parser를 실행하는 것으로부터. 생성된 개체는 mockturtle.html 문서를 중첩된 데이터 구조로 나타냅니다. 이것은 변수 soup에 할당됩니다.

  1. soup = BeautifulSoup(page.text, 'html.parser')

터미널에 페이지의 내용을 표시하기 위해 prettify() 메서드로 인쇄하여 Beautiful 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에서 사용하는 트리 스키마로 인해 태그가 중첩되어 있음을 알 수 있습니다.

태그 인스턴스 찾기

Beautiful Soup의 find_all 메소드를 사용하여 페이지에서 단일 태그를 추출할 수 있습니다. 이것은 문서 내에서 주어진 태그의 모든 인스턴스를 반환합니다.

  1. soup.find_all('p')

개체에서 해당 메서드를 실행하면 관련 <p> 태그 및 요청된 태그에 포함된 모든 태그와 함께 노래의 전체 텍스트가 반환되며 여기에는 줄 바꿈 태그
:

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 목록 데이터 유형임을 의미합니다.

목록이기 때문에 그 안에 있는 특정 항목(예: 세 번째 <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로 태그 찾기

클래스 및 ID와 같은 CSS 선택자를 참조하는 HTML 요소는 Beautiful Soup을 사용하여 웹 데이터로 작업할 때 살펴보는 데 도움이 될 수 있습니다. 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>]

chorus 클래스가 있는 두 개의 <p> 태그 섹션이 터미널에 출력되었습니다.

하나 이상의 태그에 사용되는 경우 <p> 태그 내에서만 클래스 chorus를 검색하도록 지정할 수도 있습니다.

  1. soup.find_all('p', class_='chorus')

위의 줄을 실행하면 이전과 동일한 출력이 생성됩니다.

Beautiful Soup을 사용하여 HTML 태그와 연결된 ID를 타겟팅할 수도 있습니다. 이 경우 키워드 인수 id에 문자열 third를 할당합니다.

  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가 third<p> 태그와 연결된 텍스트는 관련 태그와 함께 터미널에 출력됩니다.

결론

이 튜토리얼은 Beautiful Soup에 대한 이해를 얻기 위해 Python의 Requests 모듈을 사용하여 웹 페이지를 검색하고 해당 웹 페이지의 텍스트 데이터를 예비 스크랩하는 과정을 안내했습니다.

여기에서 How To Scrape Web Pages with Beautiful Soup and Python 3 자습서를 따라 웹에서 수집한 데이터로 CSV 파일을 생성하는 웹 스크래핑 프로그램을 만들 수 있습니다.