[HTTP/Python] HTTP 통신, 웹 스크래핑/크롤링 기본 개념 정리

2024. 10. 2. 12:48·Minding's Programming/Crawling
728x90
반응형

인터넷과 웹

웹이 등장하기 까지의 과정:

  • 네트워크: 두 컴퓨터 간의 통신망
  • LAN: 근거리 통신망 네트워크
  • Internet: 범지구적으로 연결된 네트워크
  • WEB: 인터넷 상에서 정보를 교환하기 위한 시스템으로 개발됨

 

웹에서 정보를 주고받는 방법

  1. 클라이언트(사용자)가 서버에 정보 요청 (= Request)
  2. 서버에서 클라이언트 요청에 대한 처리 진행
  3. 상황에 따른 응답 (응답코드를 리턴, ex) 2XX(성공), 4XX(클라이언트 에러), 5XX(서버 에러))

 

HTTP(Hypertext Transfer Protocol)의 구조

HTTP는 웹 상에서 정보를 주고받기 위한 일종의 약속이다. 기본적으로, 클라이언트에서 서버로 정보를 요청하고(HTTP 요청(Request)) 요청된 정보에 대해 서버가 클라이언트에게 응답(HTTP 응답(Response))하는 방식을 거친다.

 

HTTP는 요청/응답에 대한 정보를 담는 Head와 내용물인 Body로 나뉘는데, 각 파트 별 정보는 다음 예시와 같다.

 

요청(Request)

  • Head: 요청방식(ex. GET, POST 등), 요청하는 웹 주소(ex. naver.com), 요청자 정보(ex. User-Agent: xxx/5.0) 등
  • Body: 전달하고자 하는 내용물(주로 POST 방식에서 업데이트할 내용이 포함됨)

응답(Response)

  • Head: 응답코드(ex. 2XX, 4XX 등), 응답메시지(ex. OK 등) 등
  • Body: 요청한 정보 (에러 발생 시 정보가 담기지 않을 수 있음)

 

웹사이트와 웹페이지

웹 사이트 관련 개념

  • 웹 사이트: 웹 페이지의 모음(ex. 네이버)
  • 웹 페이지: 웹 속에 있는 HTML 문서 하나(ex. 네이버 메인 페이지)
  • 웹 브라우저: HTML 요청 및 응답에 담긴 HTML 문서를 사용자가 보기 쉬운 형태로 화면을 띄워주는 역할

 

Python으로 HTTP 통신하기

Python의 requests 라이브러리를 이용하면 Python으로도 HTTP 통신을 할 수 있다. 먼저 requests 라이브러리를 설치해준다. (jupyter lab을 이용해 실습했다.)

pip install requests

# jupyter or colab의 경우
!pip install requests

 

GET 요청하기 (정보 요청)

# 라이브러리 임포트
import requests

# response라는 변수에 GET 요청으로 받아온 정보 저장
response = requests.get('https://www.naver.com')

 

Header와 Body 확인하기

# Header 확인
response.headers

>>>
{'Date': 'Wed, 02 Oct 2024 02:32:42 GMT', 'content-type': 'text/html; charset=UTF-8', 'transfer-encoding': 'chunked', 'set-cookie': 'PM_CK_loc=b27a7e49cf2dbb1f8032d9c661d95ad2dbc670c96086cd22740761bb33dd8092; Expires=Thu, 03 Oct 2024 02:32:42 GMT; Path=/; HttpOnly', 'cache-control': 'no-cache, no-store, must-revalidate', 'pragma': 'no-cache', 'x-frame-options': 'DENY', 'x-xss-protection': '1; mode=block', 'content-encoding': 'gzip', 'strict-transport-security': 'max-age=63072000; includeSubdomains', 'referrer-policy': 'unsafe-url', 'server': 'nfront'}

# Body를 text형태로 확인하기
response.text

>>>
   <!doctype html> <html lang="ko" class="fzoom"> <head> <meta charset="utf-8"> <meta name="Referrer" content="origin"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=1190"> <title>NAVER</title> <meta name="apple-mobile-web-app-title" content="NAVER"/> <meta name="robots" content="index,nofollow"/> <meta name="description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요"/> <meta property="og:title" content="네이버">
   ...
   s&&o&&s.setAttribute("title",o),s&&o&&s.setAttribute("placeholder",o)}}()</script> </body> </html> '

위와 같이 GET 요청을 보냈을 때, response로 여러 정보가 담겨져 오는 것을 알 수 있다.

 

POST 요청하기 (정보 갱신)

GET 요청을 통해 정보를 받아오기도 하지만, 로그인과 같이 특정 정보를 제공하거나 수정할 때도 있다. 이러한 방식을 POST 메서드라고 한다.

 

https://webhook.site 라는 사이트를 이용해 POST를 활용해보고자 한다.

위 링크에 접속하게 되면 이런 화면이 노출되게 되는데, 여기서 'Your unique URL'이라는 링크를 이용하면 된다.

 

# payload: 요청을 보낼 정보
payload = {"name": "minding", "age": "27"}

# POST 요청
response = requests.post('Your link', payload)

요청 후 웹 페이지를 보면 Form Values라는 항목에 name과 age가 잘 반영된 것을 확인할 수 있다.

# 응답코드 확인
response.status_code

>>>
200

응답코드 또한 200(성공)이 표시되는 것을 확인할 수 있다.

 

윤리적인 웹 스크래핑/크롤링 진행

