from pymongo import MongoClient
import requests
from bs4 import BeautifulSoup

client = MongoClient('mongodb://test:test@localhost', 27017)
db = client.dbrecipefilter
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

ingreSet = set()

# 만개의 레시피 3페이지 까지 크롤링
for i in range(0, 3):
    index = i + 1
    url = f'https://www.10000recipe.com/recipe/list.html?order=reco&page={index}'
    data = requests.get(url, headers=headers)
    soup = BeautifulSoup(data.text, 'html.parser')
    trs = soup.select('#contents_area_full > ul > ul > li')
    trsText = soup.select(
        '#contents_area_full > ul > ul > li > div.common_sp_caption > div.common_sp_caption_tit.line2')
    trsHlk = soup.select('#contents_area_full > ul > ul > li > div.common_sp_thumb > a')
    trsImg = soup.select('#contents_area_full > ul > ul > li > div.common_sp_thumb > a > img')
    # print(trs)
    print()
    print(f'page: {index}')

    #페이지 마다 있는 레시피의 수 만큼 다시 for loop
    # 하나씩페이지에 들어가서 상세정보 크롤링
    for i in range(0, len(trsImg)):
        title = trsText[i].text
        specialChars = "'-#$%^&*()/"
        # description에 있는 특수 문자를 공백을 대체
        for specialChar in specialChars:
            title = title.replace(specialChar, ' ').rstrip()
        hlk = trsHlk[i]['href']
        url_detail = url.split("/recipe")[0] + hlk
        imgSource = trsImg[i]['src']

        # print()
        # print(f'title: {title}')
        # print(f'hyperlink: {hlk}')
        # print(f'img: {imgSource}')
        # print(f'detail_info_link: {url_detail}')

        doc = {'title': title, 'hyperlink': url_detail, 'image': imgSource}

        data = requests.get(url_detail, headers=headers)
        soup2 = BeautifulSoup(data.text, 'html.parser')

        trsDesc = soup2.select_one('#recipeIntro')
        if trsDesc is not None:
            desc = trsDesc.text.strip()
            # print(f'description: {desc}')
            doc['description'] = desc

        trsDetail = soup2.select('#divConfirmedMaterialArea > ul > a > li')

        # 육류: category1
        # 어류: category2
        # 유제품류: category3
        # 탄수화물류: category4
        # 야채류: category5
        meatSet = {'오리 훈제', '스팸 작은거', '차돌 또는 등심', '소고기(양지)', '돼지고기 (앞다리살)', '베이컨 작은 거', '돈까스', '국거리소고기', '훈제오리',
                   '닭 가슴살', '소고기(불고기감)',
                   '후랑크소시지', '베이컨 썰은 거', '오리', '돼지고기 목살', '후랑크 소세지', '돼지앞다리살', '소고기 불고기용', '닭봉(한가지만 사용해도 됨)', '소고기',
                   '닭 앞다리살', '남은치킨',
                   '쇠고기 다짐육', '소시지(또는 햄)', '통조림 햄', '닭 볶음탕용', '샤브용 소고기', '한우 소고기 (살치살)', 'HACCP인증 델리 햄', '얇게 썬 소고기',
                   '스팸 큰 거', '스팸 또는 리챔',
                   '프랑크 소시지', '치킨스톡', '항정살', '차돌박이(혹은 불고기)', '돼지고기목살', '소시지', '간 돼지고기', '소고기(살치살)', '스팸(작은것)',
                   '쇠고기(등심)', '대패삼겹살', '돼지등갈비',
                   '닭가슴살 통조림(중간크기)', '쇠고기등심(불고기용)', '돼지고기 불고기용', '감자큰거', '두툼한 돼지고기', '한우양지', '돼지고기앞다리살', '비엔나소시지',
                   '닭 (다리살)', '닭다리 살',
                   '소고기 불고기감', '닭봉', '닭고기 정육', '슬라이스햄', '닭다리살', '스팸 작은 것', '비엔나 소세지', '돼지고기삼겹살', '치킨너겟', '다진소고기',
                   '후랑크소세지', '삼겹살', '소고기 술라이스 (불고깃감)',
                   '소고기 갈빗살', '소고기 척아이롤', '살치살', '훈제 닭가슴살', '등갈비', '다진 돼지고기', '통삼겹살', '돼지고기앞다리', '갈은 소고기', '스팸 또는 베이컨',
                   '닭가슴살(닭다리살/닭안심)',
                   '돼지 앞다리살', '간돼지고기', '스팸 다진것', '스팸', '불고기용 소고기', '돼지고기앞다리살(제육용)', '삽겹살', '닭가슴살', '닭가슴살 소세지', '쇠고기',
                   '돼지등뼈',
                   '후랑크 소시지', '스팸 작은 거', '리챔', '돼지목살', '치킨 너겟', '소고기국거리', '닭다리', '정육된 닭다리살', '통조림 햄 제일 작은거', '소고기불고기',
                   '볶음탕용 닭한마리',
                   '비엔나소시지 통통한 거', '닭가슴살통조림', '갈은 돼지고기', '꼬꼬빌 닭가슴살', '목살', '닭고기', '돼지고기다짐육', '닭가슴살 통조림', '프랑크소시지',
                   '스팸(마일드)', '베이컨',
                   '닭안심', '스테이크용 소고기등심', '닭(볶음용)', '햄 or 소세지', '비엔나 소세지 10개정도', '소고기 국거리용', '소고기등심', '소고기 다짐육',
                   '분홍 소시지', '다진돼지고기',
                   '닭', '오리훈제 슬라이스', '닭가슴살 통조림(135g)', '베이컨이나 돼지고기 안심', '통조림 닭가슴살', '미니 돈까스', '스팸(小)', '대패 삼겹살', '햄',
                   '비엔나소세지', '비엔나소세지 작은거', '차돌박이', '치킨스톡(생략가능)'}

        fishSet = {'쭈꾸미', '꽁치캔', '낙지(大)', '손질된 고등어', '숙성 연어', '손질한 새우', '손질된 오징어', '훈제 오리고기', '마일드 참치', '명태살', '생새우',
                   '오징어(중사이즈)', '손질 고등어',
                   '생카테일새우or자숙새우', '참치캔 1개', '데친 새우', '관자', '참치 150g', '홍합', '잘게 다진 새우살', '참치통조림', '자숙새우(칵테일새우)',
                   '고추참치', '낙지', '참치', '건새우',
                   '크래미 또는 맛살', '자반고등어', '참치캔(100g)', '어묵', '캔참치', '오징어 자른것', '참치캔', '통조림참치캔', '참치캔 (中)', '참치 통조림',
                   '꼬막',
                   '참치(작은캔)', '연어 살', '오징어(小)', '자숙새우', '참치 큰캔', '칵테일새우 또는 자숙새우', '오징어다리', '냉동 새우', '참치 캔', '통조림참치',
                   '손질 오징어', '오징어몸통',
                   '깐새우', '참치캔 150g짜리', '연어', '고등어', '냉동 새우살', '새우', '냉동새우', '칵테일새우', '황태채', '오징어', '칵테일 새우', '멸치',
                   '전복'}

        carboSet = {'옥수수 전분', '또띠아', '햇감자 주먹만한크기', '참드림쌀 밥', '공기밥', '옥수수 가루', '백설탕', '밥 작은', '자투리 모닝빵', '고구마(작은 것)',
                    '옥수수 콘', '잉글리시 머핀',
                    '즉석밥', '작은감자', '바게트빵', '밥(150g이하)', '전분 또는 밀가루', '카스테라 빵', '감자(중간사이즈)', '따뜻한 밥', '또띠아 8인치', '삶은 당면',
                    '베이글', '토스트식빵', '감자 (손바닥만한크기)',
                    '고구마(찐것)', '구운 고구마', '떡국 떡', '(우유)식빵', '가래떡 (영상에선 한 뼘짜리 두 개 사용)', '작은 고구마', 'HACCP인증 밀가루', '흰쌀밥',
                    '생 쌀', '우리 밀가루', '고구마 (주먹만 한 거)',
                    '밀가루또는 부침가루', '불닭볶음면', '떡', '감자 큰거', '큰감자', '감자(알감자)', '또띠아 20cm', '밀가루 (부침가루○)', '파스타면', '모닝빵',
                    '찬 밥', '부침가루(밀가루)', '파스타 면', '스파게티면', '소면', '고구마 3개 /큰거', '밀가루(아무거나)', '우동사리', '찬밥', '떡국떡', '떡볶이떡',
                    '8인치 또띠아', '바게트', '감자', '밥', '고구마', '불린 당면',
                    '국수', '식빵'}

        milkSet = {'모짜렐라치즈(선택사항)', '흰우유', '플레인요구르트', '크림치즈', '체다 치즈', '체더 슬라이스치즈', '찬 버터', '스틱 모차렐라치즈', '모자렐라 치즈',
                   '모차렐라치즈', '버터 (반죽에 퐁당)',
                   '파마산치즈가루', '실온의 말랑한 버터', '모짜렐라 치즈 한그릇(취향껏', '우유 혹은 두유', '적당한 크기의 감자', '가염버터', '파마산 치즈',
                   '모짜렐라치즈(체다치즈로대체가능)', '실온 플레인 요거트',
                   '따뜻한 우유', '우유', '우유 5g ×', '녹인버터', '모짜렐라치즈', '체다 슬라이스 치즈', '체다치즈', '크림치즈(라이트도 가능)', '모짜렐라슬라이스치즈',
                   '차가운 버터', '치즈', '요플레', '실온 무염버터', '녹인 무염버터', '무염 버터', '저지방 우유', '플레인 요거트', '실온 우유', '플레인 요구르트',
                   '피자치즈',
                   '모짜렐라 치즈', '버터'}

        vegiSet = {'다진홍청양고추', '브로콜리 작은', '빨강파프리카', '페페론치노', '마늘 다진것', '브로컬리', '다진청피망', '완숙토마토', '알배추 작은 거',
                   'HACCP인증 모짜렐라치즈', '슬라이스치즈', '큰무',
                   '얇게 썬 양파', '대파(대)', '풋고추 or 오이고추', '대파 한줌(', '로메인 또는 상추', '대파 큰것', '다진마늘 듬뿍', '깻잎', '고추 또는', '디포리',
                   '청량초', '빨간 파프리카', '양배추(소)',
                   '대파 손가락 길이', '꼬마 새송이', '배추잎 /알배추', '양파 큰사이즈', '다진 홍고추', '양파(소)', '파프리카빨강', '다진홍고추', '청양고추 다진 것',
                   '오이맛고추', '방울토마토', '단호박',
                   '파프리카 노랑이', '통마늘', '상추', '시금치 (잎 부분)', '어린잎 채소', '쪽파 썰어준것', '오이(소)', '당근 작은거', '갈은 마늘', '애호박 다진 것',
                   '콩나물 크게', '양상추', '편 썬 오이',
                   '적양배추', '다진마늘 큰것', '불고기용 고기', '다진대파', '양배추잎', '파프리카 빨강', '채썬 양파', '채썬당근', '홀토마토', '초록 파프리카', '채썬 파',
                   '파프리카 각각', '빨간색 파프리카',
                   '토마토', '대파 초록색 부분 20센티', '버섯', '브로콜리', '노란색 파프리카', '양송이버섯(crimini mushrooms)', '새송이 버섯', '양송이',
                   '빨간고추', '채썬양파', '무(중간크기)',
                   '잘게 다진 당근', '쪽 파', '송송 썬 대파', '청양고추', '대파 뿌리', '피망', '작은 무', '깐마늘', '양파(느타리버섯)', '오이 &백오이', '잘게 썬 파',
                   '대파(10cm)', '청양초', '양파 수북',
                   '청양고추(혹은크러쉬드레드페퍼)', '마늘(다진 것)', '대파 흰부분', '당근 6cm길이', '대파', '간 마늘', '청상추', '노란파프리카', '아보카도',
                   '홍고추 각각', '콩나물(1봉)', '\u200b 대파', '삼색 버섯',
                   '양파', '작은대파', '채썬 당근', '달래', '채 썬 표고버섯', '배추(노란안쪽만사용)', '로메인', '부추', '아스파라거스', '풋고추', '당근', '청경채',
                   '고추', '파슬리', '가지', '다진 파', '팽이버섯', '간마늘', '송송썰은 대파', '숙주' '시금치', '양상추(샐러드채소)', '무', '양파 작은것', '애호박',
                   '마늘', '파프리카(빨강/노랑) 각', '마늘(편으로썬)', '파프리카(노랑/빨강)', '쪽파or대파', '청 고추 &홍 고추', '알배추', '느타리버섯', '어린잎채소',
                   '작은양파',
                   '노란 파프리카', '파프리카 빨강이', '쌀밥', '새송이버섯', '양배추', '각종자투리 야채', '숙주나물', '다진파', '쪽파 또는 대파', '콩나물', '다진마늘',
                   '대파 잎', '송송 썬 쪽파',
                   '오이고추', '송이버섯', '미니새송이버섯', '데쳐서 물기짠 봄동', '속배추', '표고버섯', '다진 대파', '다진양파', '다진 쪽파', '파프리카', '배추',
                   '노랑파프리카', '오이', '쪽파', '대파 다진거', '양송이버섯', '시금치'}
        # 재료가 하나라도 있다면 카테고리를 생성해서 추가
        if len(trsDetail) != 0:
            i = 1
            for elem in trsDetail:
                ingre = elem.text.strip().split("\n")[0].strip()
                gredNumber = 'ingredient' + str(i)
                doc[gredNumber] = ingre
                if ingre in meatSet:
                    doc['category1'] = '육류'
                elif ingre in fishSet:
                    doc['category2'] = '해물류'
                elif ingre in milkSet:
                    doc['category3'] = '유제품류'
                elif ingre in carboSet:
                    doc['category4'] = '탄수화물류'
                elif ingre in vegiSet:
                    doc['category5'] = '채소류'
                # else:
                #     ingreSet.add(ingre)
                i += 1

        db.dbrecipefilter.insert_one(doc)

# print(ingreSet)
