
웹 스크레이핑(Web scraping)은 컴퓨터 소프트웨어 기술을 활용해 웹 사이트 내의 정보를 자동으로 추출하는 것입니다. 파이썬에는 웹 사이트에 접속해 자료를 가져오거나 처리하기 위한 다양한 패키지들이 있어서 비교적 쉽게 웹 스크레이핑을 위한 코드를 작성할 수 있습니다. 파이썬으로 웹 스크레이핑하는 방법을 익히고 나면 많은 양의 웹 자료를 정리하기 위해 반복적으로 수행하던 작업(웹 사이트 접속, 자료 선택, 복사 및 붙여넣기)을 줄일 수 있습니다.
여기서는 파이썬을 이용해 웹 스크레이핑을 하는 방법을 살펴보겠습니다.
웹 사이트에 접속하는 컴퓨터나 스마트폰 등을 클라이언트(Client)라고 하고 웹 사이트를 운영하는 시스템을 서버(Server) 혹은 웹 서버(Web Server)라고 합니다. 컴퓨터에서 웹 브라우저로 인터넷을 통해 웹 사이트(웹 서버)에 HTTP 형식으로 원하는 정보를 요청(Request)합니다. 그러면 이 요청에 웹 사이트(웹 서버)가 HTTP 형식으로 응답(Response)해 HTML 파일을 보내줍니다. 이 HTML 파일을 컴퓨터의 웹 브라우저가 해석해 사람이 알아보기 쉬운 형태로 변환해 줍니다.

