LG U+ Why Not SW CAMP 7기 12주차 회고
Liked
- 실제로 버튼 클릭, 입력창 전송, 링크 클릭 후
driver.back() 등 브라우저 내에서의 행동을 자동화하는 느낌이 직관적이었다.
implicitly_wait, WebDriverWait을 통해 단순 sleep()보다 훨씬 유연한 대기 처리를 이해하게 된 점
- HTTP 메서드별 목적과 구조 정리는 추후 API 테스트나 크롤링할 때도 큰 도움이 될 거라 느꼈다.
- 웹툰 정보 전체 흐름(목록 → 상세 → 저장)을 처음부터 끝까지 스스로 구현한 실습 경험 자체가 의미 있었음.
드라이버 껐다 켰다 하지 않기, driver.current_url로 로그인 감지하기 등의 트러블슈팅을 적용해봤던 점이 좋았음.
- 연령 정보 추출을
글자 그대로 가져오기로 단순화한 게 정확도와 속도를 동시에 챙긴 선택이라고 생각.
- 크롤링하면서 발생하는 오류도 예외처리로
오류 발생이라 명시해둔 점이 안정적인 데이터 수집에 도움됨.
Learned
webdriver.Chrome()객체를 사용해 브라우저를 자동으로 실행하고 유지하는 방법
find_element, find_elements의 차이와 요소 탐색 방식 (by='id', 'name', 'css selector', 'link text' 등)
- HTML 태그 구조를 기반으로 요소를 추적하고 값을 입력하고 클릭하는 방법
send_keys()를 통해 실제 사용자처럼 폼 전송을 자동화하는 흐름
implicitly_wait vs WebDriverWait을 통한 동기 vs 비동기 로딩 대기 처리
requests로 단순 HTTP 요청을 보낼 수 있지만 비동기 로딩된 데이터는 Selenium으로만 처리 가능하다는 개념적 차이 확인
- HTTP 메서드(GET, POST, PUT, PATCH)의 용도와 전송 방식
Selenium과 BeautifulSoup을 함께 사용하여 동적 웹페이지에서 정보를 수집!
- 상세페이지로 자동 이동할 때 로그인 페이지로 리디렉션되는 경우 URL을 통해 감지하는 방법을 적용해봄.
.select_one().next_sibling.strip()을 활용하면 태그에서 연령등급 같은 정보를 자연스럽게 추출할 수 있다는 걸 배움 (형제 태그에 적용이 된다고 함).
DataFrame.itertuples()을 사용해서 pymysql과 함께 MySQL에 효율적으로 데이터를 삽입하는 방법을 익힘.
- 크롤링한 데이터를 DataFrame → CSV → MySQL로 이어지는 흐름으로 처리하면서 데이터 파이프라인 감각을 배움.
- Docker의 전체 구조와 흐름을 처음부터 따라가며 이해하려 노력했다.
- 컨테이너는 마치 독립된 가상 머신처럼 동작하지만 훨씬 가볍고 빠르며 그 핵심은 이미지 기반 실행이라는 것을 알게 됐다.
- Ubuntu에서 Docker를 설치하는 과정을 직접 따라가며 GPG 키, 저장소 등록, 패키지 설치의 개념을 배웠다.
- Nginx 웹 서버를 도커 컨테이너로 띄우고 실제 브라우저로 접근하는 실습을 했다.
- IP, 포트, 호스트 이름, DNS 등 네트워크 통신의 기초 개념에 대해 정리했다. 단순히 주소만 있는 게 아니라 포트가 어떤 프로그램인지 지정해주는 역할이라는 것도 알았다.
Lacked
- Selenium과 Requests의 역할 구분은 배웠지만, 실제로 어떤 사이트가 비동기인지 아닌지를 직접 판별하고 선택하는 능력은 부족하다고 느낌.
- 알아낸 것만으로 만족하고 넘겨버린 태도
- 코드가 돌아가면 됐지하고 다음으로 넘어간 경우가 있었음.
- 왜 그런 방식이 더 좋은지, 예외 상황에선 어떻게 될지까지 고민해보는 깊이가 부족했다고 느낌
- 페이지 로딩이 느릴 경우
WebDriverWait이 아닌 time.sleep()만 사용한 점이 비효율적일 수 있음.
- Selenium으로 여러 링크를 열 때 브라우저 창이 안 뜨는 현상이 있었고 원인을 명확히 파악하진 못했음.
- 원하는 요소를 제대로 가져오지 못하는 경우가 꽤 있었음.
컨테이너랑 내 컴퓨터랑 포트를 어떻게 연결하는지, 호스트네임이 뭐고, IP는 뭘 쓰는 건지 이런 기본 개념이 아직도 좀 헷갈린다. 단어가 너무 생소해서 명확하게 구분이 안 된다. 내 로컬 IP가 뭔지 컨테이너 내부 IP가 뭔지처럼…?
docker volume 개념도, 그냥 v 옵션을 쓰면 되는 줄 알았는데 빈 디렉토리일 때만 제대로 작동한다는 조건이 있다는 게 처음엔 이해가 안 됐다. 실습해보고 덮어쓰기 되는 걸 눈으로 보니까 알겠는데 아직도 왜 그런지 납득되진 않았다.
- GitHub에 올릴 때는 또 인증이 안 되고 충돌이 나고,
pull, push, merge가 계속 오류나서 정신이 없었다. 토큰 로그인, 브랜치 이름 문제, 리드미 병합 충돌... 진짜 혼란 그 자체였다.
Longed For
- 공모전에서 써먹을 수 있는 자동화 파이프라인을 직접 만들어보고 싶다
- 데이터를 주는 곳은 많은데 수집, 정제, 저장까지 자동화되면 시간도 아끼고 완성도도 높아질 것 같다.
- 요즘 너무 졸리고 머리도 자주 아프고..
- 하고 싶은 건 많은데 몸이 따라주지 않을 때는…… 리듬 잘 챙겨야겠다…!
- 아침에 자동으로 날씨 크롤링해서 슬랙 정도?로 알려주는 봇 만들어보고 싶다
- 실제 생활에 딱 붙는 자동화일 것 같고 친구들이랑 공유하면 뭔가 뿌듯할 것 같음 ㅎㅎ