본문 바로가기
DEV/Web 개발

Web개발 :: 머신러닝_Header를 사용한 네이버 지도 웹 크롤링 _TIL70

by 올커 2022. 12. 14.

■ JITHub 개발일지 70일차

□  TIL(Today I Learned) ::

Header를 사용한 네이버 지도 웹 크롤링

 - 프로젝트를 진행하다 보니 하루에도 수많은 부분들을 배우고 채울 수 있었다.


 1.크롤링 [*참고) 스타트 코딩 - 유튜브(링크), 블로그(링크), 인프런 강의(링크)]
  - 크롤링은 구글링을 해보면 selenium과 BeautifulSoup을 사용한 크롤링 방식이 많은 것 같다.

  - 하지만 이를 활용했을 때 실제로 크롬 브라우저를 열고 페이지를 넘기는 작업이 많을 땐 크롤링 속도가 많이 걸렸다.

  - 위 문제는 json을 활용하여 크롤링하면 어렵지 않게 해결할 수 있었다. 크롤링 방식은 header에 정보를 넣고 페이지에 request를 보내어 response를 받는 방식이다. 처음에 받아본 response 결과에서 필요한 정보만 골라서 for문을 돌린 후 json파일로 저장하는 과정을 반복했다.

  - 실제로 위의 강의를 수강하진 않았지만 나중에 참고해보면 좋을 듯 하여 같이 링크를 올려두었다.

import requests
import json

header = {
    'authority': 'map.naver.com',
    'method': 'GET',
    'scheme': 'https',
    'accept': 'application/json, text/plain, */*',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4',
    'cache-control': 'no-cache',
    'content-type': 'application/json',
    'cookie': 'NNB=ZHREYBKYJGZWA; ASID=7c6f74d40000017a324f783a0000004f; NV_WETR_LOCATION_RGN_M="MDkxNDAxMDQ="; _ga=GA1.1.843260892.1631082249; _ga_8P4PY65YZ2=GS1.1.1631546146.1.0.1631546150.0; NV_WETR_LAST_ACCESS_RGN_M="MDkxNDAxMDQ="; MM_NEW=1; NFS=2; NaverSuggestUse=use%26unuse; _gcl_au=1.1.684846510.1636646068; nx_ssl=2; page_uid=4bf320b5-0774-4667-9eca-95099ebb77e8',
    'expires': 'Sat, 01 Jan 2000 00:00:00 GMT',
    'pragma': 'no-cache',
    'referer': 'https://map.naver.com/',
    'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': "Windows",
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'
}

place_list = []

url_keyword = '제주시 한식'
for j in range(1, 6):
    print('\n', j,'페이지입니다.\n')

    url = f"https://map.naver.com/v5/api/search?caller=pcweb&query={url_keyword}&type=all&page={j}&displayCount=40&lang=ko"
    response = requests.get(url, headers=header)
    result = json.loads(response.content)
    # print(result)
    numbers = result['result']['place']['list']
    for i in range(0,len(numbers)):
        new_data = {'model': 'places.place'}
        inner_dict = {}

        inner_dict["place_name"] = numbers[i]['name'] if numbers[i]['name'] != [] else ""
        inner_dict["category"] = numbers[i]['category'][0] if numbers[i]['category'][0] != [] else ""
        inner_dict["place_address"] = numbers[i]['roadAddress'] if numbers[i]['roadAddress'] != [] else ""
        inner_dict["place_number"] = numbers[i]['tel'] if numbers[i]['tel'] != [] else ""
        inner_dict["place_time"] = numbers[i]['businessStatus']['lastOrder'] if numbers[i]['businessStatus']['lastOrder'] != [] else ""
        inner_dict["place_img"] = numbers[i]['thumUrl'] if numbers[i]['thumUrl'] != [] else ""
        inner_dict["menu"] = numbers[i]['menuInfo'] if numbers[i]['menuInfo'] != [] else ""
        inner_dict["place_desc"] = numbers[i]['microReview'][0] if numbers[i]['microReview'] != [] else ""
        inner_dict["latitude"] = numbers[i]['y'] if numbers[i]['y'] != [] else ""
        inner_dict["longitude"] = numbers[i]['x'] if numbers[i]['x'] != [] else ""


        new_data["fields"] = inner_dict
        place_list.append(new_data)
        # print(new_data)

with open('./place_data_jeju_02.json', 'w', encoding='UTF-8') as f:
    json.dump(place_list, f, ensure_ascii=False, indent=2)

 2. 깃허브 Codespaces secrets

  - 깃허브에 업로드할 때 위의 네이버 지도 API를 사용할 때 ClientID를 넣어주어야 한다. ClientID는 지도를 사용하게 되면 프론트에서 개발자 페이지로 보면 보여질 수 밖에 없게 된다. 완전한 정보 방지는 어렵지만 이번 기회에 깃허브에 코드로 Hard하게 ClientId가 입력되어있는 모습 보다는 별도로 저장하여 사용하는 모습이 좀 더 괜찮지(?) 않을까 싶은 생각에 찾아보기로 했다.

 

반응형

댓글