웹 스크래핑 심화- BeautifulSoup 고급 기능 활용
앞서서 BeautifulSoup을 이용하여 네이버 날씨 정보를 스크래핑하는 기본적인 방법을 사용해 보았다. 이번에는 BeautifulSoup의 고급 기능을 활용하여 보다 복잡한 구조의 웹 페이지에서 원하는 정보를 효율적으로 추출하는 방법을 알아보자.
css 선택자의 활용
BeautifulSoup은 CSS 선택자를 활용하여 HTML 요소를 찾는 강력한 기능을 제공한다. select() 메서드를 사용하면 CSS 선택자에 해당하는 모든 요소를 리스트 형태로 가져올 수 있으며, select_one() 메서드를 사용하면 첫 번째 요소만 가져올 수 있다.
예시: 특정 클래스를 가진 모든 링크 가져오기
1 | soup.select("a.link-class") # class가 link-class인 a 태그 |
예시: 특정 ID를 가진 테이블의 모든 행 가져오기
1 | soup.select("#table-id tr"); |
계층적인 구조 탐색
BeautifulSoup는 parent, children, siblings 등의 속성을 통해 HTML 요소 간의 계층적인 관계를 탐색할 수 있는 기능을 제공한다. 이를 활용하면 특정 요소를 기준으로 원하는 정보를 효율적으로 찾아낼 수 있다.
예시: 특정 클래스를 가진 요소 내부의 시간대별 날씨 정보 가져오기
1 | hourly_forecasts = soup.find("ul", class_="hourly_forecast") |
정규 표현식 활용
BeautifulSoup는 정규 표현식을 활용하여 특정 패턴에 맞는 텍스트 또는 속성 값을 가진 요소를 찾을 수 있도록 지원한다. re 모듈과 함께 사용하면 강력한 스크래핑 기능을 구현할 수 있다.
예시: 강수 확률 정보가 담긴 요소 찾기
1 | import re |
실전: 네이버 날씨 주간 예보 스크래핑
네이버 날씨 웹사이트에서 특정 지역의 주간 예보 데이터를 수집하는 스크립트를 작성해 보자. 특정 지역의 주간 예보 페이지에서 날짜, 요일, 최고/최저 기온 정보를 추출한다.
단계
- 필요한 라이브러리 임포트: requests, beautifulsoup4 라이브러리를 임포트 한다.
1 | import requests |
- 웹 페이지 요청: 스크래핑할 지역의 주간 예보 페이지의 URL을 지정하고 requests 라이브러리를 사용하여 웹 페이지를 요청한다.
1 | url = "https://search.naver.com/search.naver?query=서울+날씨" # 예시 URL, 실제 지역으로 변경 필요 |
- BeautifulSoup 객체 생성: 응답받은 HTML 콘텐츠를 BeautifulSoup 객체로 변환한다.
1 | soup = BeautifulSoup(response.text, "html.parser"); |
- 주간 예보 데이터 추출: css 선택자와 select() 메서드를 사용하여, 날씨, 요일, 최고/최저 기온 정보가 담긴 HTML 요소를 찾는다.
1 | weekly_forecast = soup.select_one("ul.week_list"); |
- 데이터 정제 및 출력: 추출한 데이터에서 불필요한 문자열을 제거하고, 각 날짜별 예보 정보를 출력한다.
1 | for date, day_name, high_temp, low_temp in zip(dates, day_names, high_temps, low_temps): |
주의
웹 사이트 구조는 변경될 수 있으므로, 스크래핑하려는 웹 페이지의 HTML 구조를 분석하고 CSS 선택자를 적절히 수행해야 한다.