크롤링

신다윤·2023년 12월 28일
0

1 웹 페이지 종류

웹 크롤링을 하면서 만나게 되는 페이지는 크게 정적 웹 페이지와 동적 웹 페이지 두 가지로 분류할 수 있다.

1.1 정적 웹 페이지

정적 웹 페이지란 정지했다는 의미의 정적(static)에서 알 수 있듯이 웹 서버에 미리 저장된 파일이 그대로 전달되는 웹 페이지를 말한다.
즉, 특정 웹 페이지의 url주소만 주소창에 입력하면 웹 브라우저로 HTML 정보를 마음대로 가져다 쓸 수 있다.
동적 웹 페이지와의 가장 큰 차이점은 'url 주소 외에는 아무 것도 필요없다'는 점이다.

1.2 동적 웹 페이지

동적 웹 페이지란 움직인다는 의미의 동적(dynamic)에서 알 수 있듯이 url만으로는 들어갈 수 없는 웹페이지를 말한다.
혹시 url로 들어가졌는데 url의 변화 없이 실시간으로 내용이 계속해서 추가되거나 수정된다면 동적 웹 페이지이다. (마우스 휠을 스크롤 다운 했는데 url에 변화 없이 페이지에 내용이 추가된다면 그 페이지는 동적 웹 페이지)

ex) : 보고 있는 위치에 출력 결과와 url이 계속 변하는 네이버 지도

➡️ 정적 웹 페이지에서 정보를 수집 하느냐, 동적 웹 페이지에서 정보를 수집하느냐에 따라 사용되는 파이썬 패키지(정적-beautifulsoup | 동적-beautifulsoup/selenium)가 달라진다.

나는 이 중 beatifulsoup을 사용한 정적 웹 크롤링에 관해 정리해보려고 한다.

2 정적 웹 크롤링

정적 웹 크롤링은 주로 다음과 같은 과정을 따른다.
1단계 원하는 웹 페이지의 html 문서를 싹 긁어온다.
2단계 긁어온 html 문서를 파싱(parsing)한다.
3단계 파싱한 html 문서에서 원하는 것을 골라 사용한다.

1단계 requests

html 문서를 가져올 때 사용하는 패키지로는 requests가 있다. requests는 사용자 친화적인 문법을 사용해 다루기 쉬우면서도 안정성이 뛰어나다.

  • 설치 방법
    pip install requests

* 사용 방법
```# requests 패키지 가져오기
import requests

# 가져오고 싶은 url 입력
url = 'https://tumblbug.com/discoverachieveRate=3&category=all&ongoing=confirm&tab=category'

# requests의 get함수를 이용해 해당 url로부터 html이 담긴 자료를 받아오기
response = requests.get(url)

# 얻고자 하는 html문서를 html_text에 담기
html_text = response.text

2단계 BeautifulSoup

BeautifulSoup이란 매우 길고 정신없는 html문서를 정돈된 형태로 response.text를 통해 가져온 html 문서를 탐색해서 원하는 부분을 뽑아내는 역할을 하는 라이브러리다.(해당 작업을 파싱(parsing)이라고 부른다.)

또한 response.text로 가져온 html문서는 단순 string에 지나지 않아 lxml을 통해 의미있는 html문서로 변환하는 작업을 거친다. 따라서 보통 BeautifulSoup과 lxml을 같이 사용한다.

  • 설치 방법
pip install beautifulsoup4
pip install lxml
  • 사용 방법
import requests
from bs4 import BeautifulSoup as bs

url ='https://tumblbug.com/discoverachieveRate=3&category=all&ongoing=confirm&tab=category'

response = requests.get(url)

soup = BeautifulSoup(html, 'lxml')

3단계 BeautifulSoup4(find/select)

정적 웹 크롤링의 핵심은 필요한 정보의 위치와 구조를 파악해 원하는 정보만 가져오는 것이다. 그러기 위해 beautifulSoup 패키지의 다양한 함수를 활용하게 되는데 대표적으로 사용하는 함수는 다음과 같다.

1) find(), find_all() 함수
-find() : 요소 하나만 찾는 것
-find_all() : 모두 다 찾는 것
-> find함수의 괄호 안에는 html의 태그(tag)나 속성(attribute)이 들어간다. 웹 페이지에서 검사를 해보면 가져오고 싶은 정보마다 고유의 태그와 속성을 가지고 있으므로 적절하게 넣어주면 된다.

2) select(), select_one() 함수
-select()는 find_all()과 같은 개념이고, select_one()은 find()와 같은 개념이다. 다만 select와 find의 다른 점은 select()함수는 괄호 안에 CSS선택자라는 것을 넣어 원하는 정보를 찾는 것이 특징이다.

profile
나는야

0개의 댓글