[TIL 8일자] 데브코스 데이터엔지니어링

·2023년 4월 19일
0

데브코스

목록 보기
7/55
post-thumbnail
post-custom-banner

📚 오늘 공부한 내용

✔ 파이썬으로 웹 데이터를 크롤하고 분석하기 (3)

1. BeautifulSoup

  • HTML 코드를 분석해 주는 Python 라이브러리.
  • HTML Parser

1) BeautifulSoup 설치

#beautifulsoup4 라이브러리를 먼저 설치해 준다
%pip install bs4

2) BeautifulSoup 객체 만들기

  • 먼저 요청을 보내고 응답을 받는다.
# www.example.com 사이트를 요청한 후 응답 받아보기
import requests

res = requests.get("http://www.example.com")
res.text
  • 이렇게 받은 객체를 그대로 사용하지 않고 HTML Parser에게 전달한다.
from bs4 import BeautifulSoup

# 첫번째 인자로는 response의 body를 텍스트를 전달.
# BeutifulSoup은 다른 마크업 언어도 파싱해 주기 때문에 어떤 언어를 쓸지를 두 번째 인자로 명시.
soup = BeautifulSoup(res.text, "html.parser")

# 객체 soup의 .prettify()를 활용하면 분석된 HTML을 보기 편하게 반환.
print(soup.prettify())

3) BeutifulSoup을 통해 원하는 데이터를 추출하기

  • 위에서 우리는 soup이라는 HTML Parser를 통해 Parsing된 객체를 만들었다.
  • 우리는 HTML의 특정 부분(찾고자 하는 부분)을 추출할 수 있게 된다.
# title 가져오기
soup.title

# head 가져오기
soup.head

# body 가져오기
soup.body

# 요소 하나 찾기 (찾고자 하는 태그의 이름 중 제일 처음 나오는 하나만 추출)
# find("찾고자 하는 태그 이름")
h1 = soup.find("h1")

# 태그로 감싸진 요소들 찾기
# find와 달리 찾고자 하는 태그의 모든 요소를 추출한다.
# find_all("찾고자 하는 태그 이름")
soup.find_all("p")

# 특정 요소의 태그 이름을 알고 싶을 때
h1.name

# 특정 요소의 태그 내용을 알고 싶을 때
h1.text

2. 콘텐츠 기반으로 스크래핑

  • 특정 태그를 세팅해서 스크래핑 하는 방법은 간단하고 직관적이다.
  • 하지만 페이지가 변할 수도 있기 때문에 가장 좋지 않은 방법이기도 하다.
  • 크롬에서 개발자 도구(F12)를 통해 찾고자 하는 태그의 위치를 파악할 수 있고, 역으로 찾고자 하는 곳을 우 클릭하여 검사를 누르면 찾고자 하는 태그의 위치를 찾아 준다.
  • 이 태그를 추출하기 위해서는 어떤 태그를 가지고 와야 하는가에 대한 고민이 필요하다.
    💻실습 정리-1.특정 웹 페이지 원하는 요소 추출

3. HTML의 Locator로 원하는 요소 찾기

  • tagname: 태그의 이름.
  • id: 단 하나의 고유 태그를 가리키는 라벨.
  • class: 두 개 이상의 유사한 태그가 묶을 때 사용하는 라벨. 같은 스타일이나 이벤트를 적용하기 위해.
  • 사실 태그 이름으로만 검색하는 것은 굉장히 안 좋은 방법이다. class나 id name과 함께 검색하는 것이 정확한 데이터를 볼 수 있기 때문에 더 좋다.
  • id 혹은 class로 찾기 위해서는 .find("tagname", id="id name"), .find("div", "class name")과 같은 방법으로 찾아 준다.
#id로 찾기
soup.find("div", id = "results")

#class 찾기 (class는 id와 달리 class=""라고 따로 지정해 주지 않고 class name을 사용하면 된다.
find_result = soup.find("div", "page-header") 

#class의 정보를 더 보기 편하게 하기 위해 strip을 사용해 준다. (여백 제거)
find_result.h1.text.strip()

