파이썬으로 배우는 웹 크롤러2
클라이언트
일상샐활에서 클라이언트는 고객을 의미합니다. IT에서 클라이언트는 데이터, 서비스를 요청하는 프로그램입니다. 그리고 요청한 데이터를 사용자에게 보여주기도 합니다.
우리가 사용하는 컴퓨터 프로그램, 스마트폰 애플리케이션등이 모두 클라이언트 프로그램입니다.
서버
- 서버란?
인터넷을 통해 연결된 클라이언트에 데이터 또는 서비스를 제공하는 프로그램입니다.서버가 없다면 클라이언트는 존재하지 않습니다. 정확히 말하면 정적인 데이터만 제공할 수 있습니다.
* 크롤러를 만든다는 것은 이러한 서버를 어떤 구조로 만들었는지 파악하고 유추하는 것이 굉장히 중요합니다. 특히, 서버에게 응답받은 데이터를 찾고, 그 데이터를 서버에서 어떻게 가져오는지 판단하는 과정이 굉장이 중요합니다.
- 서버의 종류
1. 영상: 유튜브로 예를 들자면 영상을 제공해주는 서버인 서비스가 존재하기 때문에 우리는 영상을 제공하는 플랫폼을 이용하여 해당 영상을 받아 볼 수 있습니다.
영상 서버의 경우 다른 서버와 다르게 데이터를 한번에 주는 것이 아니라 일정량을 분할하여 전송합니다. 이것을 스트리밍이라고 부릅니다. 만약 영상을 한번에 받는다면 부담되기 때문에 스트리밍 방식을 많이 사용합니다.
2. 파일: 과거 파일을 제공하는 서비스중 대표적인 것이 P2P였습니다. 오늘날에는 토렌트나, 각종 드라이브를 사용합니다. 이러한 것도 서버의 한 종류입니다. 또한 FTP, SFTP를 이용하여 개인이 파일을 서버를 구축하여 사용하기도합니다.
3. 도메인: www.google.com과 과 같은 형태로 문자로 된 것은 IP라고 하는 주소로 대응되어 있습니다. 도메인 주소에 대해 대응되는 IP를 알려주는 것이 DNS라고하는 도메인 네임 서비스입니다.
4. 채팅 및 음성: 채팅을 제공하는 프로그램을 흔히 메신저라고합니다. 오늘날에는 대부분 카카오톡이라는 프로그램 또는 애플리케이션을 사용합니다. 이러한 메신저 프로그램도 서버가 없으면 동작할 수 없습니다.
5. 게임: 게임을 할 때 혼자 즐기는 것보다 주로 멀티플레이를합니다. 그런데 신기하게도 게임 플레이를 하는 유저들은 모두 물리적으로 상당히 떨어져있스빈다. 이러한 게임이 가능한 이유는 바로 게이임 서버가 존재하기 때문입니다. 게임 서버를 통해 인터넷으로 연결하여 마치 한 공간에 있는 것처럼 표현해준다.
6. 웹 서버: 우리가 웹 브라우저를 통해 요청된 페이지를 받아오는 서버입니다. 서버는 웹을 정적 페이지, 동적 페이지와 같은 형태로 제공합니다. 동적 페이지는 게시판과 같이 데이터가 늘어났다 줄어드는 페이지를 의미합니다. 페이지를 띄울 때마다 다른 데이터가 뜨는 페이지를 동적인 페이지라고합니다. 정적인 페이지는 항상 같은 데이터를 띄워주는 페이지입니다.
서버와 클라이언트의 데이터를 주고받는 방법
요청 메소드:
클라이언트가 서버에 데이터를 요청할 때 크게 네가지의 타입이 있습니다. 읽기, 쓰기, 수정, 삭제 이를 CRUD라고합니다. 서버와 데이터베이스의 가장 기본적인 개념입니다.
게시판을 예로 들어보겠습니다. 게시판 사이트에 들어가서 게시판의 모든 게시글 리스트를 가져오거나 특정 게시글에 대한 정로를 가져올 때 Read합니다. 그리고 게시글을 추가하면 Create하고, 게시글을 수정하면 Update, 게시글을 삭제하면 Delete합니다.
하지만 클라이언트와 서버는 Read, Create, Update, Delete라고 직접 명시하지 않습니다. 이러한 요청을 해더에 GET, POST, PUT, DELETE의 형태로 메소드를 정의합니다.
CRUD와 요청 메소드(GET, POST, PUT, DELETE)는 다음과 같이 매핑됩니다.
- GET: read
- POST: create
- PUT: Update
- DELETE: Delete
응답 코드:
- 1xx: 조건부 응답
- 2xx: 성공
- 3xx: 리다이렉션 완료
- 4xx: 요청 오류
- 500: 서버 오류
URL
URL은 Uniform Resource Locator의 약자입니다. 네트워크상에서 자원을 요청하는 규약입니다. 웹 브라우저뿐 아니라 스마트폰 애플리케이션, 컴퓨터 응용 프로그램들은 서버와 데이터를 주고받을 때 URL을 이요하여 데이터를 주고 받습니다.
URL 구조
URL도 규약이기 때문에 작성하는 방법이 있습니다.
리소스 경로
주소 다음에 슬래시로(/) 시작하는 부분입니다. 클라이언트가 요청하는 리소스의 경로가 포함됩니다. 하지만 이 부분에 데이터를 함께 보내는 것입니다.
- A제품 페이지: http://www.example.com/product/1
- B제품 페이지: http://www.example.com/product/2
- C제품 페이지: http://www.example.com/product/3
이런 경우 1, 2, 3이 데이터에 해당합니다.
쿼리스트링
쿼리스트링은 클라이언트가 서버에 보내는 데이터입니다. 쿼리스트링은 리소스 경로 이후에 옵니다. 리소스 경로와 쿼리스트링은 물음표(?)로 구분합니다.
- A제품 페이지: http://www.example.com/product?pro=1&cate==2
- B제품 페이지: http://www.example.com/product?pro=2&cate==2
- C제품 페이지: http://www.example.com/product?pro=3&cate==2
? 뒤에는 변수=데이터&변수=데이터&변수=데이터의 형태로 엔드(&)를 이용하여 각각의 데이터를 구분하여 전송합니다.
header body
헤더의 바디라는 곳에 데이터를 포함하여 보낼 수 있습니다.
POST 요청을 하게되면 데이터를 Body에 실어 보내게 됩니다.
앞의 두가지 방식인 리소스 경로, 쿼리스트링에 데이터를 함께 보내면 데이터를 보내는데 한계가 있습니다. Header의 Body라는 곳에 데이터를 함께 보내면 앞의 방식보다 더 많은 데이터를 보낼 수 있습니다. 이 경우 URL로 확인이 불가능합니다.