Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 성능 개선
- 리버스 프록시
- 렌더링 과정
- 브라우저
- aws
- 자동화
- https
- SSL
- ec2
- 3-Way HandShake
- workflow
- 이미지 최적화
- TLS
- tcp
- nginx
- nextJS
- pm2
- 로드 밸런싱
- 검색엔진최적화
- 이미지 압축
- SSH
- 무중단
- DNS
- CI
- webp
- gitgub actions
- 이미지 포맷 변경
- 배포
- 인증서
- certbot
Archives
- Today
- Total
개발일기
카카오 지도 크롤링 시도하기(Flask, Selenium, bs4) 본문
개요
먼저 말하자면 크롤링 실패다. 어떤 방법으로 크롤링을 해야할지 모르겠다. 현재 시도한 것은 크롤링은 되지만, 크롤링을 시도할 브라우저를 띄우는 것 부터 해서 카카오 지도 url에 들어가서 크롤링을 하는 것 까지의 시간이 지연된다. 그렇게 크롤링에 실패 했고, 카카오 지도 API에서 제공해주는 데이터만을 이용해서 프로젝트를 완성해야 할 것 같다. 코드는 이렇다.
frontend 코드
const SearchContainer = () => {
const [searchName, setSearchName] = useState("");
const searchCafeButton = async(e) => {
e.preventDefault()
try {
const response = await axios(`http://localhost:5000/searchCafes?searchName=${searchName}`)
setSearchResult(response.data)
} catch (error) {
console.log(error)
}
}
return (
<S.SearchContainer>
<S.SearchInner>
<S.Logo>MyCafeFinder</S.Logo>
<S.SearchForm onSubmit={searchCafeButton}>
<S.SearchInput
type="text"
value={searchName}
onChange={(e) => setSearchName(e.target.value)}
placeholder="찾으시는 카페 있으신가요?"
/>
<S.SearchButton>
<Search fill="#919191" />
</S.SearchButton>
</S.SearchForm>
</S.SearchInner>
</S.SearchContainer>
);
};
export default SearchContainer;
backend 코드
from flask import Flask, jsonify, request
from flask_cors import CORS
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
app = Flask(__name__)
CORS(app)
@app.route('/searchCafes', methods=['GET'])
def get_searchCafe_data():
searchName = request.args.get('searchName')
# Selenium WebDriver 설정
options = webdriver.ChromeOptions()
# options.add_argument("headless") #크롬창 숨기기
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options)
driver.get("https://map.kakao.com/")
time.sleep(3)
image = driver.find_element(By.CSS_SELECTOR, "div.coach_layer")
image.click()
search_input = driver.find_element(By.CSS_SELECTOR, "#search\\.keyword\\.query")
search_input.send_keys(searchName)
search_button = driver.find_element(By.CSS_SELECTOR, "#search\\.keyword\\.submit")
search_button.click()
# 검색 결과가 로드될 때까지 대기하기
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.link_name")))
soup = BeautifulSoup(driver.page_source, 'html.parser')
searchCafes = []
for item in soup.select("ul.placelist > li"):
name = item.select_one('a.link_name').get_text(strip=True)
address = item.select_one('div.addr').get_text(strip=True)
rating = item.select_one('em.num').get_text(strip=True) if item.select_one('em.num') else '평점 없음'
review = item.select_one("a.review").get_text()
period = item.select_one("span.openhourTitle").get_text()
searchCafes.append({
'name': name,
'address': address,
'rating': rating,
'review' : review,
'period' : period,
})
driver.quit()
return jsonify(searchCafes)
if __name__ == '__main__':
app.run(debug=True)
프론트쪽에서 검색된 검색어를 백엔드쪽으로 보내고, 백엔드에서는 크롬 브라우저를 열고, 카카오 지도 주소로 들어가서 해당 검색어를 입력한 뒤 크롤링 한다. 하지만 프론트 단 까지 데이터를 가져오는 시간이 너무 오래 걸린다. 다른 방법을 찾아 봤지만 내 구글링 실력이 별로인지 해답이 나오지 않았다. 그래서 어쩔 수 없이 주어진 데이터를 사용해서 프로젝트를 마무리 하기로 했다.
마무리
크롤링 부분을 더 공부하기 위해선 파이썬도 많이 공부해야 되는데 아직 프론트쪽도 너무 부족해서 나에겐 너무 과분한 부분인거 같다. 아직,, 그래서 주어진 데이터로 프로젝트를 완성할 예정이고, 더 공부해 볼 생각이다.
'SideProject(My-Selectshop-Finder)' 카테고리의 다른 글
카카오 지도 API 현재 위치 좌표로 주소 얻어내기(NextJs) (0) | 2024.08.18 |
---|---|
비밀번호 표시에 웹 접근성 및 사용자를 위한 tabIndex 활용 (0) | 2024.08.04 |
셀레니움(Selenium)과 뷰티풀 수프(Beautiful Soup) 차이 (0) | 2024.07.12 |
Flask에 대해 알아보기 (0) | 2024.07.12 |
NextJs 에서 Kakao Maps와 Geolocation으로 인한 초기 위치 문제 해결하기 (0) | 2024.07.04 |