Development
[토이프로젝트] 다녀온 산들을 저장하고 후기를 남기는 사이트
개발자 강정
2022. 1. 5. 19:03
프로젝트 이름: 마이 마운틴 (다녀온 산들을 저장하고 후기를 남기는 사이트)
- 설명 :
- 회원가입 후 로그인
- 로그인 후 마이 페이지로 이동됨
- 마이 페이지에는 산 이름, comment, 평점 등을 입력할 수 있는 form이 있음
- 산에 대한 정보(사진, 높이, 코스, 난이도 등)가 크롤링 되어 함께 카드로 저장됨
이 중 나는 '마이 페이지'에 해당하는 메인 페이지를 구현하기로 했다.
- 100대 명산이 카드들로 정리되어 있음.
- 각 카드에 별점 및 코멘트를 입력할 수 있음.
- 별점 또는 코멘트가 입력된 카드는 위에 따로 분류됨.
(별점 순서대로) - 각 카드에는 산 이름, 사진, 높이, 코스 정보, 난이도와 같은 정보들이 있음.
- 검색 기능 추가.
산림청 공공 데이터 활용
먼저 산과 관련한 데이터베이스를 수집해야 했다.
산림청 공공 데이터 중 '명산 등산로'라는 데이터를 활용하기로 했다. API 활용 신청을 제출하니 자동으로 바로 데이터 활용이 가능했다.
JSON 형식의 open api 활용에 대해서 배운 상태였는데, 산림청 데이터는 XML 형식이었다.
구글링을 통한 시행착오 끝에 몇가지 파이썬 라이브러리를 활용하여 데이터를 가져올 수 있었다.
from urllib.request import urlopen
import xmltodict
with urlopen('open api 주소') as response:
html = response.read()
data = xmltodict.parse(html)
산 대표 이미지 얻기
공공 데이터를 통해 산의 이름, 높이, 설명, 코스 등의 데이터를 얻을 수 있었다. 하지만 각 산의 적절한 이미지는 얻을 수 없었다.
100개의 산 이미지를 일일히 찾는 것이 불가능하지는 않았지만, 크롤링을 통해 해결하고 싶었다.
구글에 산 이름을 검색했을 때 처음으로 뜨는 이미지를 가져오고 싶었다.
시행착오 끝에 chrome driver를 활용하는 방법을 발견했다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.team_projects
s=Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=s)
driver.maximize_window()
mountains = list(db.mountains.find({'imgurl':None},{'_id':False}))
for mountain in mountains:
name = mountain['name']
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ogbl") # 구글에 이미지탭 URL 주소
elem = driver.find_element_by_name("q") # 검색창 태그찾기
elem.send_keys(name) # 찾은 검색창에 찾고 싶은 키워드 입력
elem.send_keys(Keys.RETURN) # 입력받은 키를 누른다
image = driver.find_element_by_xpath('//*[@id="islrg"]/div[1]/div[1]/a[1]/div[1]/img') # Get First Image
imgurl = image.get_attribute('src') # Print Image src attribute
db.mountains.update_one({'name': name}, {'$set': {'imgurl': imgurl}})
print(name, '완료!')
이렇게 하여 mongodb에 산에 대한 정보와 이미지를 저장할 수 있었다.