93 lines
4.9 KiB
Python
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
|