인터넷 사용자 간의 약속, HTTP
컴퓨터 한 대에서 Web까지
- 컴퓨터 존재
- 두 컴퓨터를 연결하는 "네트워크(Network)"의 탄생
- 네트워크를 묶어 근거리 지역 "네트워크(Local Area Network, LAN)" 탄생
- LAN을 묶어 범지구적으로 연결된 네트워크, "인터넷(Inter Network, Internet)" 탄생
- 웹이란 인터넷에서 정보를 교환할 수 있는 환경, "WWW(World Wide Web, Web)" 탄생
Web 상에서 정보를 주고받는 방법
- 클라이언트(Client) : 정보를 요청하는 컴퓨터
- 서버(Server) : 정보를 제공하는 컴퓨터
- 클라이언트가 서버에게 정보 요청
- 요청에 대해서 서버가 작업 수행
- 수행한 작업의 결과를 클라이언트에게 응답
HTTP(Hypertext Transfer Protocol)
- 프로토콜(Protocol) : 웹 상에서 정보를 주고받기 위한 약속
- HTTP Request : 클라이언트에서 서버로 정보를 요청하는 것
- HTTP Response : 요청된 정보에 대해 서버가 클라이언트에게 응답하는 것
- Request/Response에 대한 정보를 담는 Head와 내용물인 Body로 분리
HTTP Request 예시
GET / HTTP 1.1 - / 정보를 요청
Host: www.programmers.com - host에게 정보 요청
User-Agent: Mozilla/5.0 - 정보를 요청하는 사람
...
HTTP Response 예시
HTTP/1.1 200 OK - Request에 대한 응답
...
<html>...</html> - 요청한 정보(Body)
웹 페이지와 HTML
웹 사이트과 웹 페이지
- 웹 페이지 : 웹 속에 있는 HTML 형식의 문서 하나
- 웹 사이트 : 웹 페이지의 모음은 웹사이트
- 웹 브라우저 : HTML 요청을 보내고, HTTP 응답에 담긴 HTML 문서를 보기 쉬운 형태로 변환해 주는 역할
- 웹 브라우저마다 지원하는 HTML 태그와 속성이 다름
HTML 구조
- HTML(HyperText Markup Language) : 여러 태그(Tag)로 감싼 요소(Element)의 집합으로 이루어짐
- <!DOCTYPE html> : HTML5 임을 명시
- <html> : 가장 바깥에 <html> 태그로 감싸져 있음
- <head> : 문서에 대한 정보(제목, 언어 등)를 작성
- <body> : 문서의 내용(글, 이미지, 동영상 등)을 작성
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello world!</h1>
<p>Example</p>
</body>
</html>
Python을 이용한 HTTP 통신
- requests : Python을 이용해서 간단히 HTTP 통신을 진행할 수 있는 라이브러리
- local 환경의 경우 설치가 필요, colab에는 따로 설치해주지 않아도 됨
%pip install requests
정보 요청, GET
- 네이버에 GET 요청 및 Response Header, Body 확인
- text에는 매우 방대한 내용이 담겨 있음
import requests
res = requests.get("https://www.naver.com")
res # HTTP 응답이 담겨있음
# result : <Response [200]>
res.headers # header 확인
# result : {'Content-Type': 'text/html; charset=UTF-8', 'Cache-Control': 'no-cache, no-store, must-revalidate',
# 'Pragma': 'no-cache', 'x-frame-options': 'DENY', 'x-xss-protection': '1; mode=block',
# 'strict-transport-security': 'max-age=63072000; includeSubdomains', 'referrer-policy': 'unsafe-url',
# 'Content-Encoding': 'gzip', 'Server': 'nfront', 'Content-Length': '39038', 'Date': 'Tue, 02 Apr 2024 03:51:40 GMT',
# 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding'}
res.text[:100] # body 확인
# result : <!doctype html> <html lang="ko" class="fzoom"> <head> <meta charset="utf-8"> <meta name="Referrer
정보 갱신 요청, POST
- https://webhook.site 사이트를 활용하여 실습 진행
payload = {"name": "Hello", "age": 13}
res = requests.post("https://webhook.site/26328ae5-02d9-48c5-8718-1d9149e02f5d", payload)
res
# result : <Response [200]>
res.status_code
# result : 200
윤리적으로 웹 스크래핑/크롤링 진행하기
웹 스크래핑과 웹 크롤링
웹 스크래핑
- 웹 페이지들로부터 우리가 원하는 정보를 추출, 데이터 추출
- 특정한 목적으로 특정 웹 페이지에서 데이터를 추출하는 것
- 예시 : 날씨 / 주식 데이터 가져오기
웹 크롤링
- 크롤러(Crawler)를 이용해서 웹 페이지의 정보를 인덱싱
- URL을 타고다니며 반복적으로 데이터를 가져오는 과정, 데이터 색인
- 예시 : 검색 엔진의 웹 크롤러
올바르게 HTTP 요청하기
고려해야 할 것
- 웹 스크래핑/크롤링을 통해 어떤 목적을 달성하고자 하는가?
- 나의 웹 스크래핑/크롤링이 서버에 어떤 영향을 미치지는 않는가?
- 모든 사이트에 대해 모든 정보를 취득하는 것이 정당할까?
웹 스크래핑 시 원칙
- 요청하고자 하는 서버에 과도한 부하를 주지 않는다.
- 가져온 정보를 사용할 때, 저작권과 데이터베이스권에 위배되지 않는지 주의한다.
웹 사이트의 robots.txt 정책
- 로봇 배제 프로토콜(REP) : 로봇이 웹 브라우징을 할 수 있기에 정보 취득에 대한 규약 탄생
모든 User-agent에 대하여 접근 거부
User-agent: *
Disallow: /
모든 User-agent에 대하여 접근 허가
User-agent: *
Allow: /
특정 User-agent에 대하여 접근 허가
User-agent: MussgBot
Allow: /
robots.txt 확인
- robots.txt은 웹 페이지의 메인 주소에 '/robots.txt'를 입력하면 확인 가능
- 모든 User-agnet에 대해 접근 거부, 그러나 /$ 즉, 홈페이지에서만 허용
import requests
res = requests.get("https://www.naver.com/robots.txt")
print(res.text)
# result
# User-agent: *
# Disallow: /
# Allow: /$
웹 브라우저가 HTML을 다루는 방법
DOM(Document Object Model)
- 브라우저의 렌더링 엔진은 웹 문서를 로드 후 파싱 진행
- head와 body에 어떤 요소가 어디에 존재하는지 확인 가능
- 브라우저는 렌더링을 통해 DOM을 생성한 후에 "DOM 조작 = HTML 조작" 가능
- 파이썬을 사용하기 위해서는 파이썬으로 HTML을 분석하는 HTML Parser가 필요!
DOM의 장점
- 각 노드를 객체로 생각하면 문서를 편리하게 관리 가능
- 원하는 요소를 동적으로 변경할 수 있음
- 원하는 요소를 쉽게 찾을 수 있음
DOM Tree에 특정 원소 추가
var imgElement = document.createElement("img");
document.body.appendChild(imgElement);
DOM Tree에서 특정 원소 탐색
document.getElementsByTagName("h2")
결론
느낀 점
- 대학교 수업 시간에 다뤘던 HTTP가 등장해서 반가웠고, 필수적인 내용인 만큼 잘 알아둬야겠다는 생각이 듦
어려웠던 점
- DOM에 대해 가볍게 넘어가서 모든 내용을 이해하기에는 힘들었던 것 같음 - 추가 학습을 하면 좋을 것 같다!
참고링크
HTTP and HTTPS explained
https://study-ccna.com/http-https/
문서 객체 모델 DOM 과 자바스크립트 JavaScriptㅣ생성 방식 및 접근 방법
'[프로그래머스] 데이터 엔지니어링 데브코스 3기 > TIL(Today I Learn)' 카테고리의 다른 글
[TIL - 9일 차] 데이터 엔지니어링 : 파이썬으로 웹 데이터를 크롤하고 분석하기 (4) (0) | 2024.04.04 |
---|---|
[TIL - 8일 차] 데이터 엔지니어링 : 파이썬으로 웹 데이터를 크롤하고 분석하기 (3) (0) | 2024.04.03 |
[TIL - 6일 차] 데이터 엔지니어링 : 파이썬으로 웹 데이터를 크롤하고 분석하기 (1) (2) | 2024.04.01 |
[TIL - 5일 차] 데이터 엔지니어링 : 자료구조/알고리즘 풀기 (5) (0) | 2024.03.29 |
[TIL - 4일 차] 데이터 엔지니어링 : 자료구조/알고리즘 풀기 (4) (0) | 2024.03.28 |