오답노트

[BeautifulSoup] 정적 페이지와 정적 페이지 웹 크롤링 본문

Python/Web Crawling

[BeautifulSoup] 정적 페이지와 정적 페이지 웹 크롤링

권멋져 2022. 8. 5. 21:23

정적 페이지

정적 페이지는 페이지에 변화가 있으면, URL에도 변화가 있는 페이지가 정적 페이지다.

 

정적 페이지 웹 크롤링

정적 페이지는 HTML에서 CSS Selector를 통해 웹 크롤링 할 수 있다.

 

무신사 상품 랭킹 목록을 크롤링 실습을 해보자.

1. bs 패키지를 먼저 설치한다.

!pip install bs

 

2.  https://www.musinsa.com/ranking/best?period=now&age=ALL 에 접속해서 개발자 도구(F12)를 열고, 최상위 Elements 탭을 연다.

 

2.1 개발자 도구에서 Elements 탭

3. Ctrl + Shift + C 또는 Elements 좌측에 마우스 커서 아이콘을 클릭하여 상품 이름을 클릭한다.

 

2.2 상품 브랜드, 상품명, 상품 가격이 입력된 태그를 확인

4. CSS Selector를 통해서 상품 브랜드, 상품명, 상품 가격에 대한 CSS Selector를 얻기 위해 상위 CSS Selector를 알아낸다.

2.3 상품의 정보를 모두 담고 있는 태그

5. 코드를 작성한다.

 

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = "https://www.musinsa.com/ranking/best?period=now&age=ALL"

rsp = requests.get(url)
dom = BeautifulSoup(rsp.text,"html.parser")

elements = dom.select(".article_info")

items = []
for e in elements:
    price = e.select_one("p.price:not(del)").text.replace("\n","").replace(" ","").split('원')
    data = {
        "brand" : e.select_one(".item_title").text.replace("\n","").replace(" ",""),
        "item" : e.select_one(".list_info").text.replace("\n","").replace(" ",""),
        "price" : price[len(price)-2],
    }
    items.append(data)
    
df = pd.DataFrame(items)
display(df)

5-1. 우선 HTML 소스를 받기 위해 requests 패키지, 크롤링 자료를 데이터 프레임으로 만들기 위해 pandas, 마지막으로 BeautifulSoup을 import 한다.

 

5-2 무신사 상품 랭킹 URL에 GET 메소드를 통해 HTML 소스를 응답 받는다.

 

5-3 HTML 문자열을 BeautifulSoup 객체로 만든다.

 

5-4 4번 상품 정보를 모두 가지고 있는 태그를 선택한다. 이 때 select 함수를 사용하는데 인자로는 CSS Selector를 받는다. select 함수는 해당 CSS가 가지고 있는 모든 정보를 가져온다.

 

5-5 elements 변수에는 상품 정보를 모두 가지고 있는 태그안에 모든 정보가 들어있다. 그중에서 상품 브랜드, 상품명, 상품 가격만을 가져오기 위해 select_one 함수를 사용한다. select_one은 CSS Selector를 인자로 받고 해당 CSS의 정보만 가져온다.

 

5-6 pandas를 사용해 데이터프레임으로 만들고 출력한다.

 

 

BeautifulSoup 참고

select 함수, select_one 함수에 대한 설명을 링크를 통해 더 알아보자. 여러 가지 속성을 가지고 있으므로 필요에 따라 사용하도록 하자.