[wecode 11일차] 웹 스크랩링 - 1

hyuckhoon.ko·2020년 6월 4일
0

What I learned in wecode

목록 보기
43/109

1. BeautifulSoup

1) 정의

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





2) 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.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

원하는 결과가 나왔다. 하지만 위 접근방식에도 문제가 있다. 웹 스크래핑을 하려는데, html 파일의 첫 title만 가져올 수 있다.

다른 방식으로 div tag에도 적용해본다면,
html 파일 중 첫 번째 div tag 데이터만 가져오게 된다는 말이다.
가장 바깥 div tag 안에 수많은 태그들로 파일이 구성됐다면,
내가 관심없는 태그들 정보도 받게 되는 상황이 벌어진다.



3. find 메소드 활용하기

 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)

divtag이면서 class명이 product_list인 element들을 가져오게 했다.
주의할 점은 class 우측에 (언더스코어, 언더바)가 있어야 한다.
class는 html에서만 사용되는 용어가 아니므로 파이썬에서 생각해낸 해결책이다.



개발자 도구를 통해 html이 어떤 tag들로 계층구조를 이루고 있는지
먼저 확인해야 한다.

(개인적으론, html 소스코드 부분을 우 클릭한 후 -> "Edit as HTMl"클릭 -> VSC에 빈 파일 생성 후 복사를 해서 확인하고 있다.)



4. find_all 메소드 활용하기

5. 실습 및 연습을 해보며 느낀점

  1. 내가 스크래핑하는 정보가 뭔지 확실히 하자.

사실 너무나도 당연한 말이다.
주어진 과제가 있다면, 별 생각없이 하게 된다. 하지만 직접해보면
다음(Daum) 검색어는 상위 몇 개만 할 것인지,
연령별 검색어를 간추려 스크래핑할 건지,
제주행 비행기표 가격과 시간은 어떤 날짜의 것으로 지정할 것인지등 스스로 사전에 정해야 한다.

  1. 찾으려는 정보(tag)들을 모두 포함하는 메타 tag를 먼저 찾자.

찾으려는 정보의 태그가 어떤 것인지만 금방 확인하고,
큰 범위에서 그 정보까지 다다르기 위해 범위를 좁혀나간다는 컨셉을 기억하자.
음료수가 p tag와 어떤 attribute으로 구성됐구나 하고 확인후,
이 음료들은 navtag 및 berverage_list라는 class안에
담겨있구나 하고 말이다. (계층구조 파악)

  1. 위의 두 과정이 끝나면, 원하는 데이터를 스크래핑하는 것은 시간문제다.

우리의 친구 soup객체가 아주 편하게 도와줄 것이다.

물론, csv파일을 생성하고 어떻게 배열할지 또는 최종적으로는 어떤 자료구조로 구현할지는 맨 처음 단계에 미리 생각해둬야 한다.

0개의 댓글