인터넷과 웹
웹이 등장하기 까지의 과정:
- 네트워크: 두 컴퓨터 간의 통신망
- LAN: 근거리 통신망 네트워크
- Internet: 범지구적으로 연결된 네트워크
- WEB: 인터넷 상에서 정보를 교환하기 위한 시스템으로 개발됨
웹에서 정보를 주고받는 방법
- 클라이언트(사용자)가 서버에 정보 요청 (= Request)
- 서버에서 클라이언트 요청에 대한 처리 진행
- 상황에 따른 응답 (응답코드를 리턴, 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
'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 |