Beautiful Soup과 Python 3으로 웹 페이지를 긁는 방법
소개
많은 데이터 분석, 빅 데이터 및 기계 학습 프로젝트에서는 작업할 데이터를 수집하기 위해 웹 사이트를 스크래핑해야 합니다. Python 프로그래밍 언어는 데이터 과학 커뮤니티에서 널리 사용되므로 자체 프로젝트에서 사용할 수 있는 모듈 및 도구의 생태계가 있습니다. 이 튜토리얼에서는 Beautiful Soup 모듈에 초점을 맞출 것입니다.
태그 수프 및 기타 잘못된 마크업).
이 자습서에서는 텍스트 데이터를 가져오고 수집한 정보를 CSV 파일에 쓰기 위해 웹 페이지를 수집하고 구문 분석합니다.
전제 조건
이 튜토리얼을 진행하기 전에 컴퓨터에 서버 기반 Python 프로그래밍 환경이 설정되어 있어야 합니다.
Requests 및 Beautiful Soup 모듈이 설치되어 있어야 합니다. \How To Work with Web Data Using Requests and Beautiful Soup with Python 3\ 자습서를 따라 달성할 수 있습니다. 또한 이러한 모듈에 대해 잘 알고 있으면 유용합니다.
또한 웹에서 스크랩한 데이터로 작업할 것이므로 HTML 구조와 태깅에 익숙해야 합니다.
데이터 이해
이 튜토리얼에서는 미국 국립 미술관 공식 웹사이트의 데이터를 사용하여 작업합니다. 내셔널 갤러리는 워싱턴 D.C.의 내셔널 몰에 위치한 미술관입니다. 르네상스 시대부터 현재까지 13,000명 이상의 예술가가 제작한 120,000점 이상의 작품을 소장하고 있습니다.
이 튜토리얼을 업데이트할 때 다음 URL의 Wayback Machine을 통해 사용할 수 있는 아티스트 인덱스를 검색하고 싶습니다.
https://translate.google.com/translate?hl=ru&sl=en&tl=ko&u=https://web.archive.org/web/20170131230332/https://www.nga.gov/collection/an.shtm
참고: 위의 긴 URL은 이 웹사이트가 Internet Archive에 의해 보관되었기 때문입니다.
인터넷 아카이브는 인터넷 사이트 및 기타 디지털 미디어에 대한 무료 액세스를 제공하는 비영리 디지털 라이브러리입니다. 이 조직은 사이트의 기록을 보존하기 위해 웹 사이트의 스냅샷을 찍고 현재 이 자습서가 처음 작성되었을 때 사용 가능한 이전 버전의 내셔널 갤러리 사이트에 액세스할 수 있습니다. Internet Archive는 동일한 사이트와 사용 가능한 데이터의 반복 비교를 포함하여 모든 종류의 기록 데이터 스크랩을 수행할 때 염두에 두어야 할 좋은 도구입니다.
Internet Archive의 헤더 아래에 다음과 같은 페이지가 표시됩니다.

Beautiful Soup으로 웹 스크래핑에 대해 배우기 위해 이 프로젝트를 수행할 것이므로 사이트에서 너무 많은 데이터를 가져올 필요가 없으므로 스크랩하려는 아티스트 데이터의 범위를 제한합시다. 따라서 하나의 문자를 선택하겠습니다. 이 예에서는 문자 Z를 선택합니다. 그러면 다음과 같은 페이지가 표시됩니다.

