+ 개발

비동기 웹 크롤링(#무신사)_Gen.AI

AI.Logger 2024. 8. 13. 01:52
  • 수업 내용 리마인드 및 아카이빙 목적의 업로드

"Image generated using DALL-E by  OpenAI"


Q. 아래 URL 첫 페이지 제품들의 브랜드명, 제품명, 정가, 할인가를 모두 크롤링하여 json 파일 형태로 저장해주세요.

https://www.musinsa.com/categories/item/001?device=mw

 

상의 | 무신사 추천 브랜드

무신사에서 상의 관련 상품 리스트와 쇼핑 기획에 대한 자세한 정보를 확인하세요.

www.musinsa.com

 

  • 결과 예시:
    [{
    “brandName” : “브랜드이름”,
    “goodsName” : “제품명“,
    “normalPrice”: “ 정가”,
    “price“ : “할인가”
    }]

 

A. ChatGPT에게 필요한 정보를 제공하고, 프롬프트를 통해 데이터를 파일로 저장하는 코드 작성 요청

1) 필요한 정보 제공하기

  • 설명: API 응답 전체 구조 스크립트를 txt파일로 제공합니다.

 

2) 프롬프트 작성 및 요청하기

너는 웹 크롤링 전문가야. 나는 Musinsa 웹사이트에서 제품 정보를 크롤링하려고 해. 이를 위해 주어진 API를 호출하여 결과를 처리하는 코드를 작성해줘.

#세부사항
API 호출은 GET 메서드를 사용하며, 응답은 JSON 형식이야. 제공된 정보는 '브랜드명', '제품명', '정가', '할인가'로 구성되어 있으며, 이를 각각 'brandName', 'goodsName', 'normalPrice', 'price' 키로 JSON 파일에 저장해줘.

#API URL
https://display.musinsa.com/display/api/v2/categories/ITEM/goods?siteKindId=musinsa&sex=A&sortCode=pop_category&categoryCode=001&size=60&page=1

#API 응답 전체 구조 스크립트
"api_response_20240813_011854.txt" 첨부

 

 

3) ChatGPT 답변 코드 확인하기

  • 1안
import requests
import json

# API URL 설정
api_url = 'https://display.musinsa.com/display/api/v2/categories/ITEM/goods?siteKindId=musinsa&sex=A&sortCode=pop_category&categoryCode=001&size=60&page=1'

# API 호출
response = requests.get(api_url)
api_data = response.json()

# 결과를 담을 리스트
all_datas = []

# goodsList를 순회하며 필요한 정보 추출
for item in api_data['data']['goodsList']:
    product_info = {
        "brandName": item['brandName'],  # 브랜드명
        "goodsName": item['goodsName'],  # 제품명
        "normalPrice": item['normalPrice'],  # 정상가격
        "price": item['price']  # 판매가격
    }
    all_datas.append(product_info)

# JSON 파일로 저장
with open('musinsa_products.json', 'w', encoding='utf-8') as json_file:
    json.dump(all_datas, json_file, ensure_ascii=False, indent=4)

print("JSON 파일로 저장 완료")

 

  • 설명:

1. API URL 설정

주어진 API URL을 통해 데이터를 가져올 준비를 합니다.

 

2. API 호출

requests.get(api_url)을 사용해 API에 요청을 보내고 응답을 받습니다. 응답은 JSON 형식으로 변환됩니다.

 

3. 데이터 추출

api_data에서 goodsList라는 키를 통해 제품 리스트를 가져옵니다. 각 제품에 대해 브랜드명(brandName), 제품명(goodsName), 정상가격(normalPrice), 판매가격(price)을 추출합니다.

 

4. JSON 파일로 저장

추출한 데이터를 musinsa_products.json이라는 이름의 파일로 저장합니다. ensure_ascii=False는 한글이 깨지지 않도록 도와주며, indent=4는 파일을 보기 좋게 들여쓰기해줍니다.

 

5. 결과 출력

마지막으로 "JSON 파일로 저장 완료"라는 메시지가 출력됩니다.

 

 

  • 2안
import requests
import json

# API URL
api_url = "https://display.musinsa.com/display/api/v2/categories/ITEM/goods?siteKindId=musinsa&sex=A&sortCode=pop_category&categoryCode=001&size=60&page=1"

# GET 요청으로 API 호출
response = requests.get(api_url)

# 응답이 성공적인지 확인
if response.status_code == 200:
    # JSON 형태로 응답 데이터 파싱
    data = response.json()

    # 필요한 정보 추출
    products = []
    if 'data' in data and 'goodsList' in data['data']:
        for item in data['data']['goodsList']:
            product_info = {
                'brandName': item.get('brandName'),
                'goodsName': item.get('goodsName'),
                'normalPrice': item.get('normalPrice'),
                'price': item.get('price')
            }
            products.append(product_info)

        # JSON 파일로 저장
        with open('musinsa_products.json', 'w', encoding='utf-8') as f:
            json.dump(products, f, ensure_ascii=False, indent=4)

        print("제품 정보가 'musinsa_products.json' 파일로 저장되었습니다.")
    else:
        print("응답 데이터에 'data' 또는 'goodsList' 키가 존재하지 않습니다.")
