이번에는 카카오맵에서 검색되는 장소들의 메뉴 및 가격을 크롤링 해보려 합니다!!
여기서 얻어지는 데이터는 모두 개인 프로젝트 용으로만 이용하시길 바랍니다
셀레니움의 기본적인 사용법은 오른쪽 크롤링 탭의 글들을 참고하시기 바랍니다!!
메뉴 및 가격을 크롤링 하는 법도 다른 것과 별반 다르지 않습니다
다만 메뉴 및 가격을 담고 있는 곳의 HTML 코드가 어떻게 되나?? 가 다를 뿐입니다
처음에 오류들이 많이 떴었는데 카카오맵 메뉴 HTML 코드는 3가지로 분류된다는 것을 디버깅을 통해 알았습니다.
카카오맵 메뉴 HTML 코드 분류
1. menuonlyType
2. nophotoType
3. phothoType
장소마다 메뉴를 표현하고 있는 형식이 모두 다르기 때문에
위 3가지 경우 모두 탐색해서 결과가 있다면 menu에 모두 담습니다
메뉴를 담고있는 태그 구조는 위와 같이 되어있습니다
cont_menu > list_menu > photo_type으로 메뉴 리스트가 구성되어 있고
list 태그 안의 info_menu > loss_word에는 메뉴 이름이 있습니다
이런식으로 html 코드를 분석해나가면 됩니다
이를 코드로 구현하면 다음과 같습니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
def getMenuInfo(i, driver):
# 상세페이지로 가서 메뉴찾기
detail_page_xpath = '//*[@id="info.search.place.list"]/li[' + str(i + 1) + ']/div[5]/div[4]/a[1]'
driver.find_element_by_xpath(detail_page_xpath).send_keys(Keys.ENTER)
driver.switch_to.window(driver.window_handles[-1]) # 상세정보 탭으로 변환
sleep(1)
menuInfos = []
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 메뉴의 3가지 타입
menuonlyType = soup.select('.cont_menu > .list_menu > .menuonly_type')
nophotoType = soup.select('.cont_menu > .list_menu > .nophoto_type')
photoType = soup.select('.cont_menu > .list_menu > .photo_type')
if len(menuonlyType) != 0:
for menu in menuonlyType:
menuInfos.append(_getMenuInfo(menu))
elif len(nophotoType) != 0:
for menu in nophotoType:
menuInfos.append(_getMenuInfo(menu))
else:
for menu in photoType:
menuInfos.append(_getMenuInfo(menu))
driver.close()
driver.switch_to.window(driver.window_handles[0]) # 검색 탭으로 전환
return menuInfos
def _getMenuInfo(menu):
menuName = menu.select('.info_menu > .loss_word')[0].text
menuPrices = menu.select('.info_menu > .price_menu')
menuPrice = ''
if len(menuPrices) != 0:
menuPrice = menuPrices[0].text.split(' ')[1]
return [menuName, menuPrice]
|
cs |
이렇게 해서 메뉴 정보 크롤링을 알아보았습니다
전체 코드는 아래 깃허브에 있으니 참고하시기 바랍니다!!
https://github.com/wlgh325/python_crawling