위키백과는 방대하고 포괄적인 정보원으로, 거의 모든 주제를 다루는 수백만 개의 문서를 포함하고 있습니다. 연구자, 데이터 과학자, 개발자에게 이 데이터는 머신러닝 데이터셋 구축부터 학술 연구 수행에 이르기까지 무수한 기회를 제공합니다. 본 문서에서는 위키백과 스크래핑 과정을 단계별로 안내합니다.
Bright Data 위키피디아 스크레이퍼 API 사용하기
위키백과에서 효율적으로 데이터를 추출하려는 경우, Bright Data 위키백과 스크레이퍼 API는 수동 웹 스크래핑에 대한 훌륭한 대안입니다. 이 강력한 API는 프로세스를 자동화하여 대량의 정보를 훨씬 쉽게 수집할 수 있게 합니다.
주요 활용 사례:
- 다양한 주제에 대한 설명 수집
- 위키백과 정보와 다른 데이터 소스 비교
- 대규모 데이터셋을 활용한 연구 수행
- 위키피디아 커먼스에서 이미지 스크래핑
JSON, CSV, .gz 등의 형식으로 데이터를 얻을 수 있으며, Amazon S3, Google Cloud Storage, Microsoft Azure 등 다양한 전달 옵션을 지원합니다.
단 한 번의 API 호출로 방대한 데이터에 빠르고 쉽게 접근할 수 있습니다!
파이썬을 사용하여 위키백과를 스크랩하는 방법
이 단계별 튜토리얼을 따라 Python을 사용하여 위키백과를 스크랩하세요.
1. 설정 및 필수 조건
시작하기 전에 개발 환경이 제대로 구성되었는지 확인하세요:
- 파이썬 설치: 공식 파이썬 웹사이트에서 최신 버전의 파이썬을 다운로드하여 설치하세요.
- IDE 선택: 개발 작업에 PyCharm, Visual Studio Code 또는 Jupyter Notebook과 같은 IDE를 사용하세요.
- 기본 지식: CSS 선택자에 익숙하고 브라우저 개발자 도구(DevTools ) 를 사용하여 페이지 요소를 검사하는 데 익숙해야 합니다.
Python을 처음 접하는 경우, Python으로 스크래핑하는 방법 가이드에서 자세한 지침을 확인하세요.
다음으로, Python에서 패키지 및 가상 환경 관리를 간소화하는 종속성 관리 도구인 Poetry를 사용하여 새 프로젝트를 생성하세요.
poetry new wikipedia-scraper
이 명령어는 다음과 같은 프로젝트 구조를 생성합니다:
wikipedia-scraper/
├── pyproject.toml
├── README.md
├── wikipedia_scraper/
│ └── __init__.py
└── tests/
└── __init__.py
프로젝트 디렉터리로 이동하여 필요한 종속성을 설치하세요:
cd wikipedia-scraper
poetry add requests beautifulsoup4 pandas lxml
먼저, BeautifulSoup은 HTML 및 XML 문서 파싱에 사용되며, 웹 페이지에서 특정 요소를 쉽게 탐색하고 추출할 수 있게 합니다. requests 라이브러리는 HTTP 요청 전송 및 웹 페이지 콘텐츠 가져오기를 처리합니다. Pandas는 스크랩된 데이터 조작 및 분석을 위한 강력한 도구로, 특히 테이블 작업 시 유용합니다. 마지막으로, lxml은 BeautifulSoup의 성능을 향상시키기 위해 파싱 프로세스 속도를 높이는 데 사용됩니다.
다음으로 가상 환경을 활성화하고 선호하는 코드 편집기(이 경우 VS Code)에서 프로젝트 폴더를 엽니다:
poetry shell
code .
프로젝트의 종속성을 확인하려면 pyproject.toml 파일을 엽니다. 다음과 같은 내용이어야 합니다:
[tool.poetry.dependencies]
python = "^3.12"
requests = "^2.32.3"
beautifulsoup4 = "^4.12.3"
pandas = "^2.2.3"
lxml = "^5.3.0"
마지막으로, 스크래핑 로직을 작성할 wikipedia_scraper 폴더 내에 main.py 파일을 생성하세요. 업데이트된 프로젝트 구조는 다음과 같아야 합니다:
wikipedia-scraper/
├── pyproject.toml
├── README.md
├── wikipedia_scraper/
│ ├── __init__.py
│ └── main.py
└── tests/
└── __init__.py
이제 환경 설정이 완료되었으며, 위키백과를 스크래핑할 파이썬 코드 작성을 시작할 준비가 되었습니다.
2. 대상 위키피디아 페이지 연결
시작하려면 원하는 위키백과 페이지에 연결하세요. 이 예제에서는 다음 위키백과 페이지를 스크래핑합니다.

