728x90
◆ 목차
- 생성형 AI 활용
- yes24 서점 사이트 수집
- 아마존 서점 사이트 분석
- 다양한 제품군을 활용한 지텐션과 RFM 분석과 보고서
1. 생성형 AI 활용
◆ 생성형 AI 활용
■ faker
- 가짜 데이터를 생성하는 데 유용한 도구
■ faker 사용해서 질문하기
테이블오더라는 식당에서 메뉴를 주문하는 회사에 지원하고 싶어서 관련 프로젝트를 진행하고자해. 주문 정보에 대한 데이터셋을 생성하는 해당 데이터셋에 대한 스키마를 작성하고 데이터셋을 1000 개 이상 생성하는 파이썬 코드를 작성해줘. 단, Faker를 사용해서 해줘야해.
from faker import Faker
import pandas as pd
import random
from datetime import datetime, timedelta
# Faker 객체 생성
fake = Faker()
# 데이터셋을 저장할 데이터프레임 생성
orders = pd.DataFrame(columns=['order_id', 'order_date', 'customer_name', 'table_number', 'menu_item', 'quantity'])
# 날짜 범위 설정 (예: 최근 100일)
start_date = datetime.now() - timedelta(days=100)
end_date = datetime.now()
# 메뉴 항목 리스트 정의 (예시)
menu_items = ['스테이크', '파스타', '피자', '샐러드', '디저트', '음료']
# 데이터셋 생성
for i in range(1000):
order_id = i + 1
order_date = fake.date_time_between(start_date=start_date, end_date=end_date)
customer_name = fake.name()
table_number = random.randint(1, 20)
menu_item = random.choice(menu_items)
quantity = random.randint(1, 5)
orders.loc[i] = [order_id, order_date, customer_name, table_number, menu_item, quantity]
# 데이터셋 확인
orders
# CSV 파일로 저장 (옵션)
# orders.to_csv('orders_dataset.csv', index=False)
■ faker 사용하지 않고
import pandas as pd
import random
from datetime import datetime, timedelta
# 데이터셋을 저장할 데이터프레임 생성
orders = pd.DataFrame(columns=['order_id', 'order_date', 'customer_name', 'table_number', 'menu_item', 'quantity'])
# 날짜 범위 설정 (예: 최근 100일)
start_date = datetime.now() - timedelta(days=100)
end_date = datetime.now()
# 메뉴 항목 리스트 정의 (예시)
menu_items = ['스테이크', '파스타', '피자', '샐러드', '디저트', '음료']
# 데이터셋 생성
for i in range(1000):
order_id = i + 1
order_date = start_date + timedelta(days=random.randint(0, 100), hours=random.randint(0, 23), minutes=random.randint(0, 59))
customer_name = f'고객{i+1}'
table_number = random.randint(1, 20)
menu_item = random.choice(menu_items)
quantity = random.randint(1, 5)
orders.loc[i] = [order_id, order_date, customer_name, table_number, menu_item, quantity]
# 데이터셋 확인
orders
# CSV 파일로 저장 (옵션)
orders.to_csv('orders_dataset.csv', index=False)
◆ mermaid 코드 시각화
생성형 AI에서
-chat_gpt
graph TD A[시작] --> B[기본 URL 설정] B --> C[첫 번째 페이지 접속 및 HTML 가져오기] C --> D[페이지 번호 설정] D --> E[현재 페이지 URL 생성] E --> F[다음 페이지 버튼 확인] F -->|있음| G[다음 페이지로 이동] G --> H[URL 수집] H --> I[다음 페이지 번호 증가] I --> E F -->|없음| J[수집 완료] %% 추가 설명 C -->|HTML 가져오기 실패| K[오류 처리] K --> L[프로그램 종료]
- perplexity
graph TD A[시작] --> B[웹 스크래핑 라이브러리 선택] B --> C[웹 페이지 요청 및 HTML 파싱] C --> D[페이지 구조 분석] D --> E[도서 URL 추출 로직 개발] E --> F[페이지네이션 처리] F --> G[중복 URL 제거] G --> H[에러 처리 및 예외 상황 대비] H --> I[추출된 URL 저장] I --> J[결과 검증] J --> K[종료]
■ excalidraw에서 Mermaid 불러오기
- AI 클릭 -> Mermaid에서 불러오기 클릭 -> 붙여넣기
■ sequence diagram 그리기
-chat_gpt
HTTP 요청과 응답에 대한 시퀀스다이어그램을 시각화 할거야.
HTTP 통신을 통해 데이터를 수집하는 과정을 그리는데 클라이언트와 서버, 저장까지 sequenceDiagram 으로 mermaid 로 시각화 할 수 있게 과정을 최대한 자세하게 작성할 것
- mermaid 코드 시각화
sequenceDiagram
participant Client
participant Yes24_Server
participant Data_Store
Client->>Yes24_Server: HTTP GET /24/Category/BestSeller
Yes24_Server-->>Client: HTML 응답 (도서 목록 페이지)
Client->>Client: HTML 파싱하여 도서 정보 추출
Client->>Data_Store: 도서 정보 저장 요청
Data_Store-->>Client: 저장 완료 응답
2. yes24 서점 사이트 수집
◆ yes24 도서 목록 수집 1)
- chat gpt
다음 페이지의 도서 목록을 수집하고자 합니다. 해당 URL 의 도서 목록을 수집하는 파이썬 코드 작성하고 중간 단계에 수집이 잘 되고 있는지 확인하는 코드도 함께 작성할 것. 나온 결과를 test_books 라고 csv 파일로 저장하고 싶어. https://www.yes24.com/24/Category/Display/001001003031?PageNumber=1
import requests
from bs4 import BeautifulSoup
import csv
def get_books(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
books = soup.select('.goods_name > a')
book_titles = [book.get_text(strip=True) for book in books]
return book_titles
else:
print(f"Failed to retrieve page. Status code: {response.status_code}")
return []
def save_to_csv(filename, data):
with open(filename, mode='w', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Book Title'])
for title in data:
writer.writerow([title])
# URL 템플릿 정의
base_url = 'https://www.yes24.com/24/Category/Display/001001003031?PageNumber={}'
# 도서 제목들을 담을 리스트
all_books = []
# 페이지 번호를 변경하면서 도서 목록 수집
for page_number in range(1, 6): # 예를 들어, 1부터 5페이지까지 수집
url = base_url.format(page_number)
print(f"Fetching books from {url}")
book_titles = get_books(url)
all_books.extend(book_titles)
# CSV 파일로 저장
csv_filename = 'test_books.csv'
save_to_csv(csv_filename, all_books)
print(f"Saved {len(all_books)} books to {csv_filename}")
위에 코드에서 수집하고 싶은 정보가 더 있었기 때문에 해당 요소를 뿌리고 수집요청함.
난 이 아래 정보를을 수집하고 싶어. <div class="goods_info"> <div class="goods_keynote"> <span class="iconC event"><em class="txt">이벤트</em></span> </div> <div class="goods_name"> <span class="gd_nameF">개념 이해로 시작하기 좋은</span> <a href="/Product/Goods/126690830">최고의 프롬프트 엔지니어링 강의</a> <span class="gd_nameE"></span> <span class="gd_feature"> </span> <a href="/Product/Goods/126690830" class="bgYUI ico_nWin" target="_blank"></a> </div> <div class="goods_pubGrp"> <span class="goods_auth"> <a href="https://www.yes24.com/Product/Search?domain=ALL&query=%ea%b9%80%ec%a7%84%ec%a4%91&author=%ea%b9%80%ec%a7%84%ec%a4%91&auth_no=188279" target="_blank">김진중</a> 저 </span> <em class="divi">|</em> <span class="goods_pub">리코멘드</span> <em class="divi">|</em> <span class="goods_date">2024년 06월</span> </div> <!--특징2--> <dl class="goods_present"> <dt><em class="bgYUI ico_present">구매혜택</em></dt> <dd> [월간개발자 7월호] 김진중 저자 도서 포함 3만원 이상 구매시, 리딩트래커 (포인트 차감, 한정수량) </dd> </dl> <div class="goods_price"> <em class="yes_b">21,600</em>원 <span class="goods_benefit">(10% 할인)</span> <em class="bgYUI ico_point">포인트적립</em> 1,200원 </div> <div class="goods_rating"> <span class="gd_reviewCount"> 회원리뷰(<em class="txC_blue">3</em>건) </span> <span class="gd_rating"> <span class="bgYUI total_rating total_rating_8">리뷰 총점</span><em class="yes_b">7.4</em> <span class="moreRatingArea"> <span class="moreRatingBtn"><a href="javascript:void(0);" onclick="toggleLiCont(this,$('.cCont_listArea'),event);" class="bgYUI">정보 더 보기/감추기</a></span> <span class="moreRatingLi"> <span class="moreRatingLiRow"> <ul class="yesAlertLi"> <li><em class="bl_dot bgYUI"> </em>종이책 리뷰 (0건)</li> <li><em class="bl_dot bgYUI"> </em>eBook 리뷰 (0건)</li> <li><em class="bl_dot bgYUI"> </em>종이책 한줄평 (3건)</li> <li><em class="bl_dot bgYUI"> </em>eBook 한줄평 (0건)</li> </ul> </span> </span> </span> </span> </div> <div class="goods_deli" name="delvTextArea"><span class="deli_des">22시까지 주문하면 <strong class="deli_act">내일 아침 7시 전(7/17, 수)</strong> 도착예정 </span></div> <!--전자책/오디오북/디지털상품 안내 시작--> <!--전자책/오디오북/디지털상품 안내 종료--> <!--분철서비스 시작--> <div class="goods_spring"> 분철서비스 이용이 가능한 도서입니다. <a href="https://www.yes24.com/campaign/01_book/2020/0304File.aspx" class="btnC s_size" target="_blank"><span class="bWrap"><em class="txt">자세히 보기</em><em class="bgYUI ico_goS"></em></span></a> </div> <!--분철서비스 종료--> <!--알림신청 시작--> <!--알림신청 종료--> <!--구매시참고문구 시작--> <!--구매시참고문구 종료--> <div class="goods_read"> LLM의 기초 개념부터 제대로 파고드는 최고의 프롬프트 엔지니어링 강의프롬프트 엔지니어링이라면 흔히 ‘AI에게 질문하는 방법’이라고 생각하는 경우가 많지만, 정확히 말하면 ‘AI로부터 높은 수준의 결과물을 얻기 위한 양질의 프롬프트를 구성하는 작업’이라고 할 수 있다. 우리가 작성하는 프롬프트가 단순히 검색 ... </div> <div class="goods_eve"> <ul class="yesAlertLi"> <li><em class="bgYUI bl_dot"></em><em class="txC_blue">[선착순]</em> <em class="txC_blue">[사은품]</em> <a href="https://www.yes24.com/campaign/01_book/2023/BrandAuthor.aspx?EventNo=244843">우리가 꿈꾸던 AI 자동화 세상 - 생성형 AI 기획전</a> <em class="txC_gray">(24.02.28 ~ 한정 수량)</em> <a href="https://www.yes24.com/campaign/01_book/2023/BrandAuthor.aspx?EventNo=244843" target="_blank"><em class="bgYUI ico_nWin">새창 이동</em></a></li> <li><em class="bgYUI bl_dot"></em><em class="txC_blue">[선착순]</em> <em class="txC_blue">[사은품]</em> <a href="https://event.yes24.com/template?eventNo=249297">월간 개발자 2024년 7월호</a> <em class="txC_gray">(24.06.28 ~ 24.07.31)</em> <a href="https://event.yes24.com/template?eventNo=249297" target="_blank"><em class="bgYUI ico_nWin">새창 이동</em></a></li> </ul> </div> </div>
import requests
from bs4 import BeautifulSoup
import csv
def get_books_info(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
books = []
book_items = soup.select('.goods_info') # 각 도서 정보를 포함하는 전체 요소 선택
for item in book_items:
title_elem = item.select_one('.goods_name a')
title = title_elem.get_text(strip=True) if title_elem else 'Unknown'
author_elem = item.select_one('.goods_auth a')
author = author_elem.get_text(strip=True) if author_elem else 'Unknown'
price_elem = item.select_one('.goods_price em.yes_b')
price = price_elem.get_text(strip=True) if price_elem else 'Unknown'
publisher_elem = item.select_one('.goods_pub')
publisher = publisher_elem.get_text(strip=True) if publisher_elem else 'Unknown'
pub_date_elem = item.select_one('.goods_date')
pub_date = pub_date_elem.get_text(strip=True) if pub_date_elem else 'Unknown'
content_elem = item.select_one('.goods_read')
content = content_elem.get_text(strip=True) if content_elem else 'Unknown'
benefits_elem = item.select_one('.goods_present dd')
benefits = benefits_elem.get_text(strip=True) if benefits_elem else 'Unknown'
book = {
'Title': title,
'Author': author,
'Price': price,
'Publisher': publisher,
'Pub_date': pub_date,
'Content': content,
'Benefits': benefits
}
books.append(book)
return books
else:
print(f"Failed to retrieve page. Status code: {response.status_code}")
return []
def save_to_csv(filename, data):
with open(filename, mode='w', encoding='utf-8-sig', newline='') as file:
writer = csv.DictWriter(file, fieldnames=['Title', 'Author', 'Price', 'Publisher', 'Pub_date', 'Content', 'Benefits'])
writer.writeheader()
writer.writerows(data)
# URL 템플릿 정의
base_url = 'https://www.yes24.com/24/Category/Display/001001003031?PageNumber={}'
# 도서 정보들을 담을 리스트
all_books_info = []
# 페이지 번호를 변경하면서 도서 목록 수집
for page_number in range(1, 6): # 예를 들어, 1부터 5페이지까지 수집
url = base_url.format(page_number)
print(f"Fetching books info from {url}")
books_info = get_books_info(url)
all_books_info.extend(books_info)
# CSV 파일로 저장
csv_filename = 'books_info.csv'
save_to_csv(csv_filename, all_books_info)
print(f"Saved {len(all_books_info)} books' info to {csv_filename}")
◆ yes24 도서 목록 수집 2)
- chat gpt
다음 정보를 바탕으로 데이터 수집을 하려고해.
Request URL: https://www.yes24.com/24/Category/Display/001001003031?PageNumber=1
Request Method:GET
Status Code:200 OK
해당 페이지에서 도서 목록을 수집하고자 합니다. 수집하고자 하는 도서목록의 정보는 다음 HTML 구조로 되어 있습니다.
<div class="goods_info"> <div class="goods_keynote"> <span class="iconC event"><em class="txt">이벤트</em></span> </div> <div class="goods_name"> <span class="gd_nameF">개념 이해로 시작하기 좋은</span> <a href="/Product/Goods/126690830">최고의 프롬프트 엔지니어링 강의</a> <span class="gd_nameE"></span> <span class="gd_feature"> </span> <a href="/Product/Goods/126690830" class="bgYUI ico_nWin" target="_blank"></a> </div> <div class="goods_pubGrp"> <span class="goods_auth"> <a href="https://www.yes24.com/Product/Search?domain=ALL&query=%ea%b9%80%ec%a7%84%ec%a4%91&author=%ea%b9%80%ec%a7%84%ec%a4%91&auth_no=188279" target="_blank">김진중</a> 저 </span> <em class="divi">|</em> <span class="goods_pub">리코멘드</span> <em class="divi">|</em> <span class="goods_date">2024년 06월</span> </div> <!--특징2--> <dl class="goods_present"> <dt><em class="bgYUI ico_present">구매혜택</em></dt> <dd> [월간개발자 7월호] 김진중 저자 도서 포함 3만원 이상 구매시, 리딩트래커 (포인트 차감, 한정수량) </dd> </dl> <div class="goods_price"> <em class="yes_b">21,600</em>원 <span class="goods_benefit">(10% 할인)</span> <em class="bgYUI ico_point">포인트적립</em> 1,200원 </div> <div class="goods_rating"> <span class="gd_reviewCount"> 회원리뷰(<em class="txC_blue">3</em>건) </span> <span class="gd_rating"> <span class="bgYUI total_rating total_rating_8">리뷰 총점</span><em class="yes_b">7.4</em> <span class="moreRatingArea"> <span class="moreRatingBtn"><a href="javascript:void(0);" onclick="toggleLiCont(this,$('.cCont_listArea'),event);" class="bgYUI">정보 더 보기/감추기</a></span> <span class="moreRatingLi"> <span class="moreRatingLiRow"> <ul class="yesAlertLi"> <li><em class="bl_dot bgYUI"> </em>종이책 리뷰 (0건)</li> <li><em class="bl_dot bgYUI"> </em>eBook 리뷰 (0건)</li> <li><em class="bl_dot bgYUI"> </em>종이책 한줄평 (3건)</li> <li><em class="bl_dot bgYUI"> </em>eBook 한줄평 (0건)</li> </ul> </span> </span> </span> </span> </div> <div class="goods_deli" name="delvTextArea"><span class="deli_des">22시까지 주문하면 <strong class="deli_act">내일 아침 7시 전(7/17, 수)</strong> 도착예정 </span></div> <!--전자책/오디오북/디지털상품 안내 시작--> <!--전자책/오디오북/디지털상품 안내 종료--> <!--분철서비스 시작--> <div class="goods_spring"> 분철서비스 이용이 가능한 도서입니다. <a href="https://www.yes24.com/campaign/01_book/2020/0304File.aspx" class="btnC s_size" target="_blank"><span class="bWrap"><em class="txt">자세히 보기</em><em class="bgYUI ico_goS"></em></span></a> </div> <!--분철서비스 종료--> <!--알림신청 시작--> <!--알림신청 종료--> <!--구매시참고문구 시작--> <!--구매시참고문구 종료--> <div class="goods_read"> LLM의 기초 개념부터 제대로 파고드는 최고의 프롬프트 엔지니어링 강의프롬프트 엔지니어링이라면 흔히 ‘AI에게 질문하는 방법’이라고 생각하는 경우가 많지만, 정확히 말하면 ‘AI로부터 높은 수준의 결과물을 얻기 위한 양질의 프롬프트를 구성하는 작업’이라고 할 수 있다. 우리가 작성하는 프롬프트가 단순히 검색 ... </div> <div class="goods_eve"> <ul class="yesAlertLi"> <li><em class="bgYUI bl_dot"></em><em class="txC_blue">[선착순]</em> <em class="txC_blue">[사은품]</em> <a href="https://www.yes24.com/campaign/01_book/2023/BrandAuthor.aspx?EventNo=244843">우리가 꿈꾸던 AI 자동화 세상 - 생성형 AI 기획전</a> <em class="txC_gray">(24.02.28 ~ 한정 수량)</em> <a href="https://www.yes24.com/campaign/01_book/2023/BrandAuthor.aspx?EventNo=244843" target="_blank"><em class="bgYUI ico_nWin">새창 이동</em></a></li> <li><em class="bgYUI bl_dot"></em><em class="txC_blue">[선착순]</em> <em class="txC_blue">[사은품]</em> <a href="https://event.yes24.com/template?eventNo=249297">월간 개발자 2024년 7월호</a> <em class="txC_gray">(24.06.28 ~ 24.07.31)</em> <a href="https://event.yes24.com/template?eventNo=249297" target="_blank"><em class="bgYUI ico_nWin">새창 이동</em></a></li> </ul> </div> </div>
해당 페이지에서 도서 제목 뿐만아니라 별점, 리뷰수, 상세 설명 등 수집할 수 있는 내용을 모두 수집해서 판다스 데이터프레임으로 반환하는 코드를 작성해 주세요.
코드 중간에 수집이 잘 되고 있는지 확인하는 코드도 함께 작성하고 예외처리까지 작성해 주세요.
import requests
from bs4 import BeautifulSoup
import pandas as pd
def fetch_book_data(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.content, 'html.parser')
books = []
# Find all book items
book_elements = soup.find_all('div', class_='goods_info')
for book in book_elements:
# Extracting data for each book
title = book.find('div', class_='goods_name').find('a').text.strip()
author = book.find('div', class_='goods_pubGrp').find('a').text.strip()
publication_date = book.find('div', class_='goods_pubGrp').find('span', class_='goods_date').text.strip()
price = book.find('div', class_='goods_price').find('em', class_='yes_b').text.strip()
rating = book.find('div', class_='goods_rating').find('em', class_='yes_b').text.strip()
review_count = book.find('span', class_='gd_reviewCount').find('em', class_='txC_blue').text.strip()
description = book.find('div', class_='goods_read').text.strip()
# Store data in dictionary
book_info = {
'Title': title,
'Author': author,
'Publication Date': publication_date,
'Price': price,
'Rating': rating,
'Review Count': review_count,
'Description': description
}
books.append(book_info)
return pd.DataFrame(books)
else:
print(f'Failed to retrieve page, status code: {response.status_code}')
return None
except requests.exceptions.RequestException as e:
print(f'Error fetching page: {e}')
return None
# Example usage:
url = 'https://www.yes24.com/24/Category/Display/001001003031?PageNumber=1'
books_df = fetch_book_data(url)
if books_df is not None:
print(books_df.head())
else:
print('Failed to fetch data.')
books_df
☞ 이렇게 데이터프레임으로 도서 목록을 잘 정리하여 가지고 왔다.
■ 데이터 수집을 위한 프롬프트
1) HTTP 헤더 정보를 네트워크 메뉴에서 찾아서 넣어주세요.
2) HTML 페이지라면 DOC에서 해당 outerHTML 정보를 복사해서 넣어주세요.
3) 예외처리 문구를 추가하고 제대로 수집이 되고 있는지 확인하는 코드도 함께 작성해 달라고 해주세요.
4) 파일이나 데이터베이스로 저장하고 잘 저장이 되었는지 확인하는 코드도 함께 작성합니다.
728x90
'데이터분석 부트캠프' 카테고리의 다른 글
데이터분석 부프캠프 14기 - 12주차_Tablea (0) | 2024.07.12 |
---|---|
SQL 프로젝트_Olist 분석 (0) | 2024.07.07 |
vsCode에서 MySQL 연동하기 (0) | 2024.06.25 |
데이터분석 부프캠프 14기 - 9주차_MySQL (2) | 2024.06.19 |
데이터 관련 직무 (0) | 2024.06.12 |