파이썬 - 웹 크롤링

2025. 1. 30. 14:44IT

인터넷은 우리에게 있어 없어서는 안될 존재가 된지 이미 오래입니다. 하나에서 열까지 인터넷을 통하지 않고서는 아무것도 할 수 없다고 해도 과언이 아니죠. 뉴스를 시작으로해서 이메일을 확인하고, 맛있는 식당을 찾아 리뷰를 검색하고, 여행 갈 곳들을 검색합니다. 모르는 것이 있을 때는 구글신에게 물어보라고 합니다. 구글을 통해서 검색하면 못찾을 정보가 없기 때문에 우스갯소리로 하는 얘기가 요즘은 너무나도 당연하게 사용되고 있죠. 그뿐만 아닙니다. 웹브라우저를 열고 인터넷 쇼핑몰에 들어가면 먹거리부터 자동차까지도 쇼핑을 할 수 있습니다. 국내 뿐만 아니라 해외의 쇼핑몰을 이용해서도 쇼핑을 하죠. 우리는 업무에서도 인터넷을 사용 할 수 밖에 없는 환경입니다. 예전에는 프로그램으로 되어 있었던 사내 시스템들이 모두 웹브라우저를 통해야만 사용할 수 있도록 바뀌었습니다. 휴가계를 올릴때도 사내 표준 정보를 찾을 때도 기안서도 요즘은 사내 포털을 접속해야만 처리할 수 있는 시대입니다. 

 

웹 크롤링은 웹을 돌아다니며 필요한 정보들을 획득할 수 있는 방법들을 이야기 합니다. 웹은 HTML, Hyper Text Markup Language로 되어 있고 되어 있습니다. 그런 정보들이 내 컴퓨터까지 날아오고 그 정보를 우리가 사용하는 웹브라우저인 크롬, 엣지, 익스플로러 등이 받아서 해석을 하고 해석된 내용을 바탕으로 화면에 글자를 출력하고 그림을 위치에 맞게 그려줍니다. 화면에 보이는 것 보다 더 많은 내용이 숨겨있다가 웹에서 사용자가 어떤 동작을 하면 그때서야 보여주기도 합니다. 웹 크롤링은 이렇게 내 컴퓨터로 날아오는 정보들을 찾고 또 연결되어 있는 웹주소를 찾아가서 정보를 찾는 일을 반복적으로 수행합니다. 이렇게 웹 크롤링을 하는 프로그램을 웹봇(웹 로봇의 약자) 또는 웹크롤러라고 합니다. 예를 들어볼까요? 다음이나 네이버에 접속을 했습니다. 그러면 스포츠를 클릭해서 스포츠 란으로 갑니다. 여기서 다시 프로야구를 선택을 하고 제가 좋아하는 LG트윈스를 클릭합니다. 이런 일련의 과정들을 웹봇을 통해서 할 수 있습니다. 

 

이제는 예제가 아니라 실제로 웹 크롤링을 해 보겠습니다. 먼저 크롬 브라우저를 사용해 주세요. 그리고 daum.net의 뉴스에 들어가 ‘은행’이라는 단어로 검색을 해 보겠습니다. 그리고 검색된 뉴스의 제목과 링크를 화면에 출력하는 웹 크롤링 프로그램을 만들어 보겠습니다. 다음의 그림과 같이 우리는 Daum에 저속해서 은행을 검색하고 탭을 통합에서 뉴스로 이동을 했습니다. 그러면 은행과 관련된 뉴스들이 쭉 나타납니다. 여기서 주소를 선택해 둡니다.

 

 

 

