Data Analyst/Python

[Web Scraping] 인터넷의 원리, http, css selector

e_mily.dy 2023. 9. 25. 20:01
728x90

인터넷의 원리

 

 

  • 인터넷: 요청을 보내는 클라이언트(client)와 요청에 응답을 하는 서버(server)로 구성
  • 웹(www): 인터넷의 한 종류로 그림, 음악, 글 등이 어우러진 하이퍼텍스트(hypertext)를 중심으로 구성된다
  • HTTP(HyperText Transfer Protocol): 웹에서 사용하는 통신 규약
  • HTML(HyperText Markup Language): 웹 브라우저 상에 보이는 웹 문서를 표현하는 양식, 구조를 형성
  • => HTTP는 전송 방법이고 HTML은 파일 형식
  • CSS: HTML에서 서식을 지정할 때 사용, 시각적 디자인과 레이아웃 표현
  • JavaScript: HTML에 여러 가지 동적인 기능을 덧붙여주는 프로그래밍 언어, front-end

 

HTTP

  • 웹에서 데이터를 주고 받는 방법에 대한 규칙 (프로토콜)
  • HTTP는 클라이언트가 서버에 요청을 보내면, 서버가 응답하는 방식으로 통신이 이루어진다
  • 요청의 종류에 따라 GET, POST 등 다양한 방법이 있다

 

GET

  • requests
  • 서버 측에 존재하는 데이터를 가져오기 위한 요청 방법
  • 하나의 URL 주소의 대상에 GET 요청을 보내면 서버는 원칙적으로 동일한 응답을 해야 한다

 

HTTP 상태 코드

  • 서버는 응답을 할 때 상태 코드를 전송한다. 상태코드는 세 자리 숫자로 되어 있다

2XX : 성공, 보통 200을 사용
3XX : 리다이렉션. 요청한 URL이 다른 URL로 이동했다. 301(영구이동) 302(임시이동)
4XX : 요청 오류. 잘못된 요청을 보낸 경우. 404(찾을 수 없음)
5XX : 서버 오류. 버그나 장애 등 서버 측의 오류. 500(내부 서버 오류), 502(불량 게이트웨이)
 
 

BeautifulSoup을 활용한 웹 스크래핑

  • beautifulsoup4: HTML 요소들을 분석하는 패키지
  • html5lib: HTML 문서를 parsing(분석)
  • requests: HTTP 요청(request)을 보내고, 서버로부터 응답(response)을 받는 기능 담당
  • find_all: 해당하는 모든 요소를 찾음(많이 쓰임)
  • select: 해당하는 모든 요소를 찾음
  • soup.select(css_selector): soup 객체에서 CSS 선택자로 요소들을 찾는 방법

 
soup.태그이름 = soup.find('태그이름')
 
HTML 하위 요소(sub/child element)를 찾는 방법

  1. parent_selector > child_selector
  2. ancestor_selector(조상 선택자) descendant selector(자손 선택자)

 

HTML 특정 내용 추출 방법

  1. CSS 선택자
  2. XPATH

 

CSS 선택자

  • class: .
  • id: #
  • 모든 요소 선택: *

 
class 이름으로 선택

<table class="container"></table>
.container

 
특정 태그의 class 선택

<p class="intro"></p>
p.intro

 
id 이름으로 선택

<div id="wrap"> <!-- 전체 레이아웃 시작 -->

</div> -- <!-- 전체 레이아웃 끝 -->
#wrap

 
클래스가 여러 개일 경우

<p class='class_1 class_2'>...</p>
p.class_1.class_2

 
특정 태그 밑에 있는 부분 선택

<a class='class_1'>1번 값</a>
<li>
	<a class='class_1'>2번 값</a>
li a.class_1

 
 

웹 주소(URI, URL)의 형식

프로토콜://서버주소[:포트번호]/경로?쿼리스트링
https://comic.naver.com/webtoon/list.nhn?titleId=703846&weekday=tue
쿼리스트링(query string) : 클라이언트(브라우저)가 서버로 보내는 정보
param이름=param값
파라미터가 여러 개일 경우 : &로 파라미터들을 구분