programming/Python

파이썬으로 맛집 웹크롤링 하기 (망고플레이트) - 1탄

Jofresh 2023. 6. 14. 23:06
728x90
반응형

안녕하세요. 조신선입니다.

 

오늘은 파이썬을 활용해서 웹크롤링 하는 방법에 대해서 포스팅하겠습니다.

 

맛집 지도를 만든다거나, 나만의 맛집 리스트를 만들기 위해 

 

#다이닝코드, #네이버지도, #망고플레이트 등의 맛집 리스트를 확인할수 있는 웹사이트에서 다양하게 크롤링을 시도했었는데요.

 

제가 해본바로는 망고플레이트가 가장 쉬웠던 것 같습니다. (다이닝코드도 난이도는 비슷)

 

네이버지도는 동적이고 프레임도 많이 바꿔줘야 하기 때문에 어려운 점이 있지만,

네이버지도 리스트를 크롤링 할 수 있는 실력이 있다면, 맛집 뿐만 아니라 다양한 정보들을 크롤링 할 수 있는 장점이 있습니다.

 

네이버지도 크롤링 방법은 추후에... 구글 애드센스 승인 후에 업로드 하려고 아껴두고 있슴..^^:

 

그럼 시작하겠습니다!

 

import requests
import scrapy
from scrapy.http import TextResponse
from selenium import webdriver
import pandas as pd
import json
import time
import datetime
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import WebDriverException
from selenium.common.exceptions import NoSuchElementException

#검색할 지역과 카테고리를 아래 리스트에 담아준다.
locations = ["경주시"]#,"부산시금정구","부산시기장군","부산시남구","부산시동구","부산시동래구","부산시부산진구","부산시북구","부산시사상구","부산시사하구","부산시서구","부산시수영구","부산시연제구","부산시영도구","부산시중구","부산시해운대구"]
categories = ['한식','중식', '카페', '일식', '양식', '세계음식']

now = datetime.datetime.now()


# 아래 반복문으로 취합한 링크들을 리스트형태로 담기 위해
links = []

#위에 담은 지역과 카테고리를 반복하기 위해서 FOR 반복문 작성!
for location in locations:
    for category in categories:
        options = webdriver.ChromeOptions() 
        #options.add_argument("headless")  # 백그라운드에서 크롬 실행
        options.add_argument("disable-gpu")
        driver = webdriver.Chrome('chromedriver', options=options)
        url = "https://www.mangoplate.com/search/{}%20{}".format(location, category)
        driver.get(url)
        driver.implicitly_wait(10)
        
        i = 2
        while i <= 11:  # 몇 페이지까지 크롤링할 것인지 지정
            restaurants = driver.find_elements(By.CSS_SELECTOR, 'body > main > article > div.column-wrapper > div > div > section > div.search-list-restaurants-inner-wrap > ul > li > div > figure > figcaption > div > a')

            for res in restaurants: # 망고플레이트는 창 이동을 하기 때문에 일단은 링크 주소를 담는다.
                res_id = res.get_attribute('href')
                links.append(res_id)
                print(res_id)

            
            try: # 다음 페이지로 가는 것을 반복하기 위해서!
                next_button = driver.find_element(By.LINK_TEXT, str(i))
                next_button.click()
                i += 1
                time.sleep(2)
            except: # 반복할 페이지가 없다면 종료하기 위해서!
                print("다음 페이지 없음")
                break
        
        driver.quit() #끝나면 크롬 종료!
#크롤링한 데이터들을 리스트 형태로 저장
set_link = set(links)
links = list(set_link)
#pandas를 활용해서 데이터프레임화 하고 csv파일로 저장
df_list = pd.DataFrame(links)
df_list.to_csv("{}_망고플레이트.csv".format(now.strftime('%Y-%m-%d_%H-%M')), encoding='utf-8-sig')

위의 코드는 망고플레이트 웹사이트에서 특정 지역과 카테고리에 해당하는 음식점의 링크를 수집하는 기능을 구현한 것입니다. 코드의 주요 내용은 다음과 같습니다:

1. 필요한 라이브러리를 import 합니다. requests, scrapy, selenium, pandas, json, time, datetime, BeautifulSoup 등의 라이브러리가 사용됩니다.

2. 검색할 지역과 카테고리를 리스트로 정의합니다. locations 변수에는 검색할 지역들이, categories 변수에는 검색할 카테고리들이 담겨 있습니다.

3. 반복문을 사용하여 지역과 카테고리를 조합하여 검색 페이지를 접속합니다. webdriver.Chrome()을 사용하여 크롬 브라우저를 실행하고, 지연 시간을 설정하여 페이지가 로드되기를 기다립니다.

4. 해당 페이지에서 음식점들의 링크를 수집합니다. driver.find_elements()를 사용하여 선택자에 해당하는 요소들을 찾고, res.get_attribute('href')를 사용하여 링크 주소를 가져옵니다.

5. 다음 페이지로 이동하는 기능을 구현합니다. driver.find_element()를 사용하여 다음 페이지로 이동하는 링크를 찾고, .click() 메소드를 호출하여 해당 링크를 클릭합니다. 이후 반복하여 다음 페이지로 이동합니다.

6. 링크를 리스트 형태로 저장하고, 중복된 링크를 제거합니다.

7. 데이터프레임으로 변환한 후, pd.DataFrame.to_csv()를 사용하여 데이터를 CSV 파일로 저장합니다.

 

 

 

오늘은 링크를 수집하는 방법에 대해서만 알아보았습니다.

 

이유는 다량의 데이터를 수집할 때 가끔 오류가 나는데, 그럴때 코드가 묶여있으면 처음부터 다시 해야 하는 불상사가 생깁니다.. 만약에 90% 이상 진행했을 때 이런 일이 발생하면 매우 곤란하죠.

 

그래서 저는 쥬피터 환경에서 

 

1. 링크를 모은다.

2. 링크에 접속하게 해서 맛집 정보를 수집한다.

 

2단계로 나눠서 보통 작업을 합니다. 

 

그래서 다음 포스팅때 맛집 정보를 수집하는 코드를 공유하고 설명해드리도록 하겠습니다.

 

그럼 이만!

 

 

 

 

 

웹 브라우저 설정 및 접속을 하려면 아래 포스팅을 확인 후 구글드라이버 설치를 해주셔야 합니다.

 

[파이썬/크롤링] 구글드라이버 &selenium 라이브러리 설치_ 웹 크롤링 하기 전 필수 작업

안녕하세요. 조신선입니다. 셀레니엄 라이브러리를 사용하기 위해서는 크롬드라이버를 필수적으로 설치를 해야 하는데요. 제가 웹크롤링 하는 방법에 대한 포스팅은 몇 번 했으나, 크롬드라이

jofresh.tistory.com

 

 

 

 

728x90
반응형