앞의 그림과 같이 화면에 보이는 검색 결과는 모두 HTML이라는 언어로 구성이 되어 있습니다. 그래서 우리는 이 HTML을 분석해서 우리가 원하는 결과를 찾아오려고 합니다. 크롬브라우저에서는 HTML을 보고 우리가 원하는 부분을 볼 수 있는 기능이 숨어 있습니다. HTML은 우리에게 익숙한 언어는 아니지만 화면에 보이는 글자 정보들은 그대로 HTML안에 녹아 들어가 있습니다. 그렇기 때문에 그 정보들을 어떻게 분리해서 가져 오느냐가 관건입니다. 물론 관련 패키지는 나중에 소개시켜드리도록 하겠습니다. 크롬 브라우저에서 위와 같이 검색을 한 후에 키보드에서 F12 키를 눌러봅니다.  숨어 있는 HTML을 분석해서 우리가 필요한 부분을 가져오기 위함입니다. HTML을 상세하게 알아야 할 필요는 없습니다만, 기본적인 지식이 있어야 웹 크롤링을 할 수 있습니다. 모두 알 필요는 없으니 우선 살펴보면서 필요한 부분은 설명해 드리도록 하겠습니다. 

 

크롬 브라우저 오른편에 우리가 보지 못하던 창이 나타납니다. 이 부분을 통해서 우리는 우리가 필요한 정보를 어떻게 찾아가는지를 간단하게 배워보도록 하겠습니다. 우측 상부에서 엘리먼트 창을 봅니다. 여기에 나타나는 텍스트가 바로 HTML 입니다. HTML은 자동으로 계층화해서 보여줍니다. 하위 계층에 추가적인 HTML이 있는 경우에는 좌측에 ►가 있습니다. ►를 누르면 하위의 HTML이 계층화되어 나타나면서 ▼로 바뀌게 됩니다. 그리고 선택이 된 부분에 따라서 좌측에 하늘색으로 표시가 됩니다. 마우스를 이동하면서  ►와 ▼를 이용해서 우리가 원하는 정보를 찾아야 합니다. 

 

 

화면에서 우리는 맨 앞에 있는 뉴스를 찾아서 나오도록 찾기를 계속해야 합니다. 찾아들어가다 보면 다음과 같이 첫 뉴스의 제목이 선택되는 부분을 찾을 수 있습니다. 우리는 이 부분을 가져올 것입니다. 잘 살펴보기 위해서 우측 하단에 우리가 가져와야 할 HTML 부분을 확대해 놨습니다. 

우리가 보고 있는 화면은 첫번째 뉴스에 대한 내용입니다. 두번째 뉴스를 또 찾아 볼까요? 아래쪽으로 조금 내려가면서 하나씩 살펴보면 어렵지 않게 찾을 수 있습니다. 첫번째 뉴스와 동일한 구조를 가지고 있습니다. 이 반복되는 구조에서 패턴을 찾아서 우리는 분석하는데서 사용하면 됩니다. 

<div class=”wrap_cont”>가 뉴스를 모두 감싸고 있죠? 이 부분 아래를 가지고 와서 분석을 하면 됩니다. 텍스트와 주소를 가지고 오기 위해서는 HTML의 기본적인 것을 알아야 합니다. HTML은 주소를 나타내기 위해서 “<a href”로 시작을 합니다.  

 

 

그러면 어떻게 크롬 브라우저에서 보이는 내용을 분석해서 사용할 수 있을까요? 파이썬의 패키지 중에서는 HTML을 받아서 분석해주는 bs4, Beautiful Soup이라는 것이 존재합니다. 

 

pip install bs4

 

앞서서 어떻게 분석을 하는지 이론적인 부분을 간단하게 살펴봤습니다. 다시 한번 순서를 이야기 하자면, HTML로 들어오는 웹 정보들에서 내가 필요한 부분만, 뉴스에서 제목과 링크를 가져오기 위해서는 반복되는 부분을 찾아야 한다고 말씀을 드렸습니다. 이것을 Beautiful Soup을 이용해 구현해 보도록 하겠습니다. 

다음의 코드를 보면 메모를 위한 주석문을 제외하고 나면 10줄 밖에 안됩니다. 그런데 아래 콘솔에 출력된 내용을 보면 기사의 제목과 주소들이 나열되어 있는 것을 볼 수 있습니다. 이 코드들을 하나씩 살펴보도록 하겠습니다. 




013_webCrawling.py

 

 from bs4 import BeautifulSoup

 import requests

 