웹 크롤링과 웹 스크래핑의 개념

  • 웹 크롤링: 크롤러(Crawler)를 이용해 웹 페이지의 정보를 인덱싱(색인)하는 것
    • URL을 타고다니며 반복적으로 데이터를 가져오는 과정
  • 웹 스크래핑: 웹 페이지로부터 원하는 정보를 추출하는 것
    • 특정한 목적으로 특정 웹 페이지에서 데이터를 추출하는 것

 

올바른 HTTP 요청을 위해 고려해야 할 사항

1. 웹 스크래핑(크롤링)을 통해 어떤 목적을 달성하고자 하는가?

2. 웹 스크래핑(크롤링)이 서버에 영향을 미치지는 않는가?

3. 가져온 정보를 사용할 때 저작권, 데이터베이스권에 위배되지 않는가?

 

REP (Robot Exclusion Protocol)

로봇(크롤러)이 무단 접근해 모든 정보를 수집할 수 없도록 하는 일종의 규약이다. 스팸 봇 또는 악성 목적을 가진 클라이언트 로봇을 막기위해 만들어졌다.

 

웹 페이지에서는 REP와 관련된 규칙이 있는 robots.txt를 명시해, 크롤러들이 이 규칙을 지키면서 크롤링을 진행하도록 한다. User-agent(사용자), Disallow(접근거부 항목), Allow(접근가능 항목) 등의 키워드를 통해 사용한다.

 

robots.txt 살펴보기

robots.txt는 웹 페이지의 메인 주소에 '/robots.txt'를 입력하면 확인 할 수 있다.

import requests

response = requests.get('https://www.naver.com/robots.txt')

# 내용 확인
print(response.text)
>>>
User-agent: *
Disallow: /
Allow : /$
Allow : /.well-known/privacy-sandbox-attestations.json

네이버의 경우 모든 사용자(User-agent)에 대해 모든 정보의 크롤링을 거부(/)하고 있다. 단, 메인 페이지(/$)는 허용하고 있다.

 

robots.txt 작성 관련 문서: https://searchadvisor.naver.com/guide/seo-basic-robots

 

robots.txt 설정하기

robots.txt는 검색로봇에게 사이트 및 웹페이지를 수집할 수 있도록 허용하거나 제한하는 국제 권고안입니다. IETF에서 2022년 9월에 이에 대한 표준화 문서를 발행하였습니다. robots.txt 파일은 항상

searchadvisor.naver.com

 

 

 

 

728x90

'Minding's Programming > Crawling' 카테고리의 다른 글

[Playwright/Python] 비동기 처리가 가능한 웹 스크래핑 라이브러리, Playwright  (0) 2024.10.23
[BeautifulSoup/Selenium] BeautifulSoup, Selenium 기본 정리  (6) 2024.10.02
[Python/Selenium] (업데이트)Selenium으로 KBO 경기 일정 크롤링하기  (0) 2024.07.09
[Python/Selenium] Selenium으로 KBO 경기 일정 크롤링하기  (0) 2024.07.01
[Python/Bleach] Bleach 라이브러리 이용해 HTML 태그 삭제하기  (0) 2024.06.26
'Minding's Programming/Crawling' 카테고리의 다른 글
  • [Playwright/Python] 비동기 처리가 가능한 웹 스크래핑 라이브러리, Playwright
  • [BeautifulSoup/Selenium] BeautifulSoup, Selenium 기본 정리
  • [Python/Selenium] (업데이트)Selenium으로 KBO 경기 일정 크롤링하기
  • [Python/Selenium] Selenium으로 KBO 경기 일정 크롤링하기
Minding
Minding
  • Minding
    Today's Minding
    Minding
  • 전체
    오늘
    어제
    • 울고넘는 딥러닝 (278)
      • Minding's Baseball (57)
        • MLB Statcast (29)
        • 머신러닝으로 홈런왕 예측하기 (3)
        • 야구칼럼 (12)
        • 야구 규칙, 용어 (1)
        • 2022-23 질롱 코리아 (8)
        • 류현진 등판경기 (4)
      • Minding's Programming (185)
        • 프로그래머스 코딩테스트 (21)
        • Knowledge (44)
        • Numpy & Pandas (6)
        • Excel (3)
        • Git (1)
        • Pygame (11)
        • CV (3)
        • Tensorflow tutorial (4)
        • Kaggle and Dacon (4)
        • 에러 코드 (8)
        • FastAPI (8)
        • Airflow (29)
        • Crawling (6)
        • Django (14)
        • AWS (18)
        • Spark (5)
      • Minding's Reading (30)
        • 머신러닝 딥러닝에 필요한 기초 수학 with 파이.. (2)
        • 칼만필터는 어렵지 않아 (11)
        • 밑바닥부터 시작하는 딥러닝 (6)
        • 메이저리그 야구 통계학 2e (8)
        • 논문읽기 (2)
        • 빅데이터를 지탱하는 기술 (1)
      • Minding's Life (5)
        • 주식 (4)
        • 각종 소식 (1)
  • 블로그 메뉴

    • 홈
    • Baseball
    • Programming
    • Reading
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이게임
    질롱코리아
    파이썬
    칼만필터
    메이저리그
    파이썬게임개발
    칼만필터는어렵지않아파이썬
    django python
    데이터분석
    머신러닝
    데이터 엔지니어
    django
    pygame
    칼만필터는어렵지않아
    MLB
    게임개발
    Python
    코딩테스트
    Airflow
    에어플로우
    KalmanFilter
    mlb stats api
    KBO
    넘파이
    FastAPI
    AWS
    칼만필터는어렵지않아python
    야구
    프로그래머스
    딥러닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minding
[HTTP/Python] HTTP 통신, 웹 스크래핑/크롤링 기본 개념 정리
상단으로

티스토리툴바