안녕하세요. 막내 온 탑 수빙수입니다! 부지런히 꿀을 모을 여러분을 위한 선물을 준비했습니다. 바로 가게 리뷰와 평점 개수를 모을 코드입니다. 두 가지 버전으로 준비했으니 취사선택하시면 됩니다.😉 (해당 프로젝트는 상업 목적이 아님을 밝힙니다!)
아래 코드에서 변경해야할 부분 변경해서 쓰면 됩니다!!
이렇게 해둬도 중간에 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)
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()