1. 인터넷

  • WWW : 인터넷에서 정보를 교환할 수 있는 환경 (World Wide Web)
  • 여러 컴퓨터끼리 네트워크를 연결한 것
  • Web은 인터넷 상에서 정보를 교환하기 위한 시스템

2. Web에서 정보 주고받기

  • 클라이언트 : 정보 요청
  • 서버 : 정보 제공

1) 클라이언트가 서버에게 정보를 요청
2) 요청에 대해서 서버가 작업 수행
3) 수행한 작업의 결과를 클라이언트에게 응답

3. HTTP

  • Hypertext Transfer Protocol
  • 웹 상에서 정보를 주고받기 위한 약속

  • HTTP 요청 (Request)
    • 클라이언트에서 서버로 정보를 요청하는 것
  • HTTP 응답 (Response)
    • 요청된 정보에 대해 서버가 클라이언트에게 응답하는 것

HTTP 구조

  • HEAD
    • 요청/응답에 대한 정보
  • BODY
    • 내용물 (정보)

HTTPRequest - Header

GET / HTTP 1.1
Host: www.programmers.com
User-Agent: Mozilla/5.0
...
  • GET 키워드
    • / : root. 가장 최상단의 정보
  • HOST
    • 누구의 정보를 요청하는지
    • www.programers.com 의 / 정보
  • User-Agent
    • 사용자 정보 (요청하는 자)

HTTPResponse

HTTP / 1.1 200 OK
///
<html>...</html>
  • OK
    • 잘 왔다는 시그널
  • <html>...</html>
    • 요청했던 정보
  • 200
    • status code
    • ex)
      • 404 : Not Found
      • 503 : Server Error
      • 위 경우 정보가 오지 않을 수 있음

4. 웹페이지

  • 웹페이지
    • HTML 형식
  • 웹브라우저
    • 우리가 HTML 요청을 보내고, HTTP 응답에 담긴 HTML 문서를 우리가 보기 쉬운 형태로 화면을 그려주는 역할
    • HTML 코드 렌더링

5. HTML 구조

<!DOCTYPE html>
<html>
    <head>
        <title>Example Document</title>
    </head>
    <body>
        <h1>Hello World!</h1>
        <p>My name is BK!</p>
    </body>
</html>
  • <!DOCTYPE html>
    • HTML5 임을 명시
  • 가장 바깥에 <html> 태그로 감싸져 있음

  • 크게 HeadBody로 나눌 수 있음
  • Head
    • 문서에 대한 정보 (제목, 언어 등) 작성
  • Body
    • 문서의 내용 (글, 이미지, 동영상 등) 작성
  • HTML은 여러 태그(Tag)로 감싼 요소(Element)의 집합으로 이루어져 있음!
  • 태그로 내용을 묶어 글의 형식 지정
  • 태그는 그에 맞는 속성(attribute)를 가지기도 함

6. HTTP 통신 코드

GET : 정보 요청

# requests 라이브러리 불러온 후, NAVER의 홈페이지 요청하여 응답 받기
import requests

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

<Response [200]> : OK

# Header 확인 : .headers

res.headers

스크린샷 2023-10-25 오전 2 14 28

# Body 텍스트 형태로 확인 : .text

res.text[:1000]

스크린샷 2023-10-25 오전 2 16 54

POST : 정보 갱신 요청

  • 사용자의 정보를 제공하면서 서버에게 무언가 요청을 진행하는 경우
  • ex) 로그인
    • ID, PWD 제공 -> 서버에게 전달
    • 서버 : 클라이언트에서 보내온 정보가 서버에 있는 이 사용자의 ID, PWD와 일치하는지 확인

https://webhook.site

# payload와 함께 POST 보내기 : requests.post()

payload = {"name": "Hello", "age": 13}

res = requests.post("https://webhook.site/5dd86a17-4493-4c3c-ac7f-0b968cb03296", payload)
  • request의 body에 정보 전달
    • 간단하게 dictionary 이용
# status code 확인 : .status_code

res.status_code

200

스크린샷 2023-10-25 오전 2 33 55

7. 웹 크롤링과 웹 스크래핑

  • 웹 스크래핑
    • 웹페이지들로부터 우리가 원하는 정보를 추출
    • ex) 프로그래머스 플랫폼 속엔 어떤 프로그래밍 문제들이 있지?
    • 특정한 목적으로 특정 웹페이지에서 데이터를 추출하는 것
      • ex) 날씨 데이터 가져오기, 주식 데이터 가져오기, …
  • 웹 크롤링
    • 크롤러(Crawler)를 이용해서 웹 페이지의 정보를 인덱싱
    • ex) 프로그래머스 플랫폼 속엔 어떤 페이지들이 있지?
    • URL을 타고다니며 반복적으로 데이터를 가져오는 과정
      • ex) 검색 엔진의 웹 크롤러

8. 올바르게 HTTP 요청하기

  • 웹 스크래핑/크롤링을 통해 어떤 목적을 달성하고자 하는가?
  • 나의 웹 스크래핑/크롤링이 서버에 영향을 미치지는 않는가?

robots.txt

  • 웹사이 및 웹페이지를 수집하는 로봇들의 무단 접근을 방지하기 위해 만들어진 로봇 배제 표준
  • User-agent, Disallow, Allow 이용
    • User-agent : 규칙이 적용되는 대상 사용자 에이전트
    • Disallow : 크롤링을 금지할 웹페이지
    • Allow : 크롤링을 허용할 웹페이지
  • robots.txt 가져오기
import requests

res = requests.get("https://www.naver.com/robots.txt")
print(res.text)

User-agent: *
Disallow: /
Allow: /$

  • /$ : 순수하게 /로 끝나는 페이지
    • 위의 경우 https://www.naver.com/ 만 허용하겠다는 뜻