컴퓨터사이언스/파이썬 & 알고리즘

[파이썬] 웹크롤링 하기 전에 필요한 사전 지식 정리 | css-selector, selenium, parsing 外

누군가의 이야기 2024. 9. 20. 10:32
728x90

 

그간 데이터 분석을 공부하면서도 웹크롤링에 대한 지식이 얕았던 것 같다. 

필요할 때 코드 긁어와서 크롤링 해보는 경험은 여러 번 있었으나

원리에 대해 고민해본 적은 없었는데, 이를 알려주는 강의를 들으며 정리를 해본다.

(내가 다시 보려고 끄적 거린 정리)


1. 클라이언트와 서버

클라이언트 : Browser를 사용하여 Server에 데이터를 요청 (Request)
서버 : Client의 Browser에서 데이터를 요청하면 요청에 따라 데이터를 Client로 전송 (Response)

 

2. URL(Uniform Resource Locator) 구조

http://news.naver.com:80/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=001&aid=0009847211#da_727145
• http:// - Protocol
• News - Sub Domain
• naver.com - Primary Domain
• 80 - Port 
• /main/ - Path
• read.nhn - Page ( File )
• mode=LSD - Query (key = value & 형식을 주로 보임)
• #da_727145 - Fragment

 

대충 프로토콜 > 도메인 > 포트 > 쿼리   

구조를 잘 파악하고 분석해서, url을 만들 줄 알아야 웹크롤링 시 url 설계도 용이해짐.

 

3. HTTP Request Methods

- GET 
• URL에 Query 포함
• Query(데이터) 노출, 전송 가능 데이터 작음


- POST
• Body에 Query 포함
• Query(데이터) 비노출, 전송 가능 데이터 많음

 

4. HTML 상태 코드

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
response의 status가 (2xx일 때 성공 / 3xx일 때 Redirect / 4xx일 때 Request 에러 / 5xx일 때 서버 에러)

 

200이 보통 반갑다.

 

5. 쿠키, 세션, 캐시

- Cookie
• Client의 Browser에 저장하는 문자열 데이터
• 사용예시 : 로그인 정보, 내가 봤던 상품 정보, 팝업 다시보지 않음 등


- Session
• Client의 Browser와 Server의 연결 정보
• 사용예시 : 자동 로그인


- Cache
• Client, Server의 RAM(메모리)에 저장하는 데이터
• RAM에 데이터를 저장하면 데이터 입출력이 빠름

 

6. 동적 웹페이지 데이터 수집

- 웹 브라우져에 화면이 뜨고 이벤트가 발생하면 서버에서 데이터를 가져와 화면을 변경하는 페이지
1. URL
2. request(URL) -> response(JSON)
3. JSON(str) -> list, dict -> DF (이 과정이 parsing)

우리가 원하는 형태의 데이터로 바꿔주는 것을, 파싱 (Parsing) 이라고 한다.

 

파싱 주요 목적은 필요한 데이터만 뽑아서 데이터프레임으로 만들어주는 것

 

동적 웹페이지 스크래핑 할 때,

F12 -> 네트워크 -> Fetch/XHR -> 트래픽 발생 했을 때 헤더의 URL을 가져오는 방식으로 해보았다. 

7. 정적 웹페이지 데이터 수집

- 웹 브라우져에 화면이 한번 뜨면 이벤트에 의한 화면의 변경이 없는 페이지
1. URL
2. request(URL) -> response(html)
3. html(str) -> BeautifulSoup > css-selector -> text(list, dict) -> DF (이 과정이 parsing)

 

BeautifulSoup 이용해서 HTML 문자열 데이터 parsing

 

정적 웹페이지에서 원하는 텍스트만 추출하기 위해서 css-selector가 필요하다

 

8.  CSS SELECTOR

CSS 셀렉터는 CSS 스타일을 적용시킬 HTML 엘리먼트를 찾기 위한 방법

html안에서 원하는 데이터를 잘 가져오기 위해 필요하다.

 

css-selector  쓰기 위해 알아 둘 html 구조:

tag -> 태그 이름을 쓰는 것 (div, p 등)
id -> <p id='nav'> 여기서 #nav 로 불러오는 것. 대부분 고유한 아이디 가짐.
class -> <p class='nav'> 여기서 .nav 로 불러오는 것. 유사한 부분들 동일한 클래스 가짐.
attr -> <p val='nav'> 여기서 [val='nav'] 로 불러오는 것

id, class, tag 순으로 자주 쓰임
독립적인 방식이 아니라 중첩해서 사용 가능 ex) p.nav1, nav2 

 

사용 방법:

BeautifulSoup 객체(dom) 안에 select 메서드(css-selector), 또는 select_one로 원하는 데이터 가져올 것

 

대략적인 순서는 아래 코드와 유사한 느낌.

response = requests.get(url)
dom = BeautifulSoup(response.content, 'html.parser')
selector = '#contentarea_left > div.box_type_m > table.type_1 > tbody'
elements = dom.select(selector)

# 하나의 element에서 td 태그만 가져옴
element = elements[2]
tag = element.select('td')

 

9. Selenium

자동화를 목적으로 만들어진 다양한 브라우져와 언어를 지원하는 라이브러리. (브라우저, 그리고 자동화 설계가 핵심)

 

크롬 드라이버 설치하고, 아래 실습 해보았다.

(크롬 창 띄우고 > 해당 url 이동 > 창 사이즈 조정 > 알림 팝업 넣기 > 알림 팝업 끄기 창 사이즈 조정 > 검색어 입력 > 검색 버튼 클릭 > 창 닫기)

 


 

사실 크롤링은 정답이 없기에,

1. url을 요청했을 때,

2. response.text 통해 어떤 형식(json / html 등)으로 돌아오는지 확인하고

3. 유연하게 처리하는 게 가장 중요

당연하게도 가장 좋은 건 API를 통한 request.

크롤링 방법에 따른 속도

(빠름) requests json > requests html > selenium (느림)

 

스크래핑과 크롤링 개념 차이 (개인적인 견해)

스크래핑 -> 하나의 URL에서 특정 데이터를 수집
웹크롤링 -> URL 타고 여러 페이지를 이동하면서 더 넓은 범위에서 데이터 수집

 

간단한 HTML 개념

div -> 레이아웃
p, span -> 텍스트
a -> 링크 (href)
ul, li -> 메뉴, 리스트 같은 느낌
img -> 이미지 (src)

 

용어에 대한 개념은 알고 넘어가야 원리가 이해 돼고,

이해한 것을 바탕으로 코드를 구현하는 것까지 연습해보았다.

 

Scrapy 프레임워크 이용한 실습 (xpath)은 짧은 시간에 배우기엔 이해가 부족하기에 다음에 다시 정리 예정

 

실무에선 크롤링이 필요한 경우 Scrapy 가장 많이 쓰인다고.


다시 강조할 점: 정답이 있는 것 아니고 유연하게 분석하고 판단해야만 한다. 

극단적으로, 웹페이지 측에서 html 코드 구조를 바꿔버리면 기존 설계한 코드 무용지물.

 

본문 내용과 완전히 무관한 박은빈

728x90