Python을 사용하여 위키백과 페이지에 연결하는 간단한 코드 조각입니다:
import requests # HTTP 요청을 위해
from bs4 import BeautifulSoup # HTML 콘텐츠 파싱을 위해
def connect_to_wikipedia(url):
response = requests.get(url) # URL로 GET 요청 전송
# 요청 성공 여부 확인
if response.status_code == 200:
return BeautifulSoup(response.text, "html.parser") # HTML 파싱 및 반환
else:
print(f"페이지 가져오기 실패. 상태 코드: {response.status_code}")
return None # 요청 실패 시 None 반환
wikipedia_url = "<https://en.wikipedia.org/wiki/Cristiano_Ronaldo>"
soup = connect_to_wikipedia(wikipedia_url) # 지정된 URL의 soup 객체 획득
이 코드에서 Python requests 라이브러리를 사용하면 URL로 HTTP 요청을 보낼 수 있으며, BeautifulSoup을 사용하면 페이지의 HTML 콘텐츠를 파싱할 수 있습니다.
3. 페이지 검사
데이터를 효과적으로 추출하려면 웹페이지의 DOM (문서 객체 모델) 구조를 이해해야 합니다. 예를 들어 페이지의 모든 링크를 추출하려면 아래와 같이 <a> 태그를 대상으로 삼을 수 있습니다:

이미지를 스크래핑하려면 <img> 태그를 대상으로 하고 src 속성을 추출하여 이미지 URL을 얻습니다.

테이블에서 데이터를 추출하려면 class wikitable을 가진 <table> 태그를 대상으로 지정할 수 있습니다. 이를 통해 테이블의 모든 행과 열을 수집하고 필요한 데이터를 추출할 수 있습니다.

단락을 추출하려면 페이지의 주요 텍스트 콘텐츠를 포함하는 <p> 태그를 대상으로 지정하기만 하면 됩니다.

