OkBublewrap

@코스메 한국 브랜드 화장품 데이터베이스 구축(5) 본문

Python/프로젝트

@코스메 한국 브랜드 화장품 데이터베이스 구축(5)

옥뽁뽁 2025. 3. 1. 19:43

1. review_text TABLE

2025-02-28 12:55:28,417 - ERROR - Error fetching 510549066: HTTPSConnectionPool(host='www.cosme.net', port=443): Read timed out. (read timeout=5)

 

이전에 진행했던 코드로 에러가 발생했다. 연결하는 시간이 적었던 모양이다.

추후에 리뷰가 있는 review_id를 가져와 없는 review_id를 추출해서 리뷰 텍스트를 크롤링 진행

 

def get_review_id_in():
    """기존 적재된 review_id 리스트 가져오기"""
    conn = sqlite3.connect(DB_NAME)
    cursor = conn.cursor()
    cursor.execute("SELECT review_text FROM review_text")
    review_ids_in = [row[0] for row in cursor.fetchall()]
    conn.close()

    logging.info(f"Successfully fetched {len(review_ids_in)} review IDs in")
    return review_ids_in

 

 

main()

review_ids_list = set(get_review_id())      # 전체 리뷰 ID
review_ids_list_in = set(get_review_id_in())  # 이미 저장된 리뷰 ID # 수정 부분
new_review_ids = list(review_ids_list - review_ids_list_in) # 수정 부분

 

@retry(
    wait=wait_exponential(multiplier=1, min=2, max=10),
    stop=stop_after_attempt(3),
    retry=retry_if_exception_type((RequestException, Timeout))  # 특정 네트워크 오류만 재시도
)
def fetch(review_id):
    """웹페이지 요청 후 리뷰 텍스트 크롤링 (재시도 추가)"""
    try:
        url = cosme_url['review_text'] + f"{review_id}/"
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # HTTP 에러 발생 시 예외 발생

        soup = BeautifulSoup(response.text, "html.parser")
        time.sleep(random.uniform(2, 4))

        review_text_element = soup.find("p", class_="read")
        if review_text_element:
            return (review_id, review_text_element.get_text(" ", strip=True))
        else:
            logging.warning(f"[{review_id}] No review text found.")
            return None

    except HTTPError as e:
        if response.status_code == 404:
            logging.warning(f"[{review_id}] Page not found (404), skipping.")
            return None  # 404면 재시도 안 함
        raise  # 다른 HTTP 에러는 재시도

    except RequestException as e:
        logging.error(f"[{review_id}] Network error: {e}")
        raise  # 네트워크 오류는 재시도

    except Exception as e:
        logging.error(f"[{review_id}] Unexpected error: {e}")
        return None  # 기타 오류는 재시도 없이 바로 종료

 

@retry 데코레이터

재시도 간격 최소 2초 ~ 최대 10초

최대 3번까지만 재시도

timeout 10초까지 늘림

 

🚨 2025-03-01 13:42:14,992 - ERROR - [513718461] Network error: HTTPSConnectionPool(host='www.cosme.net', port=443): Read timed out. (read timeout=60)

 

아무리 기다리는 시간을 늘어도 내 컴퓨터의 한계인것 같다.

쓰레드 숫자도 줄었으나 실패, 더이상은 데이터 수집을 못할 것 같다.

product_detail만 새로 수집하고 scrapy 프레임워크로 코드를 다시 작성을 해야겠다.

가장 중요한 것은 이것을 가지고 무엇을 할까인데.

시계열 랭킹 변환하는 것, 각 제품의 리뷰 분석 정도 되지 않을까.

 

ERD

최종 결과물