HTML(Hyper Text Markup Language) 혹은
XML(eXtensible Markup Language) 파일에서
데이터를 추출하도록 도와주는 파이썬 전용 라이브러리
즉, 웹 스크래핑 기술임.
(참고1) BeautifulSoup4 (4.9.1 버전)을 사용했다.
(참고2) html.parser가 아닌 lxml을 사용했다.
pip install lxml
(참고3) 웹 크롤링보단 웹 스크래핑이란 표현이 더 맞다고 생각한다.
BeautifulSoup 공식문서에서 lxml 사용을 권하고 있음
default는 (설치가 필요없는) html.parser
from bs4 import BeautifulSoup
2 from urllib.request import urlopen
3 import re
4 with urlopen("https://www.starbucks.co.kr/menu/drink_list.do") as starbucks:
5 soup = BeautifulSoup(starbucks, 'lxml')
6 title = soup.title
7 print(title)
결과
<title id="titleJoin">Starbucks Coffee Korea</title>
하지만, title
tag에 포함된 element
들이 함께 출력됐다.
즉, 의도한 웹스크래핑이 아닌 결과다.
따라서, '속성(attribute)'
을 통한 접근 방식을 취했다.
from bs4 import BeautifulSoup
2 from urllib.request import urlopen
3 import re
4 with urlopen("https://www.starbucks.co.kr/menu/drink_list.do") as starbucks:
5 soup = BeautifulSoup(starbucks, 'lxml')
6 title = soup.title.text
7 print(title)
결과
Starbucks Coffee Korea
다른 방식으로 div
tag에도 적용해본다면,
html 파일 중 첫 번째 div
tag 데이터만 가져오게 된다는 말이다.
가장 바깥 div
tag 안에 수많은 태그들로 파일이 구성됐다면,
내가 관심없는 태그들 정보도 받게 되는 상황이 벌어진다.
from bs4 import BeautifulSoup
2 from urllib.request import urlopen
3 import re
4 with urlopen("https://www.starbucks.co.kr/menu/drink_list.do") as starbucks:
5 soup = BeautifulSoup(starbucks, 'lxml')
6 title = soup.find('div', class_="product_list")
7 print(title)
div
tag이면서 class명이 product_list인 element들을 가져오게 했다.
주의할 점은 class 우측에 (언더스코어, 언더바)가 있어야 한다.
class
는 html에서만 사용되는 용어가 아니므로 파이썬에서 생각해낸 해결책이다.
개발자 도구
를 통해 html이어떤 tag들로 계층구조를 이루고 있는지
먼저 확인해야 한다.
(개인적으론, html 소스코드 부분을 우 클릭한 후 -> "Edit as HTMl"클릭 -> VSC에 빈 파일 생성 후 복사를 해서 확인하고 있다.)
- 내가 스크래핑하는 정보가 뭔지 확실히 하자.
사실 너무나도 당연한 말이다.
주어진 과제가 있다면, 별 생각없이 하게 된다. 하지만 직접해보면
다음(Daum) 검색어는 상위 몇 개만 할 것인지,
연령별 검색어를 간추려 스크래핑할 건지,
제주행 비행기표 가격과 시간은 어떤 날짜의 것으로 지정할 것인지등 스스로 사전에 정해야 한다.
- 찾으려는 정보(tag)들을 모두 포함하는 메타 tag를 먼저 찾자.
찾으려는 정보의 태그가 어떤 것인지만 금방 확인하고,
큰 범위에서 그 정보까지 다다르기 위해 범위를 좁혀나간다는 컨셉을 기억하자.
음료수가 p
tag와 어떤 attribute으로 구성됐구나 하고 확인후,
이 음료들은 nav
tag 및 berverage_list라는 class
안에
담겨있구나 하고 말이다. (계층구조 파악)
- 위의 두 과정이 끝나면, 원하는 데이터를 스크래핑하는 것은 시간문제다.
우리의 친구 soup
객체가 아주 편하게 도와줄 것이다.
물론, csv파일을 생성하고 어떻게 배열할지 또는 최종적으로는 어떤 자료구조로 구현할지는 맨 처음 단계에 미리 생각해둬야 한다.