Today I Learned (2024-07-12) 🤔
목차
오늘 공부한 내용 🧑🏻💻
요약
1. 인프런(나도코딩) 🌱
init
__init__
은 클래스 생성자(constructor) 메서드이다. 참고사이트- 클래스의 인스턴스가 생성될 때 자동으로 호출된다.
- 인스턴스가 생성될 때 초기화 하는 작업을 한다.
멤버 변수
어떤 클래스 내에서 정의된 변수
🚨 파이썬에서는 어떤 객체의 변수를 추가로 외부에서 만들 수 있다(?) ?🤔 이왜진?
예시 코드
class Unit: def __init__(self, name, hp, damage): self.name = name self.hp = hp self.damage = damage print(f"{name} 유닛이 생성 되었습니다.") print(f"체력 {hp}, 공격력 {damage}") # 레이스 : 공중 유닛, 비행기, 클로킹 (상대방에게 보이지 않음) wraith1 = Unit("레이스", 80, 5) # . 을 찍어서 멤버변수에 접근한다. print("유닛 이름 : {0}, 공격력 {1}".format(wraith1.name, wraith1.damage)) # 마인드 컨트롤 : 상대방 유닛을 내 것으로 만드는 것 (빼앗음) wraith2 = Unit("빼앗은 레이스", 80, 5) # 파이썬에서는 어떤 객체의 추가로 변수를 외부에서 만들어 쓸 수 있다. wraith2.clocking = True if wraith2.clocking == True: print("{0}는 현재 클로킹 상태입니다.".format(wraith2.name)) # 아래의 코드는 에러가 발생한다. # 왜냐하면 wraith1 에서는 clocking 이라는 멤버변수가 없기 때문이다. #if wraith1.clcoking == True: # print("{0}는 현재 클로킹 상태입니다.".format(wraith1.name))
2. KDT
1) ActionChains
ActionChains(WebDriver)
웹 페이지에 대해 마우스 및 키보드 동작에 대한 객체
수행할 수 있는 상호작용 목록
- 마우스 : 클릭, 더블 클릭, 우클릭, 클릭 후 홀드 등
- 키보드 : 키 입력, 키 누름 유지 등
2) 스크롤 내리기
지연 로딩(Lazy Loading)
- 웹 페이지 초기에 불러올 때 모든 데이터를 한 번에 불러오지 않고, 사용자의 동작에 따라 동적으로 불러오는 기술
- 지연 로딩 장점
- 빠른 초기 로딩 : 초기 페이지 로딩 시 필요한 콘텐츠만 불러오기 떄문에 빠르게 로딩이 가능하다.
- 리소스 감소 : 초기 사용하는 리소스(자원)이 적기 때문에 서버에 가해지는 부하가 감소한다.
- 데이터 사용 감소 : 초기 사용하는 데이터량이 적기 떄문에 모바일 또는 느린 인터넷 환경의 사용자에게 유리하다.
웹 페이지 스크롤 내리기
키보드의 페이지 다운 키를 활용해 웹 페이지를 스크롤 다운한다.
예시 코드
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.action_chains import ActionChains import time # 스크롤 다운 입력 대기 시간 (너무 빠르거나 없으면 입력이 씹혀버린다.) scroll_pause_time = 0.5 # 스크롤 다운 횟수 max_scroll_down_attempts = 10 # 검색어와 주소 search_keyword = "강아지" url = f"https://search.shopping.naver.com/search/all?query={search_keyword}" service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) # 암시적 대기 - 10초 driver.implicitly_wait(10) # 브라우저 열기 driver.get(url) # ActionChains 객체 생성 -> 마우스 또는 키보드 동작을 시키기 위한 객체 actions = ActionChains(driver) # 스크롤 다운 횟수만큼 for문 동작 for _ in range(max_scroll_down_attempts): # PAGE_DOWN 키를 사용하여 스크롤 다운 actions.send_keys(Keys.PAGE_DOWN).perform() # scroll_pause_time(초) 마다 스크롤 다운 수행 # 스크롤 다운 후 페이지 로딩을 위한 충분한 시간필요. # 위에서 설명했듯이 키를 무시하는 경우가 발생할 수 있기 때문이다. time.sleep(scroll_pause_time) # 모든 동작이 끝나면 브라우저를 닫는다. driver.quit()
스크롤 내리기와 복수 요소 탐색
스크롤을 내리고 요소를 찾아보자~
예시 코드
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.action_chains import ActionChains import time # 요소를 찾기 위해 By 를 임포트해준다. from selenium.webdriver.common.by import By # 스크롤 다운 입력 대기 시간 (너무 빠르거나 없으면 입력이 씹혀버린다.) scroll_pause_time = 0.5 # 스크롤 다운 횟수 max_scroll_down_attempts = 10 # 검색어와 주소 search_keyword = "강아지" url = f"https://search.shopping.naver.com/search/all?query={search_keyword}" service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) # 암시적 대기 - 10초 driver.implicitly_wait(10) driver.get(url) # ActionChains 객체 생성 -> 마우스 또는 키보드 동작을 시키기 위한 객체 actions = ActionChains(driver) # 스크롤 다운 횟수만큼 for문 동작 for _ in range(max_scroll_down_attempts): # PAGE_DOWN 키를 사용하여 스크롤 다운 actions.send_keys(Keys.PAGE_DOWN).perform() # scroll_pause_time(초) 마다 스크롤 다운 수행 # 스크롤 다운 후 페이지 로딩을 위한 충분한 시간필요. # 위에서 설명했듯이 키를 무시하는 경우가 발생할 수 있기 때문이다. time.sleep(scroll_pause_time) # 여기서부터 요소 찾기 # 제품 정보를 가지고 있는 영역이다. items = driver.find_elements(By.CLASS_NAME,"product_info_area__xxCTi") product_list = [] for item in items: title = item.find_element(By.CLASS_NAME,"product_link__TrAac").text # 제품 이름 price = item.find_element(By.CLASS_NAME,"price_num__S2p_v").text # 제품 가격 grade = item.find_element(By.CLASS_NAME, "product_grade__IzyU3").text # 제품 별점 grade = grade.replace("\n"," - ") product = { "제품 이름" : title, "제품 가격" : price, "⭐️" : grade } product_list.append(product) print(f"제품 이름 : {title}, 가격 : {price}, {grade}") # 모든 동작이 끝나면 브라우저를 닫는다. driver.quit()
CSS SELECTOR 활용하기
CSS SELECTOR란
HTML 문서 내에서 특정 요소를 선택하기 위한 CSS 고유 문법
태그 이름, 아이디(id), 클래스(class)에 대해 선택할 수 있다.
- 태그 선택자 : 태그명
- 클래스 선택자 : .클래스명
- 아이디 선택자 : #아이디명
예시 코드
# p 태그 선택자 driver.find_elements(By.CSS_SELECTOR, "p") # p 태그, class="class-1" 선택자 driver.find_elements(By.CSS_SELECTOR, "p.class-1") # p 태그, class="class-1 class-2" 선택자 driver.find_elements(By.CSS_SELECTOR, "p.class-1.class-2") # p 태그, id="p-id" 선택자 driver.find_elements(By.CSS_SELECTOR, "p#p-id")
JSON 데이터 저장
JSON(JavaScript Object Notation)
데이터란?- JavaScript 객체 문법에 따르는 텍스트 기반 데이터 형식
- JavaScript 문법을 따르는 데이터 형식이지만 파이썬과 호환되고, 간단하고 읽기 쉬운 형식이기 때문에 많이 활용한다.
- 파이썬에서는 import json 으로 모듈을 임포트해서 JSON 파일을 쓰기, 읽기를 할 수 있다.
파이썬 객체 JSON 문자열로 변환
파이썬 객체 → JSON 문자열
파이썬 객체(숫자형, 문자열, 리스트, 딕셔너리 등)를 JSON 문자열로 변환한다.
json.dumps(데이터)
예시 코드
# import json 을 하여 json 객체를 사용할 수 있도록 한다. import json person = { "이름":'홍길동', "나이":25, "사는 곳":"지구 어딘가" } json_string = json.dumps(person) print(json_string) print(type(json_string))
{"\uc774\ub984": "\ud64d\uae38\ub3d9", "\ub098\uc774": 25, "\uc0ac\ub294 \uacf3": "\uc9c0\uad6c \uc5b4\ub518\uac00"} <class 'str'> # 문자열이 제대로 출력되지 않는다. # 하지만 타입은 문자열이다. # 이 문제는 아래에서 설명하겠다.
JSON 문자열을 파이썬 객체로 변환
JSON 문자열 -> 파이썬 객체
json.loads(json)
예시 코드
# import json 을 하여 json 객체를 사용할 수 있도록 한다. import json person = { "이름":'홍길동', "나이":25, "사는 곳":"지구 어딘가" } # 파이썬 객체 -> JSON 문자열 json_string = json.dumps(person) # JSON 문자열 -> 파이썬 객체 python_data = json.loads(json_string) print(python_data) print(type(python_data))
{'이름': '홍길동', '나이': 25, '사는 곳': '지구 어딘가'} <class 'dict'> # 앞에서 만든 person 이라는 데이터를 잘 불러온다. # 불러온 데이터 타입은 dictionary 이다.
파이썬 객체 JSON 문자열로 변환 후 파일로 저장
파이썬 객체 → JSON 문자열 → .json 파일 저장
예시 코드
# import json 을 하여 json 객체를 사용할 수 있도록 한다. import json person = { "이름":'홍길동', "나이":25, "사는 곳":"지구 어딘가" } with open("person.json","w") as File: json.dump(person,File,indent=4,ensure_ascii=False)
JSON 파일을 파이썬 객체로 불러오기
.json 파일 -> JSON 문자열 -> 파이썬 객체
예시 코드
# import json 을 하여 json 객체를 사용할 수 있도록 한다. import json person = [] with open("person.json","r") as File: person = json.load(File) print(person)
{'이름': '홍길동', '나이': 25, '사는 곳': '지구 어딘가'}
3) 데이터 전처리
데이터 전처리란?
- 데이터를 분석 및 처리에 적합한 형태로 만드는 과정을 총칭한다. 참고 사이트
Numpy
러아브러리- Numpy란?
- 파이썬의 고성능 수치 계산 라이브러리
- 다양한 수학적 기능 제공
- Numpy 배열(ndarray)
- 파이썬 리스트보다 접근 속도가 빠르다
- 수학 연산을 위해 다양한 함수를 제공한다.
- 기존 배열에 새로운 값을 추가할 수 있다.
- Numpy란?
어려웠던 내용 📚
- 스크래핑 하는 것이 어려웠다. 그래서 실습문제 1번에서 막혔지만, 감을 찾고 2번은 금방 풀었다.
- 문제였던건, 내가 태그를 제대로 검색하지 못한 것과 너무 어렵게 풀려고 했다.
- 이를 해결하기 위해, 부모 요소부터 천천히 찾아서 내려갔다.
궁금한 내용과 부족한 내용 🙋🏻
- 넘파이이와 다음은 판다스를 배우는데 더 궁금해질 것 같다.
느낀 점 💡
- 인스턴스를 통해 인스턴스만 가지고 있는 멤버변수를 외부에서 만들 수 있다는게 내가 알던 프로그래밍 개념에서 벗어났다... 말도 안돼
- 역시 하루종일 수업을 들으니 쓸 내용이 너무 많다... 시간도 없다 하지만 한다.
'TIL > 2024.07' 카테고리의 다른 글
[TIL] 2024-07-20 (2) | 2024.07.21 |
---|---|
[TIL] 2024-07-19 (0) | 2024.07.20 |
[TIL] 2024-07-17 (0) | 2024.07.17 |
[TIL] 2024-07-16 (0) | 2024.07.17 |
[TIL] (2024-07-15) (0) | 2024.07.16 |
배움에 즐거움을 느끼는 마네의 데이터랩 이미지 출처 : https://www.instagram.com/hoseobiiiiiii._.0410/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!