처음 두 줄을 볼까요? BeautifulSoup을 import하고 있는데 실제적으로 우리가 사용을 하게 될 패키지죠. 다음은 requests라는 패키지를 가져옵니다. requests 패키지는 인터넷 주소를 주면 HTML을 가져오는 기능을 하게 됩니다. BeautifulSoup이 HTML을 분석만 해 주기 때문에 HTML의 내용을 가져오기 위해서 사용하게 되는 패키지입니다.

 

 # 뉴스 중에 '은행'이 들어간 뉴스 검색을 한 url

 url =

 "https://search.daum.net/search?nil_suggest=btn&w=news&DA=SBC&q=%EC%9D%80%ED%

 96%89"

 

Daum에서 “은행”이라는 단어로 검색을 하고 뉴스 탭으로 이동을 했을 때, 나타나는 인터넷 주소를 크롬 브라우저에서 복사해 넣은 부분입니다. 웹 브라우저에서 주소를 보면 분명 “=은행”으로 끝이 나는데 주소를 전체 선택하고 붙여 넣기를 하면 위와 같이 %가 들어간 문자열로 표현이 됩니다. 이유는 웹은 영어를 표시하는 표준을 사용하기 때문입니다. 영어를 사용하는 표준을 이용해 한글을 표시하다보니 위와 같이 %로 시작하는 이상한 문자열로 나타나는 것입니다.

변수명은 url이라고 지정을 했습니다. url은 Uniform Resources Locator의 약자로 인터넷 주소, 인터넷에 있는 이미지 등의 위치를 표현하는 방법입니다. 이해하기 쉽게 url이라고 지정을 했습니다만 의미를 모르실 수 있을 것 같아 설명을 드립니다.

 

 html = requests.get(url).text

 soup = BeautifulSoup(html, "html.parser")

 

첫번째 줄에서는 requests 패키지에서 get() 함수를 이용해서 우리가 접속하고자 하는 주소를 주고, 그 주소에서 받은 HTML의 text만을 받아 html 변수에 넣어줍니다. 어떤 내용이 들어오는지를 알아보기 위해서는 첫번째 줄 다음에 print(html) 함수를 이용해서 어떤 정보들이 들어오는지 확인을 할 수 있습니다. 맨 뒤의 .text를 빼고 출력도 해 보시기 바랍니다.

주소를 넘겨서 받은 html text를 받았다면 HTML을 분석해주는 BeautifulSoup으로 넘겨서 분석한 값을 soup에서 받습니다. 

 

 links = soup.find_all("div", {"class": "wrap_cont"})

 

<div class=”wrap_cont”>가 뉴스를 모두 감싸고 있었고 그 안에 “<a href”라는 구문에 뉴스의 주소를 가지고 있었습니다. BeautifulSoup에서 분석해 놓은 soup에서 “div”

죠? 이 부분 아래를 가지고 와서 분석을 하면 됩니다. 텍스트와 주소를 가지고 오기 위해서는 HTML의 기본적인 것을 알아야 합니다. HTML은 주소를 나타내기 위해서 “<a href”로 시작을 합니다. div로 나뉘어져 있는 HTML의 내용 중에서 class 이름이 wrap_cont를 찾아서 모두 links 변수에 넣게 됩니다. 이렇게 find_all을 통해 HTML상에서의 문자열을 모두 쉽게 가져왔습니다. 그렇지 않으면 HTML을 일일이 우리가 분석을 하고 분석된 내용을 코딩으로 잘라내서 데이터를 찾아야 하는 번거로움이 있습니다. HTML을 모두 이해하고 있어야 분석을 할 수 있기 때문에 기본적인 HTML의 지식만 있어도 웹 페이지에서 정보를 가지고 올 수 있습니다. 

 

 for link in links:

title = link.find('a').text

addr = link.find('a')["href"]

print(title, ":", addr)

 

새로운 형태의 for문이 나와있습니다. 우리가 배운 for문은 range()를 이용해서 시작 숫자와 끝나는 숫자 그리고 증가하는 숫자를 넣어서 사용을 했습니다. for i in range(10)이라면 시작 숫자와 증가 숫자 0, 1이 각각 생략된 상태로 for i in range(0, 10, 1)과 같습니다. 이 경우에는 i가 0에서 시작해서 9까지 순차적으로 변경되며 for문 안에 있는 문장들을 실행하게 되죠.