이것으로 끝입니다! 이러한 특정 요소를 대상으로 삼으면 어떤 위키백과 페이지에서든 원하는 데이터를 추출할 수 있습니다.
4. 링크 추출
위키백과 문서에는 관련 주제, 참고 자료 또는 외부 리소스로 사용자를 안내하는 내부 및 외부 링크가 포함되어 있습니다. 위키백과 페이지의 모든 링크를 추출하려면 다음 코드를 사용할 수 있습니다:
def extract_links(soup):
links = []
for link in soup.find_all("a", href=True): # href 속성이 있는 모든 앵커 태그 찾기
url = link["href"]
if not url.startswith("http"): # URL이 상대 경로인지 확인
url = "<https://en.wikipedia.org>" + url # 상대 링크를 절대 URL로 변환
links.append(url)
return links # 추출된 링크 목록 반환
soup.find_all('a', href=True) 함수는 href 속성을 포함하는 페이지의 모든 <a> 태그를 검색합니다. 여기에는 내부 링크와 외부 링크가 모두 포함됩니다. 또한 이 코드는 상대 URL이 올바르게 형식화되도록 보장합니다.
결과는 다음과 같을 수 있습니다:
<https://en.wikipedia.org#Early_life>
<https://en.wikipedia.org#Club_career>
<https://en.wikipedia.org/wiki/Real_Madrid>
<https://en.wikipedia.org/wiki/Portugal_national_football_team>
5. 단락 추출
위키백과 문서에서 텍스트 콘텐츠를 추출하려면 본문 텍스트를 담고 있는 <p> 태그를 대상으로 삼을 수 있습니다. BeautifulSoup을 사용하여 단락을 추출하는 방법은 다음과 같습니다:
def extract_paragraphs(soup):
paragraphs = [p.get_text(strip=True) for p in soup.find_all("p")] # 단락 태그에서 텍스트 추출
return [p for p in paragraphs if p and len(p) > 10] # 10자 이상인 단락 반환
이 함수는 페이지의 모든 단락을 포착한 후, 인용문이나 단일 단어 같은 관련 없는 내용을 피하기 위해 빈 단락이나 지나치게 짧은 단락을 걸러냅니다.
결과 예시:
크리스티아누 호날두 두스 산투스 아베이루(포르투갈어 발음: [kɾiʃˈtjɐnuʁɔˈnaldu]; 1985년 2월 5일 출생)는 포르투갈의 프로 축구 선수로, 공격수로 활동하며 사우디 프로 리그 클럽 알 나스란과 포르투갈 국가대표팀의 주장을 맡고 있다. 역대 최고의 선수 중 한 명으로 널리 인정받는 호날두는 발롱도르 5회 수상[주 3], 역대 최다인 UEFA 올해의 남자 선수상 3회, 유럽 골든슈 4회(유럽 선수 최다)를 차지했다. 그는 7회 리그 우승, 5회 UEFA 챔피언스리그 우승, UEFA 유럽 축구 선수권 대회 우승, UEFA 네이션스리그 우승을 포함해 통산 33개의 트로피를 획득했다. 호날두는 챔피언스리그 최다 출전(183경기), 최다 득점(140골), 최다 도움(42개), 유럽 챔피언십 최다 출전(30경기), 최다 도움(8개), 최다 득점(14골), 국가대표 최다 득점(133골), 국가대표 최다 출전(215경기) 기록을 보유하고 있다. 그는 프로 커리어에서 1,200경기 이상 출전한 몇 안 되는 선수 중 한 명으로, 필드 플레이어 중 최다 출전 기록을 보유하고 있으며, 클럽과 국가대표팀을 합쳐 공식 시니어 커리어에서 900골 이상을 기록하여 역대 최다 득점자로 이름을 올렸습니다.
6. 테이블 추출
위키백과에는 구조화된 데이터가 포함된 테이블이 자주 등장합니다. 이러한 테이블을 추출하려면 다음 코드를 사용하세요:
def extract_tables(soup):
tables = []
for table in soup.find_all("table", {"class": "wikitable"}): # 'wikitable' 클래스를 가진 테이블 찾기
table_html = StringIO(str(table)) # 테이블 HTML을 문자열로 변환
df = pd.read_html(table_html)[0] # HTML 테이블을 DataFrame으로 읽음
tables.append(df)
return tables # DataFrame 목록 반환
이 함수는 'wikitable' 클래스를 가진 모든 테이블을 찾아 pandas.read_html() 을 사용하여 추가 처리를 위한 DataFrame으로 변환합니다.
결과 예시:

