: 인터넷에서 정보를 교환할 수 잇는 환경을 만들어볼까?
-> WWW(Wold Wide Web, 줄여서 Web) 탄생
인터넷은 여러 컴퓨터 끼리 네트워크를 연결한 것
web은 인터넷 상에서 정보를 교환하기 위한 시스템!
정보를 요청하는 컴퓨터 클라이언트
정보를 제공하는 컴퓨터 서버
: Hypertext Transfer Protocol!
: 웹 상에서 정보를 주고 받기 위한 약속
(예시)
-> HTTP도 마찬가지
Header
GET : /가 있는 위치의 값을 요청
Host : 해당 페이지에 있는 값을 요청
Uset-Agent : 요청하는 사람
Header
OK : 잘 도착함을 알림
Body
원하는 정보가 담긴 문서가 나타남
웹 속에 있는 문서 하나는 웹 페이지
이러한 웹 페이지 모음 웹 사이트
: 웹 페이지는 엄청 복잡한 줄글로 되어있다.
이 코드들은 response의 body 부분이다.
웹 브라우저는 HTML요청을 보내고, HTTP 응답이 담긴 HTML 문서를 우리가 보기 쉬은 형태로 화면을 그려주는 역할을 담당이다.
웹 페이지는 HTML이라는 형식으로 되어있고,
웹 브라우저는 우리가 HTTP 요청을 보내고, 응답받는 HTML 코드를 렌더링 해주는 것이다.
: HTML(HyperText Markup Language)
<!DOCTYPE html>
를 통해 HTML5임을 명시<html>
(여는 태그) </html>
(닫는 태그) 태그로 감싸져 있다.HTML은 여러 태그(tag)로 감싼 요소(Element)의 집합으로 이루어져 있다!
참고 : 웹 브라우저 마다 지원하는 태그와 속성이 다르다!
우리가 원하는 내용이 HTML 문서의 어디에 있는지, 어떤 태그로 묶여있는지를 관찰해야한다.
requests
라이브러리를 이용해 HTTP 통신 진행하기requests
는 Python을 이용해 간단히 HTTP 통신을 진행할 수 있는 라이브러리이다.requests
라이브러리를 설치해야한다.pip install
을 통해 이를 실행할 수 있다.%
를 이용해 노트북(.ipynb)환경에서 실행할 수 있다.%pip install requests
requests 라이브러리를 불러온 후, NAVER 홈페이지를 요청한 후 응답을 받아본다.
import requests
#get method 불러옴, 네이버의 주소를 인자로 넣기
res = requests.get("https://www.naver.com")
res # HTTP 응답이 담겨있음
-> <Response [200]> #요청에 따른 응답, 객체로 온다. (200 = OK)
Header를 확인해보자 : .headers
res.headers # 객체 안에 있는 속성이 hesder를 담고 있음
Body를 텍스트 형태로 확인해보자 : .text
res.text[:1000] # .text는 단순하게 모든 정보를 가져옴
우리는 우리의 정보를 제공해주면서 서버로하여금 무엇가 요청을 진행할 때도 있다.
우리가 매일 진행하는, 로그인이 그 예시이다.
이러한 요청을 처리하는 HTTP Method가 있는데, 이것이 POST이다.
POST를 활용하기 위해 https://webhook.site 를 이용해본다.
payload와 함께 POST를 보내보자 : requests.post()
payload = {"name" : "Hello", "age" : 13}
# 요청을 하는 과정에서 body에 payload를 넣는다.
res = requests.post("https://webhook.site/59d38982-e81d-44e6-a0fe-c78cc69f63cd", payload)
상태코드를 확인 : .status_code
res.status_code
: 핵심은 추출
: 웹 페이지들로부터 우리가 원하는 정보를 추출
: 핵심은 색인
: 크롤러(Crawler)를 이용해서 웹페이지의 정보를 인덱싱
웹 스크래핑 : 특정한 목적으로 특정 웹 페이지에서 데이터를 추출하는 것 - 데이터 추출
e.g. 날씨 데이터가져오기, 주식 데이터 가져오기, ...
웹 크롤링 : URL을 타고다니며 반복적으로 데이터를 가져오는 과정 - 데이터 색인
e.g. 검색 엔진의 웹 크롤러
웹 브라우징은 사람이 아닌, 로봇이 할 수 있다.
그렇다면 무턱대고 모든 사이트에 대해 모든 정보를 취득하는 것이 정당할까?
1994년, REP(Robot Exclusion Protocol)이 나왔다.
웹 크롤러들은 이 규칙을 지키면서 크롤링을 진행
robots.txt는 웹 사이트 및 웹 페이지를 수집하는 로봇들의 무단 접근을 방지하기 위해 만들어진 로봇 배제 표준(robots exclusion standard)이자 국제권고안이다.
일부 스팸 봇이나 악성 목적을 지닌 가짜 클라이언트 로봇은 웹 사이트에 진짜 클라이언트처럼 접근한다. 그리고 무단으로 웹 사이트 정보를 긁어가거나, 웹 서버에 부하를 준다.
이러한 로봇들의 무분별한 접근을 통제하기 위해 마련된 것이 robots.txt이다.
스팸 봇이 아님을 브라우저에게 알려주는 것이 사용자 에이전트(user agent) 정보이다.
나의 User Agent 확인하기 : https://www.whatismybrowser.com/detect/what-is-my-user-agent/
사용자 에이전트는 요청을 보내는 것의 주체를 나타내는 프로그램이다. 웹 맥락에서는 브라우저, 웹 페이지를 수집하는 봇, 다운로드 관리자, 웹에 접근하는 다른 앱 모두 사용자 에이전트이다.
웹 서버에 요청할 때 사용자 에이전트 HTTP 헤더(user agent HTTP header)에 나의 브라우저 정보를 전달하면 웹 서버가 진짜 사용자로 인식할 수 있게 된다.
웹 스크래핑을 할 때 원칙
1. 요청하고자 하는 서버에 과도한 부하를 주지 않는다.
2. 가져온 정보를 사용할 때 저작권과 데이터베이스권에 위배되지 않는지 주의한다.
robots.txt는 웹 페이지 메인 주소에 /robots.txt
를 입력하면 확인할 수 있다.
requests 모듈을 불러온 후, 웹사이트에 대한 robots.txt 정책을 확인해보자.
import requests
res = requests.get("https://www.naver.com/robots.txt")
print(res.text)
->
User-agent: *
Disallow: /
Allow : /$
👍