위의 페이지에서 작성 시점에 나열된 첫 번째 아티스트는 Niccola의 Zabaglia라는 것을 알 수 있습니다. 문자 Z에 대한 다음 URL을 사용하여 이 첫 번째 페이지 작업을 시작합니다.
https://translate.google.com/translate?hl=ru&sl=en&tl=ko&u=https://web.archive.org/web/20121007172955/http://www.nga.gov/collection/anZ1.htm
나중에 나열하기 위해 선택한 편지의 총 페이지 수를 기록하는 것이 중요합니다. 아티스트의 마지막 페이지를 클릭하면 찾을 수 있습니다. 이 경우 총 4페이지이며, 작성 시점에 마지막으로 나열된 아티스트는 Zykmund, Václav입니다. Z 아티스트의 마지막 페이지 URL은 다음과 같습니다.
https://translate.google.com/translate?hl=ru&sl=en&tl=ko&u=https://web.archive.org/web/20121010201041/http://www.nga.gov/collection/anZ4.htm
그러나 첫 번째 페이지의 동일한 Internet Archive 숫자 문자열을 사용하여 위 페이지에 액세스할 수도 있습니다.
https://translate.google.com/translate?hl=ru&sl=en&tl=ko&u=https://web.archive.org/web/20121007172955/http://www.nga.gov/collection/anZ4.htm
이 자습서의 뒷부분에서 이러한 페이지를 반복할 것이기 때문에 이는 중요합니다.
이 웹 페이지 설정 방법에 익숙해지려면 개발자 도구를 살펴보십시오.
라이브러리 가져오기
코딩 프로젝트를 시작하기 위해 Python 3 프로그래밍 환경을 활성화해 보겠습니다. 환경이 있는 디렉터리에 있는지 확인하고 다음 명령을 실행합니다.
- . my_env/bin/activate
프로그래밍 환경이 활성화되면 예를 들어 nano를 사용하여 새 파일을 만듭니다. 원하는 대로 파일 이름을 지정할 수 있으며 이 자습서에서는 nga_z_artists.py
라고 합니다.
- nano nga_z_artists.py
이 파일 내에서 사용할 라이브러리인 Requests 및 Beautiful Soup 가져오기를 시작할 수 있습니다.
Requests 라이브러리를 사용하면 Python 프로그램 내에서 사람이 읽을 수 있는 방식으로 HTTP를 사용할 수 있으며 Beautiful Soup 모듈은 웹 스크래핑을 빠르게 완료하도록 설계되었습니다.
import
문을 사용하여 Request와 Beautiful Soup을 모두 가져옵니다. Beautiful Soup의 경우 Beautiful Soup 4가 있는 패키지인 bs4
에서 가져올 것입니다.
# Import libraries
import requests
from bs4 import BeautifulSoup
Requests 및 Beautiful Soup 모듈을 모두 가져오면 먼저 페이지를 수집한 다음 파싱하는 작업으로 넘어갈 수 있습니다.
웹 페이지 수집 및 구문 분석
다음 단계는 요청이 있는 첫 번째 웹 페이지의 URL을 수집하는 것입니다. 첫 번째 페이지의 URL을 requests.get()
메서드에 할당합니다.
import requests
from bs4 import BeautifulSoup
# Collect first page of artists’ list
page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')
<$>[참고]
이제 BeautifulSoup
객체 또는 구문 분석 트리를 생성합니다. 이 개체는 Requests(서버의 응답 내용)에서 page.text
문서를 인수로 취한 다음 Python의 내장 html.parser
에서 구문 분석합니다.
import requests
from bs4 import BeautifulSoup
page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')
# Create a BeautifulSoup object
soup = BeautifulSoup(page.text, 'html.parser')
페이지를 수집, 파싱 및 BeautifulSoup
개체로 설정하면 원하는 데이터 수집으로 넘어갈 수 있습니다.
웹 페이지에서 텍스트 가져오기
이 프로젝트를 위해 웹사이트에서 사용할 수 있는 아티스트 이름과 관련 링크를 수집합니다. 아티스트의 국적 및 날짜와 같은 다른 데이터를 수집할 수 있습니다. 수집하려는 데이터가 무엇이든 웹 페이지의 DOM에서 데이터를 설명하는 방법을 찾아야 합니다.
이렇게 하려면 웹 브라우저에서 첫 번째 아티스트의 이름인 Zabaglia, Niccola를 마우스 오른쪽 버튼으로 클릭(또는 macOS에서 CTRL
+ 클릭)합니다. 팝업되는 상황에 맞는 메뉴 내에서 Inspect Element(Firefox) 또는 Inspect(Chrome)와 유사한 메뉴 항목을 볼 수 있습니다.

관련 검사 메뉴 항목을 클릭하면 웹 개발자용 도구가 브라우저에 나타납니다. 이 목록에서 아티스트 이름과 연결된 클래스 및 태그를 찾고자 합니다.

먼저 이름 테이블이 이를 위해 Beautiful Soup의 다음으로 프로그램 파일의 맨 아래에 Beautiful Soup 구문 분석 트리를 멋진 형식의 유니코드 문자열로 바꾸기 위해 지금까지 프로그램을 실행해 보겠습니다. 이렇게 하면 다음과 같은 결과가 표시됩니다. 이 시점에서 출력에서 볼 수 있는 것은 지금까지 웹 페이지의 한 페이지의 하단 링크를 제거하기 위해 다시 마우스 오른쪽 버튼을 클릭하고 DOM을 검사합니다. class=BodyText
인 태그를 참조하려고 합니다. 각 아티스트의 이름은 링크에 대한 참조입니다.
find()
및 find_all()
메서드를 사용하여 BodyText<에서 아티스트 이름의 텍스트를 가져옵니다. /코드> <코드>
import requests
from bs4 import BeautifulSoup
# Collect and parse first page
page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')
soup = BeautifulSoup(page.text, 'html.parser')
# Pull all text from the BodyText div
artist_name_list = soup.find(class_='BodyText')
# Pull text from all instances of <a> tag within BodyText div
artist_name_list_items = artist_name_list.find_all('a')
artist_name_list_items
변수에 입력한 모든 아티스트 이름을 반복하기 위해 for
루프를 만들고자 합니다.prettify()
메서드로 이 이름을 인쇄합니다....
artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')
# Create for loop to print out all artists' names
for artist_name in artist_name_list_items:
print(artist_name.prettify())
불필요한 데이터 제거