홍카나의 공부방

[DE 데브코스] 04.19 TIL - Beautifulsoup, Locater, 알고리즘 문제 본문

Data Engineering/프로그래머스 데브코스

[DE 데브코스] 04.19 TIL - Beautifulsoup, Locater, 알고리즘 문제

홍문관카페나무 2023. 4. 19. 14:32

BeautifulSoup Library

  • response로 가져오는 HTML 문서를 parsing하는 파이썬의 라이브러리.
  • 주요 활용법 중 일부는 아래 코드로 소개한다.
  • 파고들면 파고들수록 사용할 수 있는 기능이 많은 라이브러리다. 이는 bs4 document 등을 참고하면 좋다.
import requests
from bs4 import BeautifulSoup

res = requests.get("https://www.example.com")

# 첫 번째 인자로 resquest의 body를 텍스트로 전달하기
# 두 번째 인자로 parser 종류 입력해주기
soup = BeautifulSoup(res.text, "html.parser")
print(soup.title)  # soup에 담긴 text중 title TAG 가져오기
print(soup.find("h1"))  # h1 요소를 하나 찾기 위하여 find method 사용
print(soup.find_all("meta"))  # 해당 태그로 감싸진 요소들 모두


# 원하는 요소 가져오기 예시

res = requests.get(
    "http://books.toscrape.com/catalogue/category/books/travel_2/index.html")
soup = BeautifulSoup(res.text, "html.parser")
s = soup.find_all("h3")

for i in s:
    print(i.a["title"]) # 태그의 속성을 딕셔너리 key처럼 활용

 

HTML Locater

  • 태그의 id와 class를 이용하여 요소를 가져오는 법을 알아보자. 역시나 코드 예시로 살펴본다.
import requests
from bs4 import BeautifulSoup
import time

res = requests.get(
    "http://books.toscrape.com/catalogue/category/books/sports-and-games_17/index.html")
soup = BeautifulSoup(res.text, "html.parser")

# class가 price_color인 요소를 찾는다.
# id로 찾을 때는 파라미터에 id= 를 붙이면 된다.
s = soup.find_all("p", "price_color")
for i in s:
    print(i.text[1:])


# https://qna.programmers.co.kr/ 질문 제목 가져오기 예시

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

for p in range(1, 6):
    res = requests.get(
        f'https://qna.programmers.co.kr/?page={p}', headers=headers)
    soup = BeautifulSoup(res.text, "html.parser")
    s = soup.find_all("li", "question-list-item")
    for q in s:
        print(q.find("div", "question").find("div", "top").h4.text)
    time.sleep(0.5)

 

정적 웹사이트와 동적 웹사이트

  • 정적 웹사이트는 HTML 내용이 사실상 고정되어있는 웹 사이트다. HTTP 요청을 할 때마다 서버가 똑같은 HTML을 가져다준다.
  • 동적 웹사이트는 HTML 내용이 동적인 웹 사이트다. 유튜브 메인 페이지 처럼 응답 이후 렌더링 되기까지 지연 시간을 가진다.
  • 그 이유는 비동기 처리 때문이다. 동기 처리 방식은 렌더링이 끝난 이후 데이터 처리가 동기적으로 진행 되는데
  • 비동기는 우선 응답 -> 데이터 처리 진행이 "비동기"적으로 진행된다. 즉 렌더링이 끝나지 않아도 데이터 처리를 같이 실행한다.
  • 요즘 웹 사이트들은 이런 비동기 처리를 하는 경우가 상당히 많다.
  • 다음 시간에 Selenium Library를 살펴보며 동적 웹사이트도 스크래핑 하는 방법을 알아본다.
  • 동기와 비동기는 이 글을 참고하면 이해에 도움될 수 있다. https://hongcana.tistory.com/37
 

[짤막 지식] 웹의 동작, 동기와 비동기

웹의 동작 방식과 동기/비동기 방식이 뭔지 이해해보자. 우선, 웹의 동작 방식은 위 그림으로 쉽게 이해할 수 있다. 먼저 웹 클라이언트가 웹 서버로 Request를 보내면, 웹 서버에서는 요청에 대한

hongcana.tistory.com

 

오늘도..

  • 오늘 수업 진도도 코어 타임 동안 충분히 학습하고도 남을 분량이라, 남는 시간엔 알고리즘 문제를 풀었다.
  • 오늘 해결한 문제는 다음과 같다. https://www.acmicpc.net/problem/7562
 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

  • 굉장히 쉬운 BFS 문제다.

 

 

  • https://school.programmers.co.kr/learn/courses/30/lessons/43164 DFS 하나 팼다.
  • 스택을 이용해서 풀었다.
  • 이거는 예전에 프로그래머스 스쿨에서 풀었던 문제인데, 역시 다시 보니까 까먹고 완벽하게 풀이 및 접근하지 못했다.
  • 내 기억력이 완벽함을 바랄 수 없는 법.. 다시 복습하고, 다시 풀었다.

 

  • https://school.programmers.co.kr/learn/courses/30/lessons/42885 그리디 문제 하나 풀었다.
  • level 2이고, 백준 체감으로는 실버 1~3 정도 되는 문제인듯하다.
  • 문제를 읽고 그리디 인가 생각했는데, 단순하게 그리디로 접근하면 풀리지 않는 문제다.
  • 약간의 투 포인터 접근 방식을 섞어준다면 풀 수 있는 문제다.

 

 

 

 

오늘 공부하며 어려웠던 내용

  • 수업 내용에서는 없었고 코테에서 대부분 어려움을 느꼈다.
  • 코테 문제 풀이를 도중에 1주일 정도 쉬었다가 다시 돌아온 것 때문인지, 골드 이상 문제는 접근법 자체를 생각하기가 어려웠다.
  • 그래서 실버 문제로 재활을 했다지만, 골드 이상의 문제를 어렵게 느끼므로 도전해야할 필요가 있다.
  • 특히 이분 탐색은 내가 실버 문제도 풀이법을 빠르게 생각하지 못하므로 난이도를 굳이 높게 가져갈 필요가 없다.
  • DFS/BFS는 쉬운 난이도의 경우 충분히 해결법을 떠올릴만큼 익숙해진것 같으므로 골드 이상의 문제를 도전할 필요가 있다.

 

반응형