본문 바로가기

Minding's Programming/Crawling

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

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