7. 이미지 추출
위키백과에서 추출할 수 있는 또 다른 유용한 자원은 이미지입니다. 다음 함수는 페이지에서 이미지 URL을 캡처합니다:
def extract_images(soup):
images = []
for img in soup.find_all("img", src=True): # src 속성이 있는 모든 이미지 태그 찾기
img_url = img["src"]
if not img_url.startswith("http"): # 상대 경로의 경우 'https:' 접두사 추가
img_url = "https:" + img_url
if "static/images" not in img_url: # 정적 이미지 또는 관련 없는 이미지 제외
images.append(img_url)
return images # 이미지 URL 목록 반환
이 함수는 페이지 내 모든 이미지(<img> 태그)를 찾아 상대 경로 URL에 https:를 추가하고, 콘텐츠와 무관한 이미지를 걸러내어 관련 이미지만 추출합니다.
결과 예시:
<https://upload.wikimedia.org/wikipedia/commons/d/d7/Cristiano_Ronaldo_2018.jpg>
<https://upload.wikimedia.org/wikipedia/commons/7/76/Cristiano_Ronaldo_Signature.svgb>
8. 스크랩된 데이터 저장
데이터를 추출한 후에는 나중에 사용할 수 있도록 저장해야 합니다. 링크, 이미지, 단락, 표 데이터를 각각 별도의 파일로 저장해 보겠습니다.
def store_data(links, images, tables, paragraphs):
# 링크를 텍스트 파일로 저장
with open("wikipedia_links.txt", "w", encoding="utf-8") as f:
for link in links:
f.write(f"{link}n")
# 이미지를 JSON 파일로 저장
with open("wikipedia_images.json", "w", encoding="utf-8") as f:
json.dump(images, f, indent=4)
# 단락을 텍스트 파일로 저장
with open("wikipedia_paragraphs.txt", "w", encoding="utf-8") as f:
for para in paragraphs:
f.write(f"{para}nn")
# 각 테이블을 별도의 CSV 파일로 저장
for i, table in enumerate(tables):
table.to_csv(f"wikipedia_table_{i+1}.csv", index=False, encoding="utf-8-sig")
store_data 함수는 스크랩된 데이터를 정리합니다:
- 링크는 텍스트 파일에 저장됩니다.
- 이미지 URL은 JSON 파일에 저장됩니다.
- 단락은 다른 텍스트 파일에 저장됩니다.
- 테이블은 CSV 파일로 저장됩니다.
이러한 체계적인 구성으로 나중에 데이터에 쉽게 접근하고 작업할 수 있습니다.
Python에서 데이터를 JSON으로 파싱하고 직렬화하는 방법에 대해 자세히 알아보려면 가이드를 확인하세요.
모든 것을 합치기
이제 위키피디아 페이지에서 데이터를 추출하고 저장하는 완전한 스크레이퍼를 만들기 위해 모든 함수를 결합해 보겠습니다:
import requests
from bs4 import BeautifulSoup
import pandas as pd
from io import StringIO
import json
# 페이지에서 모든 링크 추출
def extract_links(soup):
links = []
for link in soup.find_all("a", href=True):
url = link["href"]
if not url.startswith("http"):
url = "<https://en.wikipedia.org>" + url
links.append(url)
return links
# 페이지에서 이미지 URL 추출
def extract_images(soup):
images = []
for img in soup.find_all("img", src=True):
img_url = img["src"]
if not img_url.startswith("http"):
img_url = "https:" + img_url
if "static/images" not in img_url: # 원하지 않는 정적 이미지 제외
images.append(img_url)
return images
# 페이지에서 모든 테이블 추출
def extract_tables(soup):
tables = []
for table in soup.find_all("table", {"class": "wikitable"}):
table_html = StringIO(str(table))
df = pd.read_html(table_html)[0] # HTML 테이블을 DataFrame으로 변환
tables.append(df)
return tables
# 페이지에서 단락 추출
def extract_paragraphs(soup):
paragraphs = [p.get_text(strip=True) for p in soup.find_all("p")]
return [p for p in paragraphs if p and len(p) > 10] # 빈 단락 또는 짧은 단락 필터링
# 추출된 데이터를 별도 파일로 저장
def store_data(links, images, tables, paragraphs):
# 링크를 텍스트 파일로 저장
with open("wikipedia_links.txt", "w", encoding="utf-8") as f:
for link in links:
f.write(f"{link}n")
# 이미지를 JSON 파일로 저장
with open("wikipedia_images.json", "w", encoding="utf-8") as f:
json.dump(images, f, indent=4)
# 단락을 텍스트 파일로 저장
with open("wikipedia_paragraphs.txt", "w", encoding="utf-8") as f:
for para in paragraphs:
f.write(f"{para}nn")
# 각 테이블을 CSV 파일로 저장
for i, table in enumerate(tables):
table.to_csv(f"wikipedia_table_{i+1}.csv", index=False, encoding="utf-8-sig")
# 위키피디아 페이지 스크래핑 및 추출 데이터 저장 메인 함수
def scrape_wikipedia(url):
response = requests.get(url) # 페이지 콘텐츠 가져오기
soup = BeautifulSoup(response.text, "html.parser") # BeautifulSoup으로 콘텐츠 파싱
links = extract_links(soup)
images = extract_images(soup)
tables = extract_tables(soup)
paragraphs = extract_paragraphs(soup)
# 추출된 모든 데이터를 파일로 저장
store_data(links, images, tables, paragraphs)
# 사용 예시: 크리스티아누 호날두 위키백과 페이지 스크래핑
if __name__ == "__main__":
scrape_wikipedia("<https://en.wikipedia.org/wiki/Cristiano_Ronaldo>")
스크립트를 실행하면 디렉토리에 여러 파일이 생성됩니다:
wikipedia_images.json: 페이지의 모든 이미지 URL을 포함합니다.wikipedia_links.txt: 페이지의 모든 링크를 포함합니다.wikipedia_paragraphs.txt: 추출된 단락을 담습니다.- 페이지에서 발견된 각 표에 대한 CSV 파일 (예:
wikipedia_table_1.csv,wikipedia_table_2.csv).
결과는 다음과 같을 수 있습니다:

