본문 바로가기
프로그래밍/Python

[Python] 파이썬으로 웹페이지 크롤링하기

by 쿼카퀀트 2021. 8. 15.
728x90

이번엔 파이썬의 requests와 beautifulsoup4 패키지를 활용해 웹페이지의 html을 불러와봅시다.

 

requests 패키지는 웹페이지와 파이썬을 연결해주는 역할을 하고, beautifulsoup4는 requests가 불러온 html을 손쉽게 수정/보완 가능하도록 만들어주는 패키지입니다.

 

구글 홈페이지 크롤링하기

먼저, pip으로 두 패키지를 설치해줍니다.

 

pip install requests beautifulsoup4

 

이제 파이썬을 실행시킨 후, 두 패키지를 import해옵니다.

 

import requests
from bs4 import BeautifulSoup as bs

 

구글의 홈페이지를 불러와, 그 페이지에 있는 내용들을 정리해봅시다. requests로 구글 페이지를 긁어온 다음, beautifulsoup로 이를 정리해 soup 변수에 넣어줍니다.

 

req = requests.get('https://www.google.com')
soup = bs(req.text)

 

soup 변수에 저장된 내용을 확인해보면, 아래와 같습니다. 뭔가 글자가 많아서 정신없네요.

구글 홈페이지의 html

 

여기까지 했으면 크롤링은 끝입니다. 엄청 간단하죠?

 

하지만, 저런 복잡한 텍스트 상태로는 아무것도 할 수 없겠죠ㅜㅠ 때문에 이런 html 파일을 좀 더 깔끔하게 정리하기 위해 beautifulsoup라는게 존재하는겁니다.

 

아래에선, beautifulsoup의 몇몇 기능들을 정리해보도록 하겠습니다.

 

 

필수적인 Beautiful Soup4의 기능

위에서 만든 soup 변수를 가지고 뭘 할수있는지, 크롤링의 기초적인 사용법에 대해 설명해보겠습니다.

 

1. get_text()

get_text는 복잡한 html 태그나 문법을 다 없애고, 웹페이지가 가진 텍스트 내용만을 추출하는 기능입니다.

 

soup.get_text()

 

이 코드를 돌리면, 아래처럼 구글 홈페이지에 존재하는 텍스트만을 전부 긁어옵니다.

이때, 그냥 get_text()를 한다면 서로 다른 텍스트박스에서 가져온 텍스트끼리 한 문장으로 엉켜있어 알아보기 되게 힘듭니다. 때문에, 각각의 텍스트 사이에 어떤 특정 문자열을 끼워넣어주면, 나중에 보기 더 편합니다. 아래처럼요.

 

soup.get_text("*****")

 

예시를 위해 일부러 눈에 잘 띄도록 별을 5개나 붙였지만(별이 다섯개!), 실제론 이렇게까지 할 필요 없습니다.

이제야 각 텍스트끼리 서로 잘 분리되어서 써먹기 더 편리하겠군요.

 

2. find_all()

html의 태그에는 body, div, p, span 등등 다양한 속성이 존재합니다. 이들 중 특정 태그만을 찾거나, 특정 태그 중에서도 특정한 id나 class를 가진 경우를 추출하기 위해 find_all()이 쓰입니다.

 

예를 들어, soup에서 div 태그를 가진 경우만 추출할땐, 아래와 같이 코드를 입력합니다.

 

soup.find_all('div')

 

결과물은 리스트로 전달됩니다.

즉, div 태그가 들어간 첫 번째 항목을 가져오기 위해선, 아래 코드처럼 입력합니다.

 

soup.find_all('div')[0]

 

그리고, div 중에서도 특정 class를 가진 경우만 찾기 위해선, 아래처럼 find_all에 두 번째 파라미터를 설정해 줍니다.

 

soup.find_all("div", {"class": "gb1"})

 

이렇게 하면, 구글 홈페이지에 존재하는 div 태그 중, class가 gb1인 경우만을 불러옵니다.

 

3. select()

select()는 find_all과 비슷한 기능을 합니다.

다만, 한 항목에 두 개의 클래스 a, b가 모두 포함된 경우만을 찾고 싶다면, select()를 사용해야 합니다. 이게 무슨 뜻이냐면, 만약

<div class="test1 test2"/> <div class="test1"> <div class="test2/>

라는 항목이 있다고 할 때, test1, test2가 모두 포함된 첫 번째 div만을 가져오고 싶을 경우 사용한다는 겁니다.

 

select()는 아래처럼 사용합니다.

 

soup.select('#test1#test2')

 

class의 경우엔 위 코드처럼 class 이름(test1, test2) 앞에 #을 붙이고, id인 경우엔 .을 붙입니다.

 

soup.select('.thisisid.anotherid')

 

find_all()과 마찬가지로, select()도 결과물을 list로 리턴합니다.

 

 

정리

여기까지가 requests와 beautifulsoup4를 사용해 웹페이지를 크롤링하는 방법입니다.

 

단순히 데이터를 사용할 목적이라면 위 코드처럼 html을 받아온 후 마음대로 조절하면 되겠지만, 정기 이메일 발송, 모니터링 등 html파일을 조작해 활용해야 한다면 추가적인 메소드 사용이 필요합니다.

 

이에 대해선 향후 다시 소개하도록 하겠습니다.

 

추가적으로 질문이 있다면 댓글로 남겨주세요. 감사합니다!

728x90

댓글