else:
    print(f"API 요청 실패: 상태 코드 {response.status_code}")

 

  • 설명: 

1. API를 호출하고 응답을 받기

먼저, requests라는 도구를 사용해서 인터넷에 있는 Musinsa라는 웹사이트에서 정보를 가져옵니다. 이때, 특정 URL(인터넷 주소)을 사용해서 API를 호출하게 되는데, API는 마치 우리가 정보를 달라고 요청할 수 있는 인터넷 상의 비서 같은 역할을 해요.

 
response = requests.get(api_url)

 

 

2. 응답이 성공적인지 확인

웹사이트가 우리 요청에 제대로 응답했는지 확인하는 작업이 필요합니다. 웹사이트가 정보를 성공적으로 보냈다면, 이 정보가 코드에 담기고, 우리는 이 정보를 사용하게 됩니다.

if response.status_code == 200:

여기서 status_code == 200은 "응답이 성공적이다"라는 뜻이에요. 만약 200이 아니라면 응답에 문제가 있다는 뜻이 됩니다.

 

3. JSON 형태로 변환

웹사이트가 보내준 정보는 컴퓨터가 이해할 수 있는 형식으로 되어 있습니다. 이 정보를 우리가 쉽게 사용할 수 있도록 JSON이라는 형식으로 변환해야 합니다.

data = response.json()

이 코드가 바로 정보를 JSON으로 변환하는 역할을 합니다.

 

4. 필요한 정보 추출

이제 JSON으로 변환된 데이터에서 우리가 필요한 부분만 꺼내오는 작업을 합니다. goodsList라는 목록에서 각 상품의 이름, 브랜드, 원래 가격, 할인된 가격 등을 가져옵니다.

products = []
if 'data' in data and 'goodsList' in data['data']:
    for item in data['data']['goodsList']:
        product_info = {
            'brandName': item.get('brandName'),
            'goodsName': item.get('goodsName'),
            'normalPrice': item.get('normalPrice'),
            'price': item.get('price')
        }
        products.append(product_info)

여기서는 각 상품의 정보를 하나씩 읽어서, 그 상품에 대한 정보를 products라는 리스트에 추가합니다.

 

5. 정보 저장

우리가 필요한 정보를 모두 모았다면, 이제 이 정보를 파일로 저장합니다. 이 파일은 musinsa_products.json이라는 이름을 가지고 있고, 우리가 원하는 상품 정보가 이 안에 저장됩니다.

with open('musinsa_products.json', 'w', encoding='utf-8') as f:
    json.dump(products, f, ensure_ascii=False, indent=4)

이렇게 해서, 나중에 이 파일을 열어보면 우리가 저장한 상품 정보들을 확인할 수 있습니다.

 

6. 결과 출력

마지막으로, 모든 과정이 잘 완료되었음을 알리는 메시지를 출력합니다.

print("제품 정보가 'musinsa_products.json' 파일로 저장되었습니다.")

 

 

4) 출력 결과

  • 1안 & 2안 동일
[
    {
        "brandName": "오오엠엘",
        "goodsName": "블러 캣 래글런 스웻셔츠(베이지)",
        "normalPrice": 58800,
        "price": 32900
    },
    {
        "brandName": "디아도라",
        "goodsName": "반디에라 하프 집업 맨투맨 RED",
        "normalPrice": 139000,
        "price": 69500
    },
    {
        "brandName": "백엔포스",
        "goodsName": "FLEET SLOTH Crewneck_GN",
        "normalPrice": 62000,
        "price": 31000
    },
    {
        "brandName": "디아도라",
        "goodsName": "그랜드슬램 플리스 아노락 BROWN",
        "normalPrice": 199000,
        "price": 99500
    },
    {
        "brandName": "닉앤니콜",
        "goodsName": "RIBBED CUT OUT KNIT_NAVY",
        "normalPrice": 69000,
        "price": 55200
    },
    {
        "brandName": "망고",
        "goodsName": "WOMAN 티셔츠 ALPHA Natural 67000462",
        "normalPrice": 49000,
        "price": 14500
    },
    {
        "brandName": "망고",
        "goodsName": "MAN 스웻셔츠 ALASKADS Medium Brown 67030643",
        "normalPrice": 99000,
        "price": 35000
    },
    {
        "brandName": "베이직라벨",
        "goodsName": "기본반전B 오버핏 맨투맨 BMD_0011 (7Color)",
        "normalPrice": 29900,
        "price": 29900
    },
    {
    	<하략>