이것으로 끝입니다! 위키백과 데이터를 성공적으로 스크래핑하여 별도의 파일로 저장했습니다.
Bright Data 위키피디아 스크레이퍼 API 설정하기
Bright Data 위키피디아 스크레이퍼 API 설정 및 사용은 간단하며 단 몇 분 만에 완료할 수 있습니다. 다음 단계를 따라 빠르게 시작하여 위키피디아에서 손쉽게 데이터를 수집하세요.
1단계: Bright Data 계정 생성
Bright Data 웹사이트로 이동하여 계정에 로그인하세요. 아직 계정이 없다면 무료로 시작할 수 있으니 계정을 생성하세요. 다음 단계를 따르세요:
- Bright Data 웹사이트로 이동하세요.
- 무료 체험 시작을 클릭하고 안내에 따라 계정을 만드세요.
- 대시보드에 접속한 후 왼쪽 사이드바에서 신용카드 아이콘을 찾아 결제 페이지로 이동하세요.
- 유효한 결제 수단을 추가하여 계정을 활성화하세요.

계정 활성화가 완료되면 대시보드의 ‘웹 스크레이퍼 API’ 섹션으로 이동하세요. 여기서 사용하고자 하는 웹 스크레이퍼 API를 검색할 수 있습니다. 본 가이드에서는 ‘위키피디아’를 검색합니다.

위키백과 문서 – URL로 수집 옵션을 클릭하세요. URL만 제공하면 위키백과 문서를 수집할 수 있습니다.
2단계: API 호출 설정 시작
클릭하면 API 호출을 설정할 수 있는 페이지로 이동합니다.

진행하기 전에 API 호출 인증을 위한 API 토큰을 생성해야 합니다. ‘토큰 생성’ 버튼을 클릭하고 생성된 토큰을 복사하세요. 이 토큰은 나중에 필요하니 안전하게 보관하세요.

3단계: 매개변수 설정 및 API 호출 생성
토큰을 확보했으므로 이제 API 호출을 구성할 준비가 되었습니다. 스크래핑하려는 위키백과 페이지의 URL을 입력하면 오른쪽에 입력 내용을 기반으로 생성된 cURL 명령어가 표시됩니다.

cURL 명령어를 복사한 후, API_Token을 실제 토큰으로 대체하고 터미널에서 실행하세요. 이렇게 하면 추출된 데이터를 가져오는 데 사용할 스냅샷 ID( snapshot_id)가 생성됩니다.
4단계: 데이터 가져오기
생성한 snapshot_id를 사용하여 데이터를 가져올 수 있습니다. 이 ID를 ‘스냅샷 ID’ 필드에 붙여넣기만 하면 API가 오른쪽에 새로운 cURL 명령어를 자동 생성합니다. 이 명령어로 데이터를 추출할 수 있습니다. 또한 JSON, CSV 등 사용 가능한 옵션 중 데이터 파일 형식을 선택할 수 있습니다.

데이터를 Amazon S3, Google Cloud Storage, Microsoft Azure Storage 등 다양한 스토리지 서비스로 전송하는 옵션도 제공됩니다.

5단계: 명령 실행
이 예시에서는 JSON 파일로 데이터를 가져오는 경우를 가정해 보겠습니다. 파일 형식으로 JSON을 선택하고 생성된 cURL 명령어를 복사하세요. 데이터를 직접 파일에 저장하려면 cURL 명령어 끝에 -o my_data.json을 추가하기만 하면 됩니다. 로컬 머신에 이 데이터를 저장하려면 -o를 추가하면 지정된 파일에 데이터가 자동으로 저장됩니다.
터미널에서 실행하면 단 몇 초 만에 추출된 모든 데이터를 확인할 수 있습니다!
curl.exe -H "Authorization: Bearer 50xxx52c-xxxx-xxxx-xxxx-2748xxxxx487" "<https://api.brightdata.com/datasets/v3/snapshot/s_mxxg2xxxxx2g3nq?format=json>" -o my_data.json
위키피디아 웹 스크래핑을 직접 처리하고 싶지 않지만 데이터는 여전히 필요하신가요? 대신 위키피디아 데이터셋 구매를 고려해 보세요.

네, 정말 간단합니다!
결론
이 글에서는 Python을 사용해 위키백과 스크래핑을 시작하는 데 필요한 모든 내용을 다루었습니다. 이미지 URL, 텍스트 콘텐츠, 테이블, 내부 및 외부 링크 등 다양한 데이터를 성공적으로 추출했습니다. 그러나 더 빠르고 효율적인 데이터 추출을 위해서는 Bright Data의 위키백과 스크래퍼 API를 사용하는 것이 간편한 해결책입니다.
다른 웹사이트를 스크래핑하고 싶으신가요? 지금 등록하고 웹 스크래퍼 API를 사용해 보세요. 무료 체험을 지금 시작하세요!