위키피디아에서 조사한 데이터를 이메일로 보내기
이번 과제는 주요 역사적 사건
의 날짜 정보를 위키피디아
에서 크롤링한 후, 역사적 사건과 날짜 정보를 담은 CSV 파일
을 이메일로 첨부해 전송하는 것입니다.
이와 같은 프로그램이 작동하는 원리를 이해하면 대규모의 데이터를 크롤링하고, 이를 다양한 형태로 가공하여 전달하도록 활용 사례를 확장할 수 있습니다.
크롤링 결과 CSV로 변환하기
먼저 크롤링한 결과를 CSV
로 변환하는 과정을 살펴보겠습니다.
1단계: 필요한 라이브러리 가져오기
import pandas as pd
import requests
from bs4 import BeautifulSoup
-
pandas : 데이터를 읽고 처리하는 데 사용하는 라이브러리입니다. 주로
엑셀
및CSV
파일을 다룹니다. -
requests : 웹 페이지에
요청
을 보내고응답
을 받기 위해 사용하는 라이브러리입니다. -
BeautifulSoup : 웹 페이지의
HTML 코드
를 분석하고 원하는 정보를 추출하는 라이브러리입니다.
2단계: 엑셀 파일 읽기
df = pd.read_excel('input_file.xlsx')
-
file_url : 엑셀 파일 경로입니다. 이 파일에는 역사적 사건에 대한
번호
와이름
이 저장되어 있습니다. -
pd.read_excel : pandas의
read_excel
함수를 사용해 엑셀 파일을 데이터프레임 형태로 읽어옵니다.
3단계: 위키피디아에서 날짜 정보 추출하는 함수 만들기
def extract_date(event_name):
# 위키피디아 페이지 URL
url = base_url + event_name
# 웹 페이지 요청
response = requests.get(url)
# 요청이 성공한 경우
if response.status_code == 200:
# HTML 파싱
soup = BeautifulSoup(response.content, 'html.parser')
# 날짜 정보가 있는 경우 주로 infobox에 존재한다고 가정
infobox = soup.find('table', {'class': 'infobox'})
# infobox에서 '날짜' 항목 찾기
if infobox:
# '날짜' 항목이 있는지 확인
date_tag = infobox.find('th', string='날짜')
# '날짜' 항목이 있는 경우
if date_tag:
# '날짜' 항목의 다음 형제 태그에서 날짜 정보 추출
date_value = date_tag.find_next_sibling('td')
# 날짜 정보가 있는 경우
if date_value:
# 날짜 정보 반환
return date_value.text.strip()
# 날짜 정보가 없는 경우
return '날짜 정보 없음'
# 웹페이지 요청이 실패한 경우
else:
return '페이지 오류'
-
requests.get : 주어진 URL로 웹 요청을 보내고 응답을 받습니다.
-
BeautifulSoup : 응답 받은 HTML 코드를 분석합니다.
-
infobox : 사건의 정보가 담긴 표(table)를 찾아 그 안에서 '날짜'라는 항목을 찾아 값을 반환합니다.
-
return : 날짜를 찾지 못하면 '날짜 정보 없음', 페이지가 로드되지 않으면 '페이지 오류'라는 메시지를 반환합니다.
4단계: 데이터프레임에 함수 적용하기
df['날짜'] = df['역사적사건'].apply(extract_date)
-
df['역사적사건']: 엑셀 파일에서 읽어온
'역사적사건'
열입니다. 각 사건의 이름을 의미합니다. -
apply(extract_date): 각 사건 이름에 대해
extract_date
함수를 적용하여 날짜를 추출하고, 그 결과를 새로운 '날짜' 열에 저장합니다.
5단계: 결과 출력하기
print(df[['역사적사건', '날짜']].to_csv(index=False))
-
df[['역사적사건', '날짜']]: '역사적사건'과 추출된 '날짜' 열만 선택합니다.
-
to_csv(index=False): 선택된 데이터를
CSV 형식
으로 변환하여 출력합니다.index=False
는 인덱스(데이터프레임에서 각 행의 위치를 나타내는 번호)를 제외하고 출력하라는 의미입니다.
다음 수업에서는 크롤링한 CSV 데이터를 이메일로 전송하는 방법을 알아보겠습니다.
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!