웹 크롤링 기초와 활용 사례: 실습과 이해
웹 크롤링은 데이터 분석 및 활용을 위한 중요한 기술로 자리 잡았다. 특히, 공개된 웹 데이터를 효과적으로 수집하여 가공하는 과정은 다양한 분야에서 활용될 수 있다. 이번 글에서는 robots.txt 파일 확인, BeautifulSoup 및 Selenium을 활용한 HTML 데이터 수집, 그리고 OpenWeatherMap API와 NewsAPI를 사용한 데이터 수집 실습을 통해 크롤링의 기본 원리와 활용 방법에 대해 복습하겠다.
크롤링의 기초
1. robots.txt 파일 확인
웹 크롤링의 첫걸음은 robots.txt 파일을 확인하는 것이다. 이 파일은 특정 웹사이트가 허용하거나 제한하는 크롤링 영역을 명시한다. 아래는 https://ai-dev.tistory.com/robots.txt 파일의 예시이다.
이 파일은 모든 User-agent(크롤링 봇)에게 /guestbook, /manage와 같은 특정 경로에 대한 접근을 차단하고 있음을 보여준다. 이를 통해 크롤링이 허용된 영역만 접근하도록 설계해야 한다.
2. HTML 구조 이해와 BeautifulSoup 사용
HTML은 웹 페이지의 구조를 정의하며, 원하는 데이터를 추출하려면 HTML 태그와 구조를 이해해야 한다. BeautifulSoup은 이러한 데이터를 파싱하고 다루는 데 유용한 라이브러리이다.
예를 들어, 아래 코드를 통해 특정 URL의 HTML 데이터를 가져올 수 있다.
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://ai-dev.tistory.com/1"
html = urlopen(url)
bs_obj = BeautifulSoup(html, "html.parser")
print(bs_obj)
위 코드는 HTML 소스를 가져와 출력한다. 이 데이터를 분석하여 원하는 정보를 추출하는 것이 다음 단계이다.
크롤링 실습 1: 스포츠 데이터 수집
목적
AC 밀란 팀의 경기 기록을 수집하여 데이터 분석에 활용합니다.
사용 도구
- Selenium: 동적 웹사이트 탐색 및 데이터 로딩
- BeautifulSoup: HTML 파싱 및 데이터 추출
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
driver.get("https://www.livesport.com/team/ac-milan/8Sa8HInO/")
html = driver.page_source
bs_obj = BeautifulSoup(html, "html.parser")
win = bs_obj.find_all("span", {"class": "wcl-simpleText_Asp-0"})
for i in win:
print(i.text)
결과
위 코드를 통해 승/패(W/L) 데이터를 추출하였으며, 이를 바탕으로 팀의 성과를 분석할 수 있었다. 예를 들어, 최근 경기에서 승률이 높음을 확인하였다.
크롤링 실습 2: 날씨 데이터 API 활용
목적
OpenWeatherMap API를 활용하여 서울의 날씨 데이터를 수집한다.
cityname = "Seoul"
apikey = "YOUR_API_KEY"
url_location = f"http://api.openweathermap.org/geo/1.0/direct?q={cityname}&appid={apikey}"
html = urlopen(url_location)
print(html.read())
이 코드를 통해 API로부터 서울의 위도와 경도 데이터를 얻은 후, 해당 좌표의 날씨 정보를 추가로 요청할 수 있다.
lat, lon = 37.5665, 126.9780
url_weather = f"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={apikey}"
html_weather = urlopen(url_weather)
print(html_weather.read())
결과
수집된 날씨 데이터를 JSON 형식으로 저장하며, 이를 분석해 특정 날씨 조건에 대한 패턴을 발견할 수 있었다.
크롤링 실습 3: 뉴스 데이터 수집
목적
NewsAPI를 활용해 특정 키워드(예: "Samsung")와 관련된 뉴스 기사를 크롤링한다.
apikey = "YOUR_API_KEY"
url_news = f"https://newsapi.org/v2/everything?q=Samsung&sortBy=popularity&apiKey={apikey}"
html_news = urlopen(url_news)
article_dic = json.loads(html_news.read())
for article in article_dic['articles']:
print(article['title'])
결과
수집한 기사에서 "Samsung"이라는 키워드가 포함된 제목 및 내용을 분석하여, 해당 키워드의 최신 동향을 파악할 수 있었다.
크롤링 시 주의사항 및 한계
- 법적/윤리적 고려
- robots.txt 규정을 준수하여 크롤링해야 한다.
- 크롤링 대상 서버에 과도한 부담을 주지 않도록 해야 한다.
- 기술적 한계
- 동적 콘텐츠(JavaScript 기반)를 크롤링할 때의 어려움
- 반봇(Anti-scraping) 기술에 대한 대응 필요
마무리
이번 크롤링 실습을 통해 robots.txt 확인, Selenium 및 BeautifulSoup 활용, 그리고 API 사용법을 배울 수 있었다. 크롤링은 단순한 데이터 수집 도구를 넘어 분석 및 의사 결정의 중요한 기초 자료를 제공한다. 앞으로 크롤링 기술을 심화하여 더 큰 프로젝트에 활용하고자 한다.