항해99/TIL

47일차 항해일지

연어조아 2021. 11. 1. 20:52
728x90

오늘 한일

캠핑장 데이터 가져오기

프로젝트에서 기본적으로 캠핑장의 주소를 가져와서 각 캠핑장의 별관측지수를 내림차순으로 정렬하여 제공하고,
사용자에게 가장 별보기 좋은 캠핑장을 추천해주기로 하였다.

그렇기에 주위의 캠핑장 정보가 필요 하였으며 네이버 지도를 크롤링 하여 캠핑장의 정보를 알아내었다.

# 코알라유니브 스터디: 공공공공공경경 - 고주형
# 네이버 신지도 데이터 수집하기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
#예외 처리 import 추가
from selenium.common.exceptions import NoSuchElementException
from pymongo import MongoClient
import requests

def init_data(region, keyword):
    driver = webdriver.Chrome("./chromedriver")
    driver.get("https://m.map.naver.com/#/search")

    time.sleep(1)
    # 검색창에 검색어 입력하기
    search_box = driver.find_element_by_css_selector("#ct > div.search._searchView > div.Nsearch > form > div > div.Nsearch_box > div > span.Nbox_text > input")
    search_box.send_keys("{} {}".format(region, keyword))

    time.sleep(1)

    # 검색버튼 누르기
    search_box.send_keys(Keys.ENTER)

    # 크롤링
    time.sleep(1)
    elements = driver.find_element_by_css_selector("#ct > div.search_listview._content._ctList > ul")

    lists = elements.find_elements_by_tag_name('li')
    idx = 1


    for li in iter(lists):
        chargeName = li.get_attribute("data-title")
        address = driver.find_element_by_css_selector("#ct > div.search_listview._content._ctList > ul > li:nth-child({}) > div.item_info > div.item_info_inn > div > a".format(idx))
        address = address.text.split('\n')[1]
        data_entx = li.get_attribute("data-entx")
        data_enty = li.get_attribute("data-enty")


        try:
            img = driver.find_element_by_css_selector("#ct > div.search_listview._content._ctList > ul > li:nth-child({}) > div.item_info > a.item_thumb._itemThumb > img".format(idx)).get_attribute("src")
        except NoSuchElementException:
            img = None

        headers = {

            "X-NCP-APIGW-API-KEY-ID": "api_id",
            "X-NCP-APIGW-API-KEY": "api_key"
        }

        r = requests.get(f"https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query={address}", headers=headers)

        response = r.json()
        if response["status"] == "OK":
            if len(response["addresses"])>0:
                x = float(response["addresses"][0]["x"])
                y = float(response["addresses"][0]["y"])
                print('"{}","{}","{}",{},{}'.format(chargeName, address, img, x, y))
        else:
            print( chargeName, "좌표를 찾지 못했습니다")
        idx = idx + 1

    idx = 0
    # 크롭 웹페이지를 닫음
    driver.close()

if __name__ == "__main__":
    init_data("경상남도", "캠핑장")

사실 항해 1주차때 사용한 전기차 충전소 크롤링 코드를 수정하였다.

아주 잘 돌아간다.!

도메인 수정

기존의 weather api가 각 장소에 시간별로 여러개 의 데이터가 들어옴으로
location과 weather의 관계를 1:n 관계로 수정하였다.