[오늘의 문제] 웹 크롤링

shlim55·2025년 11월 12일

코딩테스트

목록 보기
172/223

아래와 같은 형식으로 출력이 되게끔 완성해보세요!

{
   "name":"Packard 255 G2",
   "price":"$416.99",
   "spec":"15.6\", AMD E2-3800 1.3GHz, 4GB, 500GB, Windows 8.1",
   "img_url":"/images/test-sites/e-commerce/items/cart2.png",
   "detail_url":"/test-sites/e-commerce/static/product/31",
   "star_count":"2",
   "reviews":"2"
}
{
   "name":"Aspire E1-510",
   "price":"$306.99",
   "spec":"15.6\", Pentium N3520 2.16GHz, 4GB, 500GB, Linux",
   "img_url":"/images/test-sites/e-commerce/items/cart2.png",
   "detail_url":"/test-sites/e-commerce/static/product/32",
   "star_count":"3",
   "reviews":"2"
}
{
   "name":"ThinkPad T540p",
   "price":"$1178.99",
   "spec":"15.6\", Core i5-4200M, 4GB, 500GB, Win7 Pro 64bit",
   "img_url":"/images/test-sites/e-commerce/items/cart2.png",
   "detail_url":"/test-sites/e-commerce/static/product/33",
   "star_count":"1",
   "reviews":"2"
}
{
   "name":"ProBook",
   "price":"$739.99",
   "spec":"14\", Core i5 2.6GHz, 4GB, 500GB, Win7 Pro 64bit",
   "img_url":"/images/test-sites/e-commerce/items/cart2.png",
   "detail_url":"/test-sites/e-commerce/static/product/34",
   "star_count":"4",
   "reviews":"8"
}
{
   "name":"ThinkPad X240",
   "price":"$1311.99",
   "spec":"12.5\", Core i5-4300U, 8GB, 240GB SSD, Win7 Pro 64bit",
   "img_url":"/images/test-sites/e-commerce/items/cart2.png",
   "detail_url":"/test-sites/e-commerce/static/product/35",
   "star_count":"3",
   "reviews":"12"
}
{
   "name":"Aspire E1-572G",
   "price":"$581.99",
   "spec":"15.6\", Core i5-4200U, 8GB, 1TB, Radeon R7 M265, Windows 8.1",
   "img_url":"/images/test-sites/e-commerce/items/cart2.png",
   "detail_url":"/test-sites/e-commerce/static/product/36",
   "star_count":"1",
   "reviews":"2"
}

내가 작성한 코드문

import requests # 웹 페이지 요청을 위해
from bs4 import BeautifulSoup # 가져온 문서에서 데이터 추출을 위해

url = "https://webscraper.io/test-sites/e-commerce/static/computers/laptops" # 크롤링하고자 하는 페이지의 URL
res = requests.get(url) # 해당 URL에 해당 요청을 하고, 응답을 받는다 
bs = BeautifulSoup(res.text)

laptops = bs.select("div.col-lg-9 div.row div.col-md-4.col-xl-4.col-lg-4")
print("========")
print(laptops)
data = []
# img.img-fluid.card-img-top.image.img-responsive
for laptop in laptops:
    detailed = laptop.select_one("div.product-wrapper") # product-wrapper부분 추출
    caption = detailed.select_one("div.caption") # caption부분 추출
    rating = detailed.select_one("div.ratings")# ratings부분 추출  이거 세개 활용해서 리팩토링 해보기 

    pic = laptop.select_one("div.product-wrapper img.img-fluid")["src"]# 사진주소 URL
    print(f"사진 주소{pic}")

    name = laptop.select_one("div.product-wrapper div.caption a.title").get_text(strip=True)# 상품이름
    print(f"이름 {name}")

    price = laptop.select_one("div.caption h4.price").get_text(strip=True)# 가격
    print(f"가격 {price}")

    spec = laptop.select_one("div.caption p.description.card-text").get_text(strip=True)# 상세 스펙 테스트
    print(f"상세 스펙 {spec}")

    review = laptop.select_one("div.ratings p.review-count span").get_text(strip=True)# 리뷰 개수
    print(f"리뷰 개수 {review}")

    star = laptop.select_one("div.ratings p[data-rating]")["data-rating"]# 별의 개수(선택)
    print(f"별 개수 {star}") # 파고들어서 data-rating값 추출하기

    page_url = laptop.select_one("div.caption a.title")["href"]# 각 상품의 상세 페이지 주소 URL(선택)
    print(f"상세 페이지 주소 url {page_url}")
    print("============")

    # 키 밸류 형태로 data에 append 

    # 반복문 형태로 출력 

다른 사람의 풀이

import requests
from bs4 import BeautifulSoup

url = "https://webscraper.io/test-sites/e-commerce/static/computers/laptops"
res = requests.get(url)

bs = BeautifulSoup(res.text)
# print(bs)
entire = bs.select("div.col-lg-9 > div.row div.col-md-4.col-xl-4.col-lg-4")
print(len(entire))

data = []
for product in entire: # product 변수 = 상품 하나에 대한 영역 요소
    detailed = product.select_one("div.product-wrapper")

    img_url = detailed.select_one("img.img-fluid")["src"]
    # /images/test-sites/e-commerce/items/cart2.png

    # caption element
    caption = detailed.select_one("div.caption") # caption 영역 추출


    price = caption.select_one("h4.price span").get_text(strip=True)
    # $416.99
    product_name = caption.select_one("h4 a.title").get_text(strip=True)
    # Packard 255 G2

    detail_product_url = caption.select_one("h4 a.title")['href']
    # /test-sites/e-commerce/static/product/31
    '''
    caption.select_one("h4 a.title")
    -> 
    <a href="/test-sites/e-commerce/static/product/31" class="title" title="Packard 255 G2" itemprop="name">
						Packard 255 G2
					</a>
    '''
    spec = caption.select_one("p.description").get_text(strip=True)
    # 15.6", AMD E2-3800 1.3GHz, 4GB, 500GB, Windows 8.1

    # rating element
    rating = detailed.select_one("div.ratings") # ratings 영역 가져오기

    review = rating.select_one("p.review-count span").get_text(strip=True)
    # 2 
    star_count = rating.select_one("p:nth-child(2)")["data-rating"]
    # 2
    '''
    rating.select_one("p:nth-child(2)")
    ->
    <p data-rating="2">
										<span class="ws-icon ws-icon-star"></span>
										<span class="ws-icon ws-icon-star"></span>
									</p>
    '''
    data.append({
        "name" : product_name,
        "price" : price,
        "spec" : spec,
        "img_url" : img_url,
        "detail_url" : detail_product_url,
        "star_count" : star_count,
        "reviews" : review
    })
    # print(img_url, price, product_name, detail_product_url, spec, star_count, review)

for i in data:
    print(i)
    print()
profile
A Normal Programmer

0개의 댓글