Major Study/25-1 Web Crawling

[Web Crawling] HTTP

선경이 2025. 3. 29. 18:21

클라이언트와 서버

 

- 클라이언트 (Client) : 데이터나 서비스를 요청하는 프로그램

- 서버 (Server) : 클라이언트에 데이터나 서비스를 제공하는 프로그램 ex) 영상, 파일, 도메인, 전자우편

 

프로토콜

 

 

- 프로토콜 (Protocol) : 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계

-> 서버와 클라이언트가 데이터를 주고 받는 규약

ex) HTTP, HTTPS, SSH

 

HTTP 프로토콜

- HTTP(HyperText Transfer Protocool, 하이퍼본문전송규약)는 웹에서 정보를 주고받을 수 있는 프로토콜이다.

- 다른 문서도 주고 받을 수 있지만 주로 HTML 문서를 주고받는데 쓰이고 80번 포트를 기본으로 사용한다.

- 여기서 포트란 클라이언트의 요청을 받는 번호이다.

- HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다.

- HTTP를 통해 전달되는 자료는 http:로 시작하는 URL로 조회할 수 있다.

 

HTML (HyperText Markup Language)

- HTML은 웹페이지를 만드는 마크업 언어이다.

-  제목, 단락, 목록, 링크 등 구조적 문서를 만들 수 있는 방법을 제공한다.

 

HTTP Request Methods

요청 메소드 (Request Methods)

  • GET
    - 읽기 기능
    - 클라이언트가 서버에 데이터를 요청한다. 
  • POST
    - 쓰기 기능
    - 특정 데이터를 추가 할 것을 요청한다.
  • PUT
    - 수정 기능
    - 특정 데이터에 대해 수정할 것을 요청한다.
  • DELETE
    - 삭제 기능
    - 특정 데이터를 삭제할 것을 요청한다.

-> 실제 웹서버에서는 대부분 GET, POST를 통해 데이터를 요청한다.

 

HTT 프로토콜

HTTP 프로토콜을 이용한 웹페이지 접속

- 웹브라우저 (클라이언트)는 웹서버(서버)에 HTML 파일을 요청한다.

- GET 또는 POST 요청방식을 사용한다.

- URL을 이용하여 서버에 있는 받고 싶은 HTML 파일을 지정한다.

- 웹서버는 요청한 HTML 파일을 전송한다. (클라이언트의 80번 포트가 아니고 서버의 80번 포트에 전송한다.)

 

HTTP Status Code (응답 코드)

- 응답 코드란 서버가 클라이언트의 요청을 처리한 후, 클라이언트에 처리 결과를 알려주는 코드이다.

- 1xx : 조건부 응답
- 2xx : 성공

- 3xx : 리다이렉션 완료 (다른 주소로 이동)
           301/302 : 찾으려는 URL의 요소의 위치가 영구적으로 바뀐 경우

- 4xx : 요청 오류
          401/403 : 로그인을 안 했거나 접근 권한이 없는 경우

          404 : 해당 URL에 아무것도 없는 경우

- 5xx : 서버 오류

           500 : 서버의 오류

           502/503 : 서버 설정이 잘못 되었거나 일시적인 서버 다운

 

URL

- Uniform Resource Locator의 약자로 웹 상의 리소스 (문서,이미지,API)에 접근하기 위한 경로이자 주소이다.

 

https://www.example.com:8080/path/to/page?query=python&sort=desc#section2 

- http : 프로토콜 -> 통신 방식, http, https, ftp 등이 있다.

- www.example.com : 호스트 -> 서버 주소

- :8080 : 포트 번호 -> 통신에 사용하는 포트 (생략 시 기본값은 80/443이다)

- /page/to/page : 리소스경로 -> 서버 내부의 리소스 위치

- query=python&sort=desc : 쿼리 스트링 -> 요청에 필요한 파라미터들

- #section2 : 프래그먼트 -> 페이지 내 특정 위치 (브라우저 전용으로 서버에 전달 되지 않음)

 

쿼리 스트링

- 클라이언트가 요청할 때 보내는 추가적인 데이터(변수)이다.

- 리소스 경로와 쿼리 스트링은 '?'로 구분한다.

- 쿼리 스트링 안에서는 '&'으로 각각의 변수를 구분한다.

- 위 예시 : query 값으로 python, sort 값으로 desc를 할당하여 서버로 보냄

 

Header

헤더 (Hearder)

- 서버와 클라이언트 간에 데이터를 주고 받을 때, 헤더라는 정보를 포함해서 보낸다

- 요청 헤더 (Request header) : 클라이언트가 서버에 요청 할 때 포함되는 헤더

- 응답 헤더 (Response header) : 서버가 클라이언트의 요청에 응답 할 때 포함되는 헤더

 

헤더 정보

- 미디어의 종류, 인코딩(압축) 방법, 기본 URL, 쿠키 등 다양한 정보를 얻을 수 있다.

 

헤더 정보 보는 법

- [F12] - [Network] - [Name에 있는 엔티티 클릭] (크롬 브라우저 사용 예)

 

HTTPS (HTTP Secure)

HTTP + 암호화

- 도청, 변조, 위조 방지

- 데이터가 안전하게 전달 된다.

 

import request as rq
url = 'https://www.example.com/'

res = rq.get(url) # HTTP get 요청

print(res)
>>> <Response [200]>

print(res.status_code)
>>> 200

print(res.text) # 웹 서버로부터 받은 웹페이지 (HTML)
>>> 
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
print(res.headers) # 응답 헤더
>>> {'Accept-Ranges': 'bytes', 'Content-Type': 'text/html', 'ETag': '"84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134"', 'Last-Modified': 'Mon, 13 Jan 2025 20:11:20 GMT', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '648', 'Cache-Control': 'max-age=1762', 'Date': 'Sat, 29 Mar 2025 09:02:35 GMT', 'Alt-Svc': 'h3=":443"; ma=93600,h3-29=":443"; ma=93600,quic=":443"; ma=93600; v="43"', 'Connection': 'keep-alive'}

print(res.request.headers) # 요청 헤더
>>> {'User-Agent': 'python-requests/2.32.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

print(res.url)
>>> https://www.example.com/

print(dir(res)) # res의 모든 속성 출력
>>> ['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', '_next', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']