지난번 1회독때 mongoDB로 넘어가지 않는 오류가 있었는데 이번에는 그 부분은 잘 넘어갔고
네이버영화 링크가 자동으로 뜬다고 하셨는데
뜨지 않아서 튜터님 링크 따라 치긴 했는데 네이버 화면이 리뉴얼 된 건지 링크도 변환되었고
4주차 모든 작업 마쳤지만 이미지는 넘어오지 않았다.
답안 코드와 비교해서 코드 확인해 보았을때 vs-code를 잘못입력한 것 같진 않고,
(내 app.py 코드)
from flask import Flask , render_template , request , jsonify
app = Flask ( __name__ )
from pymongo import MongoClient
client = MongoClient ( 'mongodb+srv://sparta:test@cluster0.kjechbb.mongodb.net/?retryWrites=true&w=majority' )
db = client .dbsparta
import requests
from bs4 import BeautifulSoup
@ app . route ( '/' )
def home ():
return render_template ( 'index.html' )
@ app . route ( "/movie" , methods =[ "POST" ])
def movie_post ():
url_receive = request . form [ 'url_give' ]
comment_receive = request . form [ 'comment_give' ]
star_receive = request . form [ 'star_give' ]
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' }
data = requests . get ( url_receive , headers = headers )
soup = BeautifulSoup ( data . text , 'html.parser' )
ogtitle = soup . select_one ( 'meta[property="og:title"]' )[ 'content' ]
ogimage = soup . select_one ( 'meta[property="og:image"]' )[ 'content' ]
ogdesc = soup . select_one ( 'meta[property="og:description"]' )[ 'content' ]
doc = {
'title' : ogtitle ,
'desc' : ogdesc ,
'image' : ogimage ,
'comment' : comment_receive ,
'star' : star_receive
}
db .movies. insert_one ( doc )
return jsonify ({ 'msg' : '저장완료!' })
@ app . route ( "/movie" , methods =[ "GET" ])
def movie_get ():
all_movies = list ( db .movies. find ({},{ '_id' : False }))
return jsonify ({ 'result' : all_movies })
if __name__ == '__main__' :
app . run ( '0.0.0.0' , port = 5000 , debug = True )
(내 index.html 코드)
<! doctype html >
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" >
integrity = "sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin = "anonymous" >
integrity = "sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin = "anonymous" ></ script >
< title > 스파르타 피디아 </ title >
< style >
* {
font-family : 'Gowun Dodum' , sans-serif ;
}
.mytitle {
width : 100% ;
height : 250px ;
background-position : center ;
background-size : cover ;
color : white ;
display : flex ;
flex-direction : column ;
align-items : center ;
justify-content : center ;
}
.mytitle > button {
width : 200px ;
height : 50px ;
background-color : transparent ;
color : white ;
border-radius : 50px ;
border : 1px solid white ;
margin-top : 10px ;
}
.mytitle > button:hover {
border : 2px solid white ;
}
.mycomment {
color : gray ;
}
.mycards {
margin : 20px auto 0px auto ;
width : 95% ;
max-width : 1200px ;
}
.mypost {
width : 95% ;
max-width : 500px ;
margin : 20px auto 0px auto ;
padding : 20px ;
box-shadow : 0px 0px 3px 0px gray ;
display : none ;
}
.mybtns {
display : flex ;
flex-direction : row ;
align-items : center ;
justify-content : center ;
margin-top : 20px ;
}
.mybtns > button {
margin-right : 10px ;
}
</ style >
< script >
$ ( document ). ready ( function () {
listing ();
});
function listing () {
fetch ( '/movie' ). then (( res ) => res . json ()). then (( data ) => {
let rows = data [ 'result' ]
$ ( '#cards-box' ). empty ()
rows . forEach (( a ) => {
let comment = a [ 'comment' ]
let title = a [ 'title' ]
let desc = a [ 'desc' ]
let image = a [ 'image' ]
let star = a [ 'star' ]
let star_repeat = '⭐' . repeat ( star )
let temp_html = `<div class="col">
<div class="card h-100">
<img src=" ${ image } "
class="card-img-top">
<div class="card-body">
<h5 class="card-title"> ${ title } </h5>
<p class="card-text"> ${ desc } </p>
<p> ${ star_repeat } </p>
<p class="mycomment"> ${ comment } </p>
</div>
</div>
</div>`
$ ( '#cards-box' ). append ( temp_html )
})
})
}
function posting () {
let url = $ ( '#url' ). val ()
let comment = $ ( '#comment' ). val ()
let star = $ ( '#star' ). val ()
let formData = new FormData ();
formData . append ( "url_give" , url );
formData . append ( "comment_give" , comment );
formData . append ( "star_give" , star );
fetch ( '/movie' , { method : "POST" , body : formData }). then (( res ) => res . json ()). then (( data ) => {
alert ( data [ 'msg' ])
window . location . reload ()
})
}
function open_box () {
$ ( '#post-box' ). show ()
}
function close_box () {
$ ( '#post-box' ). hide ()
}
</ script >
</ head >
< body >
< div class = "mytitle" >
< h1 > 내 생애 최고의 영화들 </ h1 >
< button onclick = " open_box () " > 영화 기록하기 </ button >
</ div >
< div class = "mypost" id = "post-box" >
< div class = "form-floating mb-3" >
< input id = "url" type = "email" class = "form-control" placeholder = "name@example.com" >
< label > 영화URL </ label >
</ div >
< div class = "input-group mb-3" >
< label class = "input-group-text" for = "inputGroupSelect01" > 별점 </ label >
< select class = "form-select" id = "star" >
< option selected > -- 선택하기 -- </ option >
< option value = "1" > ⭐ </ option >
< option value = "2" > ⭐⭐ </ option >
< option value = "3" > ⭐⭐⭐ </ option >
< option value = "4" > ⭐⭐⭐⭐ </ option >
< option value = "5" > ⭐⭐⭐⭐⭐ </ option >
</ select >
</ div >
< div class = "form-floating" >
< textarea id = "comment" class = "form-control" placeholder = "Leave a comment here" ></ textarea >
< label for = "floatingTextarea2" > 코멘트 </ label >
</ div >
< div class = "mybtns" >
< button onclick = " posting () " type = "button" class = "btn btn-dark" > 기록하기 </ button >
< button onclick = " close_box () " type = "button" class = "btn btn-outline-dark" > 닫기 </ button >
</ div >
</ div >
< div class = "mycards" >
< div class = "row row-cols-1 row-cols-md-4 g-4" id = "cards-box" >
< div class = "col" >
< div class = "card h-100" >
class = "card-img-top" >
< div class = "card-body" >
< h5 class = "card-title" > 영화 제목이 들어갑니다 </ h5 >
< p class = "card-text" > 여기에 영화에 대한 설명이 들어갑니다. </ p >
< p > ⭐⭐⭐ </ p >
< p class = "mycomment" > 나의 한줄 평을 씁니다 </ p >
</ div >
</ div >
</ div >
< div class = "col" >
< div class = "card h-100" >
class = "card-img-top" >
< div class = "card-body" >
< h5 class = "card-title" > 영화 제목이 들어갑니다 </ h5 >
< p class = "card-text" > 여기에 영화에 대한 설명이 들어갑니다. </ p >
< p > ⭐⭐⭐ </ p >
< p class = "mycomment" > 나의 한줄 평을 씁니다 </ p >
</ div >
</ div >
</ div >
< div class = "col" >
< div class = "card h-100" >
class = "card-img-top" >
< div class = "card-body" >
< h5 class = "card-title" > 영화 제목이 들어갑니다 </ h5 >
< p class = "card-text" > 여기에 영화에 대한 설명이 들어갑니다. </ p >
< p > ⭐⭐⭐ </ p >
< p class = "mycomment" > 나의 한줄 평을 씁니다 </ p >
</ div >
</ div >
</ div >
< div class = "col" >
< div class = "card h-100" >
class = "card-img-top" >
< div class = "card-body" >
< h5 class = "card-title" > 영화 제목이 들어갑니다 </ h5 >
< p class = "card-text" > 여기에 영화에 대한 설명이 들어갑니다. </ p >
< p > ⭐⭐⭐ </ p >
< p class = "mycomment" > 나의 한줄 평을 씁니다 </ p >
</ div >
</ div >
</ div >
</ div >
</ div >
</ body >
</ html >
네이버 영화 링크 문제로 이미지가 넘어오지 않는 것 같은데 자동으로 뜰꺼라고 하셨는데 왜 뜨지않는지 그리고 네이버 자체에서 영화 소개 화면을 변경하면서 URL도 바뀐 것 같은데, 그 부분을 어떻게 해결해야 이미지를 띄울 수 있는지 궁금하다. //
작업한 몽고디비 url({"_id":{"$oid":"64a4b2c27ce441134ecc8de1"},"title":"블랙 팬서: 와칸다 포에버 : 네이버 통합검색","desc":"'블랙 팬서: 와칸다 포에버'의 네이버 통합검색 결과입니다.","image":" https://ssl.pstatic.net/sstatic/search/common/og_v3.png ","comment":"왜 안되지?"}
다시 이 부분에서 막힘이 있어서 튜터님 영화페이지 url( https://movie.naver.com/movie/bi/mi/basic.naver?code=184516)를 그대로 따라 쳤는데, 엔터 치면 네이버 화면과 url(https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%B8%94%E[ …]7%90%EB%B2%84&x_csa=%7B%22mv_id%22%3A%22184516%22%7D&pkid=68 )이 자동변환되면서 이렇게 다른 화면에 네이버 검색주소창으로 바뀌게 된다. (블랙팬서 영화는 동일)
그래서 영화페이지 링크가 따로 있는지 해서 네이버 창 이곳 저곳 클릭해서 보았는데요. 튜터님과 같은 영화 페이지 화면은 없어진 것 같아 보인다.(네이버에서 자체적으로 영화 페이지 창을 리뉴얼한 것으로 보임.) 그래서 블랙팬서 영화 제목을 검색해서 다음 영화페이지( https://movie.daum.net/moviedb/main?movieId=98033)랑 위키백과 등도 넣어 봤는데 다음 영화페이지 링크는 적용이 되었다.
[궁금증]
meta 태그랑 og 태그로 잡아서 다양한 사이트에서 가져올 수 있다고 하셨는데 그 부분을 적용시키는 방법이 궁금하다.