이번엔 파이썬의 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 파일을 좀 더 깔끔하게 정리하기 위해 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파일을 조작해 활용해야 한다면 추가적인 메소드 사용이 필요합니다.
이에 대해선 향후 다시 소개하도록 하겠습니다.
추가적으로 질문이 있다면 댓글로 남겨주세요. 감사합니다!
'프로그래밍 > Python' 카테고리의 다른 글
[Python] 일별 timestamp 만들기 (0) | 2024.02.15 |
---|---|
[Python] Pandas보다 빠른 Polars (1) | 2023.07.08 |
[Python] 백그라운드에서 파이썬 코드 실행하기 (2) | 2021.08.29 |
[Python]파이썬으로 네이버 메일 보내기 (0) | 2021.08.23 |
[Python] YYYYMMDD 형태의 데이터를 날짜 데이터로 변환시키기 (0) | 2021.08.10 |
댓글