TaoSourcerer/scraping_thread.py

93 lines
4.9 KiB
Python

from PyQt5.QtCore import QThread, pyqtSignal
from naverParser import parse_naver_shopping
import sqlite3
import time, json
from random import randint
import logging
# 로거 인스턴스 가져오기
logger = logging.getLogger('default_logger')
class ScrapingThread(QThread):
progress_updated = pyqtSignal(int, int)
def __init__(self, conn, keywords, isBranch, branchCount, json_data, overPrice, sortcount, parent=None):
super(ScrapingThread, self).__init__(parent)
self.conn = conn
self.keywords = keywords
self.overPrice = overPrice
self.sortcount = sortcount
self.isBranch = isBranch
self.branchCount = branchCount
# naver_code가 아닌 naver_codes로 변수명 변경하여 리스트 처리를 명시
self.json_data = json_data
# self.codes = codes
# JSON 데이터와 카테고리 초기화
# self.categories = {"category1Name": {}, "category2Name": {}, "category3Name": {}, "category4Name": {}}
# self.json_data = self.loadJsonData()
def run(self):
total_items = len(self.keywords)
# for idx, keyword in enumerate(self.keywords):
for idx, keyword in enumerate(self.keywords):
logger.debug("네이버쇼핑 스크래핑 쓰레드 시작")
# try:
# naver_code = self.naver_codes[idx] # idx를 사용하여 해당 키워드에 맞는 naver_code를 선택
# except IndexError:
# logging.error(f"IndexError: 'naver_codes' 리스트의 길이가 충분하지 않습니다. idx={idx}")
# naver_code = "" # 기본 naver_code 값을 설정하거나 오류 처리
parse_naver_shopping(idx, keyword, self.isBranch, self.branchCount, self.json_data, self.conn, self.overPrice, self.sortcount)
current_progress = idx + 1
self.progress_updated.emit(total_items, current_progress)
sleep_time_for_scraping = randint(1, 4)
time.sleep(sleep_time_for_scraping)
logger.debug(f"{idx}/{total_items} 상품 진행 완료")
# def loadJsonData(self):
# try:
# with open("Percenty_SS_Code.json", "r", encoding='utf-8') as file:
# for line in file:
# item = json.loads(line)
# # 'category3Name'과 'category4Name'의 '$numberDouble':"NaN"을 처리
# if isinstance(item.get("category3Name"), dict) and "$numberDouble" in item["category3Name"]:
# item["category3Name"] = "" # 또는 None 사용
# if isinstance(item.get("category4Name"), dict) and "$numberDouble" in item["category4Name"]:
# item["category4Name"] = "" # 또는 None 사용
# self.json_data.append(item)
# except FileNotFoundError:
# logger.info("Percenty_SS_Code.json 파일을 찾을 수 없습니다.")
# logger.debug("Percenty_SS_Code.json 파일을 찾을 수 없습니다.")
# self.json_data = [] # 파일이 없을 경우 빈 리스트 할당
# def loadCategories(self):
# self.categories = {"category1Name": {}, "category2Name": {}, "category3Name": {}, "category4Name": {}}
# try:
# for item in self.json_data:
# cat1 = item.get("category1Name")
# cat2 = item.get("category2Name")
# cat3 = item.get("category3Name", None)
# cat4 = item.get("category4Name", None)
# # category3Name과 category4Name 처리
# cat3 = item.get("category3Name", None)
# cat4 = item.get("category4Name", None)
# if isinstance(cat3, dict) and "$numberDouble" in cat3:
# cat3 = None # "$numberDouble":"NaN"일 경우 None으로 처리
# if isinstance(cat4, dict) and "$numberDouble" in cat4:
# cat4 = None # "$numberDouble":"NaN"일 경우 None으로 처리
# # 계층 구조 구축
# if cat1 not in self.categories["category1Name"]:
# self.categories["category1Name"][cat1] = {"category2Name": {}}
# if cat2 and cat2 not in self.categories["category1Name"][cat1]["category2Name"]:
# self.categories["category1Name"][cat1]["category2Name"][cat2] = {"category3Name": {}}
# if cat3 and cat3 not in self.categories["category1Name"][cat1]["category2Name"][cat2]["category3Name"]:
# self.categories["category1Name"][cat1]["category2Name"][cat2]["category3Name"][cat3] = {"category4Name": {}}
# if cat4:
# self.categories["category1Name"][cat1]["category2Name"][cat2]["category3Name"][cat3]["category4Name"][cat4] = True
# except Exception as e:
# logger.info(f"카테고리 로딩 에러 {e}")
# logger.debug(f"카테고리 로딩 에러 {e}")
# return