웹에서 데이터를 수집하는 방식은 크게 API와 웹 크롤링, 2가지가 존재한다.
| 항목 | API(Application Programming Interface) | Web Crawling |
|---|---|---|
| 데이터 제공 | 공식적으로 제공하는 데이터 인터페이스 사용 | 웹 페이지의 HTML을 직접 파싱 |
| 작동 방식 | 서버로 요청 -> JSON 응답 처리 | HTTP요청 -> HTML 분석 후 데이터 추출 |
| 장점 | 신뢰도 높고, 빠르고, 사용이 편리함 | API 없이도 원하는 데이터 추출 가능 |
| 단점 | 사용량 제한, API 제공 범위 제한적 | 느리고, HTML의 구조 변경시 코드 수정 필요 |
| 사용 | 공식적으로 API가 제공될 때 | API가 없거나 추가 데이터가 필요할 때 |
e.g. 인스타그램의 경우 웹 크롤링을 시도하면 아이피 차단을 해버리기도 하기 때문에 주의해서 해야 한다!
API(Application Programming Interface)란?
-응용 프로그램이 서로 데이터를 주고 받는 방법을 제공하는 인터페이스
-특정 데이터 제공자가 정해진 규격으로 데이터를 전달 (JSON 또는 XML. 최근에는 JSON 형식을 주로 사용한다.)
+) 프론트엔드와 백엔드:
프론트엔드(Frontend): 사용자와 웹 브라우저 사이에서의 작업
백엔드(Backend): 데이터 베이스와 웹 서버 사이에서의 작업
-> 이 때, 웹 브라우저와 웹 서버 사이에서 일어나는 request와 response 등의 작업 인터페이스를 API라고 한다.
-데이터를 표시하는 방법 중 하나로, 데이터를 문자열의 형태로 나타내기 위해 사용
-네트워크를 통해 다른 시스템들이 소통할 때 사용하는 경량의 데이터 교환 방식
-자바스크립트에서 파생되었으나, 현재 다른 프로그래밍 언어에서도 지원하는 데이터 포맷
-> 가독성이 뛰어나 사람과 컴퓨터에게 모두 해석하기 편함
-> JavaScript의 Object를 기반으로 하는 텍스트 형식
-파이썬의 딕셔너리와 유사
-딕셔너리와는 key 이름을 큰 따옴표 ("key-name")으로 감싸는 차이점이 있다.
-문자열, 숫자(정수, 실수), boolean(true, false), 중첩된 객체와 배열 저장이 가능하다.
<JSON 예시>
{
"name" : "Sean",
"age" : 20,
"skills" : ["JavaScript", "JAVA", "Python"],
"family" : {
"father" : "Jake",
"mother" : "Sunny"
},
"height": 120.9,
"isLogin": true
}
=> Client와 Server가 JSON 형식의 데이터를 주고 받는다!
HTTP(Hypertext Transfer Protocol)란?
-인터넷 상에서 데이터를 주고 받기 위한 프로토콜(약속)
-클라이언트는 서버에게 자원을 요청(Request)하고, 서버는 클라이언트에세 요청을 처리해서 응답(Response)
-> API는 주로 HTTP 통신으로 이용해 데이터를 주고 받는다.
-> API는 Rest API, Restful API라고도 불린다.
Rest(Representational State Transfer)란?
-Roy Fielding이 2000년에 소개한 웹 아키텍쳐 스타일
-클라이언트와 서버간의 경량 통신을 가능하게 하며, 웹 기반 소프트웨어 어플리케이션에서 널리 사용된다.
<Rest 특징>
-Rest는 모든 것(데이터, 기능, 서비스 등 어떠한 형태의 정보든지!)을 리소스(Resource)로 간주
-각 리소스는 고유한 식별자인 URI(Uniform Resource Identifier)를 가지며, 이을 통해 리소스에 접근할 수 있다.
-HTTP 메서드의 활용: HTTP 메서드(GET, POST, PUT, DELETE 등)을 사용하여 리소스를 조작 ->이게 프로토콜(약속)!
-상태를 관리하지 않음(Stateless): Rest 아키텍쳐는 상태를 관리하지 않으며, 각 요청을 독립적으로 처리한다. 또한 서버는 요청에 필요한 모든 정보를 포함하고 있어야 한다.
(e.g. 로그인 상태를 관리하지 않고, 로그인한 상태를 계속 서버에 보내주기)
-캐시 처리 가능(Cacheable): Rest 리소스는 캐싱이 가능하도록 설계되어, 클라이언트나 중개 서버가 캐시를 활용하여 효율적으로 리소스를 관리할 수 있다.
-Client-Server: 클라이언트(사용자 인터페이스, 프론트엔드)와 서버(데이터 스토리지, 백엔드)가 분리되어 있어 각각 독립적으로 발전
-역할: 서버로부터 리소스를 조회
-URL로 리소스의 정보를 요청
-서버는 요청한 리소스의 정보를 응답으로 전달 -> 서버의 상태나 데이터의 정보를 변경시키지 않음.
-캐싱을 활용하여 자주 요청되는 데이터를 효율적으로 전달
-역할: 서버에 새로운 리소스를 생성 (e.g. 회원가입)
-URL로 요청 시 새로운 데이터를 서버로 전송
-서버는 요청 데이터를 처리하여 새로운 리소스를 생성하거나 해당 데이터를 저장
+)서버의 상태나 데이터를 변경시키는 메서드임으로 주의해서 사용할 것.
-역할: 서버의 자원을 갱신
-PUT: 리소스 전체를 업데이트
-PATCH: 리소스의 일부분을 업데이트
-클라이언트는 수정하고자 하는 리소스의 새 데이터를 서버로 보낸다.
-서버는 이 데이터를 이용하여 리소스를 업데이트하고, 성공 여부를 클라이언트에게 알린다.
-역할: 리소스를 삭제
-클라이언트가 특정 리소스의 삭제를 요청하면, 서버는 해당 리소스를 삭제하고 결과를 클라이언트에게 알림.
+)서버의 데이터가 삭제되므로 주의해서 사용할 것.
=>이 GET, POST, PUT, PATCH, DELETE를 모두 API 요청(Request) HTTP 메서드라고 한다. 이때 PUT, PATCH, DELETE는 사실상 POST를 세분화한 것이다.
+) 토큰을 받아올 때는 요청을 보내야 정보가 생성되므로 POST방식의 요청을 필요로 한다.
-요청은 보안 문제로 인해 볼 수 없으나, GET방식은 정보를 조회하는 목적이기 때문에 볼 수 있다.
<요청의 구조>
-URL: 요청 대상의 주소
-HTTP 메서드: 요청의 종류 (GET, POST 등)
-Headers: 요청의 부가 정보 (e.g. 인증 토큰, Content-Type)
-Body: 요청에 포함되는 데이터 (POST, PUT, PATCH에서 사용)
<응답의 구조>
-HTTP 상태 코드: 요청 성공 또는 실패를 나타냄.
-Headers: 응답의 부가 정보 (e.g. Content-Type, 날짜)
-Body: 요청 결과 데이터 (JSON, XML 등)
-HTTP 요청을 간단하고 효율적으로 보낼 수 있도록 도와주는 라이브러리
-외부 모듈로 pip install requests로 설치하여 사용 가능하다.
| 번호 | 상태 | 예시 |
|---|---|---|
| 200번대 | 성공 | 200(OK), 201(Created) |
| 300번대 | 리다이렉션 | 301(Moved Permanently) |
| 400번대 | 클라이언트 오류 | 400(Bad Request), 401(Unauthorized), 404(Not Found) |
| 500번대 | 서버 오류 | 500(Internal Server Error) |
<requests 모듈 활용 코드 예시>
import requests
import json
url = "https://koreanjson.com/posts"
res = requests.get(url)
if res.status_code == 200: #HTTP 응답코드 200번: OK
data = res.json()
for i in data:
print(f"ID: {i["id"]}, 제목: {i["title"]}")
else:
print("요청 실패")
with open("data.json", "w", encoding = "utf-8") as file:
json.dump(data, file, ensure_ascii=False, indent=4)
-웹 페이지의 HTML 데이터를 직접 가져와 필요한 정보를 직접 추출하는 기술
-웹사이트에서 제공하는 데이터가 API로 제공되지 않을 때 사용
-주로 HTML 문서나 URL 목록과 같은 원시 데이터를 수집
e.g.) 구글 검색 엔진
-웹 페이지에서 특정 데이터를 추출하고 가공하는 작업
-특정한 텍스트, 이미지, 표 등 유용한 정보만을 선별하여 수집
e.g.) 상품 가격 목록, 뉴스 기사, 리뷰 등
->웹 크롤링과 웹 스크래핑의 개념은 혼용해서 사용하는 경우가 대다수이며 그 경계가 모호하지만, 개념과 목적이 다르다.
=> 우리가 앞으로 활용하는 것은 웹 스크래핑이다!