#output
#'Example web scraping website'

4. BeautifulSoup을 통해 Hashcode 질문 내용 스크래핑

💻실습 정리-2.페이지네이션 된 페이지의 원하는 요소 추출

5. 정적 웹 페이지와 동적 웹 페이지

1) 정적(static) 웹 사이트

  • HTML 내용이 고정된 웹 사이트. HTML 문서가 완전하게 응답이 된다. 그래서 파싱에 대해 아무런 문제가 되지 않는다.

2) 동적(dynamic) 웹 사이트

  • HTML 내용이 변하는 웹 사이트. 응답이 된 후에 HTML이 렌더링 될 때까지의 지연 시간이 존재한다. 그 사이 HTML의 구조가 바뀔 수도 있으며 바로 파싱이 불가할 수도 있다. 즉, 동적인 사이트는 비동기 처리를 하기 때문에 비동기 처리된 후에 상황에 따라서 데이터가 완전하지 않은 경우도 발생할 수 있다.

    	* 동기 처리: 렌더링 후 데이터 처리를 한다.
    	* 비동기 처리: 요청에 따른 응답을 기다리지 않는다. 렌더링을 하는 과정에서 데이터 처리가 일어날 수도 있다. 

3) 동적인 웹사이트에서는 어떻게 데이터를 추출할 수 있을까?

  • 임의로 시간을 지연한 후 데이터 처리가 끝난 정보를 가지고 온다.
  • 키보드 입력이나 마우스 클릭 후에 프로그래밍을 한다면?
  • 웹 브라우저를 쓰고 이를 파이썬으로 조작하자.
  • Selenium은 웹 브라우저를 자동화하는 라이브러리로 해당 라이브러리를 통해 동적인 웹사이트의 데이터를 추출할 수 있다.
  • SeleniumUI상호작용도 가능하다.

🔎 어려웠던 내용 & 새로 알게 된 내용

1. pip 업그레이드
[notice] A new release of pip available: 22.3.1 -> 23.1
다음과 같은 문구로 업그레이드를 하라는 알림이 떴는데 막상 명령어를 입력하여 업그레이드를 하면 제대로 동작하지 않았다.

python -m pip  install --upgrade pip

알고 보니 명령어만 입력할 게 아니라 경로까지 입력해 주고 그 뒤에 다음과 같은 명령어가 들어가야 업데이트가 되었다.

내PC의 python경로\python.exe -m pip install --upgrade pip

Successfully installed pip -23.1(업데이트 버전)이 완료가 되면 마지막으로 버전을 확인해 주는 명령어를 입력하여 업그레이드과 완전히 됐는지 확인해 준다.

pip --version
#output pip 23.1 from C:\Users\pip위치(python 3.11)
다음과 같이 23.1 버전으로 pip이 업그레이드 된 것을 확인할 수 있다.

2. 사이트를 요청해 응답 받을 때 발생하는 MissingSchema 오류

import requests
res = requests.get("www.example.com")
res

MissingSchema: Invalid URL 'www.example.com': No scheme supplied. Perhaps you meant https://www.example.com?

  • www.example.com의 객체를 가지고 오는 명령어를 입력하였을 때 다음과 같은 오류가 발생하였다.
  • 이 원인은 https:// 혹은 http://를 붙이지 않아서 발생하는 오류이다.
  • get을 사용할 때는 이 부분을 유의하도록 하자.

✍ 회고

오늘은 정적인 웹 페이지의 특정한 요소들을 추출해 보았다. 실습에서 사용한 페이지가 아닌 평소 자주 사용했던 사이트들을 이용해서 복습해 보는 것도 좋을 것 같다는 생각을 했다. 내일 동적 웹 페이지의 원하는 요소들을 추출하는 것까지 학습한 후에 스크래핑 한 데이터들이 어떻게 적용이 되고 있는지 생각해 봐야 되겠다.

profile
송의 개발 LOG
post-custom-banner

0개의 댓글