[Python: 웹크롤링] 2. 정적 웹크롤링

지난 포스팅부터, 정적 및 동적 웹페이지와 웹크롤링을 다뤄보고 있다. 지난 포스팅에서는 간략한 HTML에 대한 이해와 정적 및 동적 웹페이지의 차이 및 웹크롤링의 간단한 소개 정도를 다뤄보았다. 지난 포스팅이 궁금하다면, 아래를 참고해보자.
2025.02.02 - [코딩 및 컴퓨터 공부/웹크롤링-Python] - [Python: 웹 크롤링] 1. 정적/동적 웹페이지 및 크롤링
[Python: 웹 크롤링] 1. 정적/동적 웹페이지 및 크롤링
오늘 포스팅부터는 웹크롤링에 관해 올려보려고 한다. 사실 본인은 컴퓨터공학이나 코딩을 전공으로 공부하는 사람은 아니지만, 방학 기간 중 리서치 인턴을 하다가 크롤링 툴이 있으면 좋을
gyuuuul.tistory.com
오늘 포스팅에서는 정적 웹크롤링에 대해 간단한 소개와 원리를 알아보고, 파이썬 코드를 이용해서 정적 웹크롤링을 예제를 통해 구현해보도록 하겠다.
그럼 시작해보자!!
1. 정적 웹크롤링
정적 웹 크롤링은 지난 포스팅에서 설명한 "정적 웹페이지"와 같은 개념이다. 원하는 웹페이지 문서의 URL을 바탕으로 HTML 문서를 불러와 세부정보를 추출해내는 과정이다. 크롤링 과정에서 어떤 동작을 통해 변화된 HTML을 추출할 수는 없어서, 정적 웹페이지를 크롤링하는데 적합하다. 물론, 동적 웹페이지에도 정적 웹크롤링을 적용할 수는 있겠으나, 모든 정보를 추출할 수는 없을 것이다.
그럼 정적 웹크롤링의 과정을 알아보자.
1. 크롤링하고자 하는 웹 페이지의 HTML 문서를 전부 가져온다.
2. 가져온 HTML 문서를 파싱(Parsing)한다.
3. 파싱한 HTML 문서에서 추출하고자 하는 텍스트가 위치한 HTML tag를 찾아 추출한다.
위 과정에서 어려운 용어가 있다면 파싱(Parsing)일 터인데, 자세한 내용은 밑의 패키지를 소개하면서 설명하도록 하겠다.
그럼 지금부터, 이 과정을 수행하기 위해 필요한 파이썬 패키지를 하나씩 살펴보자.
2. 정적 웹크롤링에 필요한 Python 패키지
2.1 파이썬 requests 패키지
파이썬의 requests 패키지는 HTTP 요청을 보내는 패키지이다. 같은 기능을 하는 패키지 중에서는 파이썬 기본 라이브러리에 포함된 urllib 패키지가 있는데, requests는 이에 비해 문법이 더 사용자 친화적이고 안정성이 높아 자주 사용된다고 한다.
정적 웹크롤링에서는 requests의 get() method로 HTML text문서를 가져올 때 사용한다. 아래 예시를 통해 살펴보자.
requests는 기본 패키지가 아니기 때문에 다운로드를 해야한다. 명령 프롬포트(윈도우는 cmd, MacOS라면 terminal을 검색해서 실행시키자)에 아래 문장을 치면 다운로드가 진행된다. 몇 초 걸리지 않으니 바로 다운받도록 하자.
pip install requests #Windows
pip3 install requests #MacOS
2.2 파싱(Parsing)과 BeautifulSoap
파싱(Parsing)이란 컴퓨터가 이해할 수 있도록 문자열 데이터를 특정 형식에 맞게 분석하고 구조화하여 데이터를 변환하는 과정을 의미한다. 우리가 분석하고자 하는 문서는 웹페이지의 HTML 문자열(텍스트 형태)로, 이를 파이썬에서 다룰 수 있는 형태의 트리 구조 즉, 파이썬 객체 집합으로 변환을 해주어야 한다는 것이다. 다소 말이 어려울 수는 있으나 간단하게 말해서, HTML 문자열을 컴퓨터가 잘 이해할 수 있도록 트리 형식으로 구조화 하는 것이라고 생각해주면 되겠다. 이러한 파싱을 수행하는 파이썬 패키지 중, 가장 많이 사용하는 것이 BeautifulSoap이다!! (Parsing에 대한 더 디테일한 이야기는 API 포스팅을 하면서 설명해보도록 하겠다)
2.1과 2.2를 정리하자면, HTML text 문서를 requests로 불러온 뒤, BeautifulSoap을 통해 parsing을 거쳐야 우리가 원하는 정보를 추출할 준비가 되었다고 할 수 있다.
BeautifulSoap 도 파이썬 기본 패키지가 아니기 때문에, 다운로드를 해주어야 한다. 명령 프롬프트(윈도우는 cmd, MacOS라면 terminal을 검색 후 실행)에 아래를 입력하면 되겠다.
pip install beautifulsoup4 #Windows
pip3 install beautifulsoup4 #MacOS
3. 정적 웹크롤링 연습하기
위의 과정을 잘 이해하고 필요한 패키지를 모두 다운로드 받았다면, 웹 크롤링을 한 준비는 모두 끝났다!! 지금부터는 예제코드와 함께 정적 웹 크롤링을 연습해보도록 하자.
3.1 연습1 - requests 패키지로 HTML 문서를 출력하고 txt에 저장하기 - 네이버 메인
위에서 설명했던 requests 패키지는 HTML 문서를 불러오는 패키지이다. 네이버 메인 홈페이지의 HTML을 requests 패키지로 불러와 출력하고, txt 파일에 저장하는 파이썬 코드를 만들어보도록 하자.
# requests 패키지 가져오기
import requests
# 가져올 url 문자열로 입력
url = 'https://www.naver.com'
# requests의 get함수를 이용해 해당 url로 부터 html이 담긴 자료를 받아옴
response = requests.get(url)
# 우리가 얻고자 하는 html 문서가 여기에 담기게 됨
html_text = response.text
print(html_text)
with open('naver.html', 'w', encoding='utf-8') as file:
file.write(html_text)
3.2 연습2 - BeautifulSoup을 이용해서 HTML parsing하기 - 네이버 뉴스검색
위에서 설명했던 BeautifulSoup 패키지는 HTML 문서를 파싱(parsing)하는 패키지이다. 네이버 뉴스 검색란에서 검색할 키워드를 입력하면, 네이버 뉴스검색 창의 HTML을 requests 패키지로 가져와 BeautifulSoup 패키지가 parsing하게 된다. 그 결과를 HTML로 출력하는 코드를 만들어보도록 하자.
# 1. improt로 패키지 불러오기
import requests
from bs4 import BeautifulSoup as bs
# 2. naver에 검색할 키워드 입력
query = input('검색할 키워드를 입력하세요: ')
# 3. 네이버 뉴스 검색 결과의 url은 마지막 query(키워드)만 변함. 즉, 입력한 query, 즉 키워드로 네이버 뉴스 검색을 하라는 것. 이를 저장
url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query='+'%s'%query
# 4. requests 패키지를 이용해 'url'(네이버 뉴스 검색 결과)의 html 문서 가져오기
response = requests.get(url)
html_text = response.text
# 5. beautifulsoup 패키지로 파싱(parsing) 후, 'soup' 변수에 저장
soup = bs(response.text, 'html.parser')
# 6. 'soup' 결과 출력 및 검색결과 html 출력. prettify()가 꼭 필요함. soup라는 객체를 string으로 변환하는 함수임.
print(soup.prettify())
with open('%s.html' %query, 'w', encoding='utf-8') as file:
file.write(soup.prettify())
연습3 - 네이버 뉴스에 검색할 키워드를 입력하고, 제목 및 link 출력하기
지금까지 잘 따라왔다면, 조금 더 실용적인 연습을 해보도록 하자. 네이버에 검색할 키워드를 입력하면, 네이버 뉴스기사에서 검색 후, 첫 페이지의 제목 및 링크를 출력하는 코드를 만들어보자.
위에서 사용한 requests 및 BeautifulSoup을 모두 사용하고, for문을 이용해 기사 제목과 링크들을 출력할 것이다. 실행을 시키면 10개 정도의 뉴스기사에 대한 정보를 얻을 수 있다.
주의!!! 네이버 뉴스기사 페이지는 스크롤을 밑으로 내리면 더 많은 기사가 추가되는, "반응형 웹페이지"다. 즉, 기사를 10개 이상 추출하기 위해서는 이에 대한 고려를 해주어야 한다. 그 방법이 바로 동적 웹 크롤링이다! 이에 대해서는 다음 포스팅을 통해 언급하도록 하겠다.
# requests와 beautifulsoup를 이용, 추출 방법
# 크롬 개발자도구에서 커서 모양의 아이콘을 클릭 -> 추출을 원하는 부분을 클릭 -> 해당 부분의 HTML 태그 및 속성을 (ex. a와 href)를 분석하여 select( ) 함수로 추출
# 네이버 뉴스에서 태그 및 속성(attrs)는: "a.news_tit" 임.
# 1. improt로 패키지 불러오기
import requests
from bs4 import BeautifulSoup as bs
# 2. naver에 검색할 키워드 입력
query = input('검색할 키워드를 입력하세요: ')
# 3. 네이버 뉴스 검색 결과의 url은 마지막 query(키워드)만 변함. 즉, 입력한 query, 즉 키워드로 네이버 뉴스 검색을 하라는 것. 이를 저장
url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query='+'%s'%query
# 4. requests 패키지를 이용해 'url'(네이버 뉴스 검색 결과)의 html 문서 가져오기
response = requests.get(url)
html_text = response.text
# 5. beautifulsoup 패키지로 파싱(parsing) 후, 'soup' 변수에 저장
soup = bs(response.text, 'html.parser')
# 6. "news_titles"라는 변수에 제목 해당되는 html을 지정. 그 후 '.get_text()' 함수를 이용해 제목을 추출한다.
news_titles = soup.select("a.news_tit")
for i in news_titles:
title = i.get_text()
print(title)
# 7.뉴스 하이퍼링크 추출. '.atters['href']'함수를 이용.
for i in news_titles:
href = i.attrs['href']
print(href)
오늘 포스팅에서는 정적 웹크롤링에 대해 간단히 알아보았다.
다음 포스팅부터는 동적 웹크롤링에 해 알아보고, 예제를 파이썬 코드와 함께 알아보도록 하겠다.
궁금한 점이 있다면, 언제든 댓글로 질문을 달아주면 성실히 답변해 보도록 하겠다.
그럼 안녕~!!