[데이터 엔지니어링 데브코스] TIL 8일차 - 파이썬으로 웹다루기(3)

박단이·2023년 10월 25일
0

데브코스 TIL

목록 보기
7/56

오늘 공부한 내용🤓

  1. BeatifulSoup4
    • requests 모듈을 사용해서 페이지의 내용을 긁어왔지만 원하는 태그의 내용까지 긁어오기엔 힘들었다. 이를 해결하기 위해 BeatifulSoup4 모듈을 사용한다.
    • 페이지네이션 되어있는 페이지의 경우 page의 정보가 url로 변경된다면 page만큼 request를 보내서 처리한다.
      단, 과도하게 자주, 많이 요청을 보낸다면 서버에 무리가 갈 수 있으므로 time.sleep()을 사용한다.
# 필요한 라이브러리 import
import requests
from bs4 import BeatifulSoup

# 웹 페이지 파싱
## requests.get()의 두 번째 인자는 header에 들어갈 내용. 
## 지정해주고 싶은 header를 객체로 작성하여 넘겨준다.
res = requests.get('url', user_urgent)

## BeatifulSoup 첫 번째 인자에는 requests로 받아온 body를 넘겨준다.
## 두 번째 인자는 html을 파싱하는 것이라고 명시해야한다.
## why? xml과 같은 다른 마크업 언어도 파싱해주기 때문
soup = BeatifulSoup(res.text, 'html.parser')

# 태그로 감싸진 요소 찾기
soup.find('p')   # p 태그 중 가장 첫 번째 내용만 반환
## >> <p> ~~~ </p>
soup.find_all('p')  # 모든 p 태그의 내용을 리스트로 묶어서 반환
## >> [<p> ~~~ </p>, <p> ~~~ </p>, <p> ~~~ </p>, ...]


# 태그 이름과 내용 가져오기
## <p> 안녕 </p> 이 있다고 가정
p = soup.find('p')
p.name
## >> 'p'
p.text
## >> '안녕'


# 태그 안에 속성의 값 가져오기
## <div title="제목"> 안녕 </div> 이 있다고 가정
div = soup.find('div')
div["title"]
## >> '제목'


# 특정 id, class의 내용 가져오기
## <div id="hi"> 안녕 </div>
## <li class="many-list"> ~~~ </li> 가 있다고 가정

soup.find("div", id="hi")
## >> <div id="hi"> 안녕 </div>
soup.find("li", "many-list")
## >> <li class="many-list"> ~~~ </li>
  1. 정적 웹 페이지 vs 동적 웹 페이지
    • 정적(static) 웹 페이지
      • HTML 내용이 고정적이다.
      • 같은 주소에 항상 같은 내용을 담고 있다. ex) 책, 사전
        => HTML 문서가 완전하게 응답한다.
    • 동적(dynamic) 웹 페이지
      • HTML 내용이 변경된다.
      • 같은 주소에 다른 내용을 담고 있다. ex) 인스타그램, 유투브
      • 응답 후 HTML이 렌더링 될 때까지 지연 시간이 존재한다.
        => request 후 내용이 변경될 수 있다.
    • 웹 브라우저에선 JavaScript라는 언어가 동작하는데 이 언어를 통해 동적인 웹페이지에 비동기 처리를 하여 데이터를 채운다.
    • requests 요청 시 동적 웹 사이트에 적용이 어렵고, UI 상호 작용이 어렵기 때문에 이를 해결하기 위해 Selenium이라는 웹 브라우저 자동화하는 라이브러리를 사용한다.

느낀 점😊

오랜만에 보는 BS4 라이브러리가 반갑게 느껴졌다.
오늘 배운 간단한 메소드를 제외하고 더 간편하게 사용할 수 있는 메소드들이 많았던 것 같은데 따로 정리하는 시간을 가지는 것도 좋을 것 같다.

Stack에 대해 글을 정리했는데 후위 표현식 전환하는 과정이 재미있었다. stack을 적용하는 다른 상황들도 풀어보고 싶다.


profile
데이터 엔지니어를 꿈꾸는 주니어 입니다!

0개의 댓글