아래와 같은 형식으로 출력이 되게끔 완성해보세요!
{
"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()