꿀벌 대작전 최종 코드

Breeze·2021년 11월 17일
0

Backend 개발 일지

목록 보기
5/7

안녕하세요. 막내 온 탑 수빙수입니다! 부지런히 꿀을 모을 여러분을 위한 선물을 준비했습니다. 바로 가게 리뷰와 평점 개수를 모을 코드입니다. 두 가지 버전으로 준비했으니 취사선택하시면 됩니다.😉 (해당 프로젝트는 상업 목적이 아님을 밝힙니다!)

Version1

아래 코드에서 변경해야할 부분 변경해서 쓰면 됩니다!!

이렇게 해둬도 중간에 forbidden 뜰 수도 있는데, 그럴때는 시작할 번호 다시 잘 확인해서 num에다가 넣고 돌려주면 다시 정상적으로 할 수 있어요~

import time

def get_rate(request):
    # 크롤링 시작할 번호 입력
    num = 47100
    
    # 60000을 각자 자신의 마지막 번호로 바꿔주세요!
    while num < 60000:
        print(num)
        auto_crawl(num)
        # 한 번에 크롤링 할 개수로 변경해주세요!
        num += 150
        time.sleep(600)

def auto_crawl(n):
    review_rate = pd.read_csv('data/review_rate.csv')
    store_data = pd.read_csv('data/store_data.csv')

    options = webdriver.ChromeOptions()
    options.add_argument("no-sandbox") 
    options.add_argument("disable-gpu") 
    options.add_argument("--lang=ko_KR") 
    options.add_argument( 'user-agent=Mozilla/5.0 Chrome/95.0.4638.54')
    
	# 드라이버 각자 위치에 맞게 변경해주세요
    driver = webdriver.Chrome(r"C:\Temp\chromedriver.exe", chrome_options=options)

    # 여기에서 개수를 조정한 후 돌려주세요! (최대 개수 150개)
    # 여기 n+150도 각자 한번에 크롤링할 개수로 변경해서 돌려주세요
    for url in store_data['kakao_url'][n:n+150]:
        driver.get(url)
        driver.implicitly_wait(10)
        try:
            rate_cnt = driver.find_element_by_xpath('//*[@id="mArticle"]/div[1]/div[1]/div[2]/div/div/a[1]/span[2]').text
            rate_cnt = re.findall("\d+", rate_cnt)
            rate = driver.find_element_by_xpath('//*[@id="mArticle"]/div[1]/div[1]/div[2]/div/div/a[1]/span[1]').text
            review_cnt = driver.find_element_by_xpath('//*[@id="mArticle"]/div[1]/div[1]/div[2]/div/div/a[2]/span').text
            review_cnt = re.findall("\d+", review_cnt)
            review = int(rate_cnt[0]) + int(review_cnt[0])
            driver.implicitly_wait(10)
            data = {'review': review, 'rate': float(rate)}
            review_rate = review_rate.append(data, ignore_index=True)
            
        # 후기 미제공일 때
        except:
            try:
                review_cnt = driver.find_element_by_xpath('//*[@id="mArticle"]/div[1]/div[1]/div[2]/div/div/a/span').text
                data = {'review': int(review_cnt) , 'rate': 0.0}
            except:
                data = {'review': 0.0 , 'rate': 0.0}
            review_rate = review_rate.append(data, ignore_index=True)
    driver.quit()
    review_rate.to_csv('data/review_rate.csv', index=False)

Version2

forbidden을 해결한(?) 최종.진짜최종.진짜진짜최종.최종22.최.. 코드입니다.

    review_rate = pd.read_csv('data/review_rate.csv')
    store_data = pd.read_csv('data/store_data.csv')
		# 시작번호, 끝번호 지정
    store_data = store_data[48300:60000]

    options = webdriver.ChromeOptions()
    options.add_argument("no-sandbox") 
    options.add_argument("disable-gpu") 
    options.add_argument("--lang=ko_KR") 
    options.add_argument( 'user-agent=Mozilla/5.0 Chrome/95.0.4638.54')
    
    driver = webdriver.Chrome(r"C:\Temp\chromedriver.exe", chrome_options=options)

    for index, store in store_data.iterrows():
        if not index % 250:
            print(index)
            review_rate.to_csv('data/review_rate.csv', index=False)

        id = store['id']
        address = store['address']
        if type(address) == float:
            address = ''
        keyword = address + ' ' + store['name']
        keyword = keyword.strip()

        rate = 0.0
        review = 0

        try:
            kakao_map_search_url = f"https://map.kakao.com/?q={keyword}"
            driver.get(kakao_map_search_url)
            driver.implicitly_wait(5)

            rate = driver.find_element_by_css_selector("#info\.search\.place\.list > li.PlaceItem.clickArea.PlaceItem-ACTIVE > div.rating.clickArea > span.score > em").text
            driver.implicitly_wait(5)
            review = driver.find_element_by_css_selector("#info\.search\.place\.list > li.PlaceItem.clickArea.PlaceItem-ACTIVE > div.rating.clickArea > a > em").text
            driver.implicitly_wait(5)
            
            time.sleep(1)

        except Exception as e1:
            if not rate:
                rate = 0.0
            if not review: 
                review = 0
        data = { 'review': review, 'rate': rate }
        review_rate = review_rate.append(data, ignore_index=True)
        
    review_rate.to_csv('data/review_rate.csv', index=False)
    driver.quit()
profile
약속 관리 서비스 breeze의 개발 일지입니다.

0개의 댓글