HTML은 HTML은 웹 페이지의 문서를 구조적으로 표현할 수 있는 언어로 크게 머리(head)와 몸통(body)으로 이뤄져 있습니다. 내부적으로는 각 항목을 이루는 요소와 그 속성으로 구성돼 있습니다.
다음은 간단한 HTML 파일의 예입니다.
<!doctype html>
<html>
<head>
<title>이것은 HTML 예제</title>
</head>
<body>
<h1>출간된 책 정보</h1>
<p id="book_title">이해가 쏙쏙 되는 파이썬</p>
<p id="author">홍길동</p>
<p id="publisher">위키북스 출판사</p>
<p id="year">2018</p>
</body>
</html>
파이썬에서 requests 라이브러리를 이용해 웹 브라우저 없이 소스를 가져오는 방법을 살펴보겠습니다. 웹 페이지에서 어떤 데이터를 가져오기 위해서는 웹 브라우저처럼 파이썬으로 웹 페이지의 HTML 파일의 소스를 가져와야 합니다. 웹 페이지의 HTML 소스코드를 가져오기 위한 파이썬의 내장 패키지로는 urllib가 있습니다. 하지만 urllib는 사용하기 불편하므로 사용하기 편한 requests 라이브러리를 이용해 HTML 소스를 읽어보겠습니다.
아래의 코드를 실행하면 구글 검색 첫 화면의 HTML 코드를 가져올 수 있습니다.
import requests
r = requests.get("https://www.google.co.kr")
다음(Daum) 웹 사이트(https://www.daum.net)에 접속해 검색창에 '지역 이름'과 '날씨'를 함께 검색어로 입력하면 해당 지역의 최신 날씨를 보여줍니다. 예를 들어 "서울시 종로구 청운동 날씨"를 입력하면 아래 오늘의 날씨를 기본 검색 결과로 보여줍니다. 정확한 지역을 설정하지 않으면 가장 근접한 지역의 날씨를 보여줍니다.

다음은 다음(Daum) 웹 사이트의 구조를 분석해 날씨 정보를 가져오는 함수입니다.
import requests
from bs4 import BeautifulSoup
import time
def get_weather_daum(location):
search_query = location + " 날씨"
search_url = "https://search.daum.net/search?w=tot&DA=YZR&t__nil_searchbox=btn&sug=&sugo=&sq=&o=&q="
url = search_url + search_query
html_weather = requests.get(url).text
time.sleep(2)
soup_weather = BeautifulSoup(html_weather, "lxml")
txt_temp = soup_weather.select_one('strong.txt_temp').get_text()
txt_weather = soup_weather.select_one('span.txt_weather').get_text()
dl_weather_dds = soup_weather.select('dl.dl_weather dd')
[wind_speed, humidity, pm10] = [x.get_text() for x in dl_weather_dds]
return (txt_temp, txt_weather, wind_speed, humidity, pm10)
위 함수를 다음과 실행하면 원하는 지역의 날씨를 가져올 수 있습니다.
location = "서울시 종로구 청운동" # 날씨를 알고 싶은 지역
get_weather_daum(location) # 함수 호출
(출력 결과)
('31℃', '14시 현재, 구름많음', '3.0m/s', '38%', '좋음 (22㎍/㎥)')
네이버에서는 검색을 통해 주요 통화에 대한 환율 정보를 아래 그림과 같이 표 형식으로 제공합니다.

웹 사이트에 있는 표 형식의 데이터는 판다스(pandas)의 read_html()을 이용하면 쉽게 가져올 수 있습니다. 다음은 네이버에서 '환율'을 검색해 보이는 환율 Table의 데이터를 가져오는 코드입니다.
import pandas as pd
url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%ED%99%98%EC%9C%A8'
# url에서 표 데이터를 추출해 DataFrame 데이터의 리스트로 반환
dfs = pd.read_html(url)
dfs[0]
(출력 결과)
[ 통화명 매매기준율 전일대비 등락률
0 미국 USD 1280.00 전일대비상승24.00 +1.91%
1 일본 JPY 100 953.55 전일대비상승11.28 +1.20%
2 유럽연합 EUR 1347.46 전일대비상승1.40 +0.10%
3 중국 CNY 190.16 전일대비상승1.98 +1.05%
4 영국 GBP 1582.98 전일대비상승8.84 +0.56%
5 호주 AUD 904.38 전일대비상승2.32 +0.26%
6 캐나다 CAD 1001.53 전일대비상승1.13 +0.11%
7 뉴질랜드 NZD 816.00 전일대비상승5.50 +0.68%]
셀레니움은 웹 브라우저 제어를 위한 다앙한 기능을 제공합니다. 이를 이용하면 다음과 같은 작업을 수행할 수 있습니다.
Time API(https://timeapi.io/)는 시간 관련 다양한 웹 API를 제공합니다. 이 웹 API는 데이터를 요청하기 위해 API 키나 토큰이 필요하지 않습니다. 따라서 API 키나 토큰 없이 원하는 데이터를 GET 방식이나 POST 방식으로 요청하면 정해진 형식으로 응답합니다.
다음은 Time API를 이용해 우리나라의 시간대 정보와 현재 시각을 가져오는 코드입니다.
url = "https://timeapi.io/api/Time/current/zone" # 요청 주소
parameters = {"timeZone": "Asia/Seoul"} # 요청 매개 변수
r = requests.get(url, params=parameters)
print(r.text)
(출력 결과)
{"year":2022,"month":6,"day":25,"hour":16,"minute":3,"seconds":3,"milliSeconds":698,"dateTime":"2022-06-25T16:03:03.6981906","date":"06/25/2022","time":"16:03","timeZone":"Asia/Seoul","dayOfWeek":"Saturday","dstActive":false}
스포티파이(Spotify)는 2008년 스웨덴에서 시작한 글로벌 음원 스트리밍 서비스로 8천만 곡 이상의 음원을 보유한 것으로 알려져 있습니다. 스포티파이는 아티스트와 노래 관련 데이터를 가져올 수 있는 API를 제공합니다. 스포티파이 API를 이용하면 아티스트의 인기곡 및 앨범 정보, 트랙(곡)의 정보 및 오디오 특징 정보 등을 가져올 수 있습니다
다음은 스포티파이 API를 이용해 몇 가지 트랙(노래)에 대한 오디오 특징을 가져와 그래프로 표시한 것입니다. 여기서 이용한 트랙은 다음과 같습니다.
track_IDs = ["2bgTY4UwhfBYhGT4HUYStN", # 방탄소년단 Butter
"3P3UA61WRQqwCXaoFOTENd", # 아이유 밤편지
"5FKdWT5A7vDTEnPiHrruFY", # 김동률 출발
"4ribiWWnI451QMRdOgByIP", # 이무진 비와 당신
"1s6GWG2BrEWLE8sbd1lXME", # 악뮤 오랜 날 오랜 밤
"4t2FIqZJORKZGSKg30SShr", # 악뮤(with IU) 낙하
"1iIhGHzzrzqQfuNkFI2qAn", # 지코 아무 노래
"4XaG9IpCXklOcuau1sIrUX", # 퀸(Queen) We Are The Champions
"7vd1j4IDTU0koES9M8dvBQ", # 이루마 Kiss The Rain
"3L1Ssz5HaOV3ZG9eJnV8UY"] # 피아노 캐논 변주곡

지금까지 파이썬을 이용해 웹 스크레이핑을 수행하는 방법에 대해 살펴봤습니다. 여기에 소개한 내용 외에 파이썬을 이용한 웹 스크레이핑 방법이나 스트림릿(streamlit)을 이용한 웹 앱을 만드는 방법, 카카오 API (kakao API)를 이용해 카카오톡으로 웹 스크레이핑한 결과를 보내는 방법에 대해 알고 싶다면 아래의 책을 참고하세요.