그런데 여기서는 in 이라는 단어 다음에 links라는 변수를 넣어주고 있습니다. 보이는대로 추측을 해 보면 links안에 있는 것들을 순서대로 link에 넣으라는 의미입니다.  links에는 여러 개의 정보가 굴비처럼 엮어있다고 생각하시면 쉬울 것 같습니다. 각각 달려있는 것은 굴비가 아니라 BeautifulSoup이 분석해서 분류해 놓은 정보들이죠. 그래서 for문에서는 하나씩 순서대로 link에 넣어주는 것입니다. 참고로 엮어진 굴비는 ‘[‘와 ‘]’사이에 ‘,’로 구분되어 쭉 들어 있습니다.

다음은 for문 안에 들어 있는 title과 addr입니다. 인터넷을 검색하다보면 파이썬과 같이 밑줄이 그어진 단어가 있고 그 단어를 클릭하면 새로운 페이지로 이동을 하는 것을 많이 보셨죠? 여기서 파이썬이 text입니다. 그리고 이동하는 페이지의 주소가 addr입니다. for문 안에 들어 있는 두 줄이 바로 이 역할을 합니다. 

 

 

앞의 페이지는 HTML을 넣고 Run을 누르면 그 결과를 오른쪽에 볼 수 있는 HTML 학습 페이지 입니다. 제가 왼쪽에 테스트용으로 넣은 것은 다음과 같습니다.

 

https://sohyemin.tistory.com>파이썬

 

파이썬을 누르면 해당 블로그로 이동을 합니다. 이 문장을 보면 for문 안의 두 문장이 쉽게 이해가 되실 것 같습니다. a로 시작하는 text는 <a>와 </a> 사이의 문장이고 href를 찾으면 = 다음에 오는 주소를 이야기 하는 것입니다.

 

다음의 코드는 무슨일을 하는 코드일까요?

 

014_webCrawling2.py

 

실행을 시켜보시면 정확한 내용을 아실 수 있을텐데요. 바로 멜론에서 50위까지의 순위를 출력시켜주는 웹 크롤링 코드입니다. 

 

처음엔 웹 크롤링을 통해 많은 정보들을 접할 수 있을 것으로 예상을 했고 그 유용한 정보들을 이용해서 재미있는 프로그램들을 만들 것이라고 기대 했습니다. 하지만 적어도 제 기준에서는 웹은 너무도 빠르게 변하는 세상이었습니다. HTML이 그리 쉽지도 않았습니다. 웹을 전문적으로 다룬다면 모를까 적어도 제가 느끼기엔 참 어려운 분야라는 생각을 했습니다. 유튜브를 검색해보면 참 많은 웹크롤링 강좌들이 있는데 주로 연예인 사진들을 다운로드 받는 등의 간단한 것들이 주를 이뤘습니다. 그래서 나름대로 내린 결론은 웹크롤링은 전문가에게 맡기자는 것이었습니다. 그런데 왜 하나의 챕터를 할애해서 웹 크롤링을 설명했는지 나중에 만들어 볼 프로그램에 대해서 스포를 하고자 합니다. 

파이썬 패키지 중에서 구글 뉴스를 크롤링 해 주는 패키지를 찾았습니다. 이 친구를 이용해서 관심 분야의 24시간 동안의 영문 뉴스를 검색합니다. 그리고 챗GPT를 이용해서 영문 뉴스를 한글로 요약합니다. 이렇게 요약한 영문 뉴스를 제목과 링크를 매일 일정 시간에 이메일로 보내주는 프로그램을 만들어 보려고 합니다. 우리가 만들 프로젝트 중의 하나입니다. 



반응형

'IT' 카테고리의 다른 글

파이썬 - 마우스와 키보드  (0) 2025.01.30
파이썬 프로젝트 - Google News  (0) 2025.01.30
깃헙 - GitHub  (0) 2025.01.30
챗GPT를 이용하자! + 파이썬 프로그래밍 기초  (1) 2025.01.30
Openpyxl 첫 파이썬 레고블럭  (0) 2025.01.30