미소를뿌리는감자의 코딩

[항해99 웹개발종합반] 4주차 HW 본문

강의수강/HW

[항해99 웹개발종합반] 4주차 HW

미뿌감 2024. 1. 11. 13:41
728x90

이번 HW은 melon chart에서 web scrolling을 해서,

카드로 나타내는 것이다.

 

예시

예시는 이와 같았다.

 

[접근 방법]

3주차 때 배웠던 웹 스크롤링 을 이용해서 적용하면 되겠다고 생각하였다.

3주차 코드(melon.py)를 한번 보고 나니 갈피가 잡히었다.

 

[적용]

app.py

app.py 파일에서, 위와 같이 작성했다.

나는 trs를 그래도 data로 넘겨서 html파일에서, 정보를 처리했지만,

 

답안코드를 보니, dictionary로 data들을 미리 정리해서 html 파일로 넘김을 알 수 있었다.

나의 코드는 data를 넘김에 있어서,더 많은 시간을 소요할 것으로 생각되기 때문에,

dictionarty로 data를 미리 정리해서 넘기는 것이 낫다고 판단된다.

 

index.html

 

{{melon.select_one('img')['src']}}
{{melon.select_one('.rank01>span>a').text}}
{{melon.select_one('.rank02 > a').text}}

이런식으로 필요한 data들을 찾아주었다.

 

여담으로 이야기 하자면, 

melon chart의 좋아요 수를 적용시켜 주고 싶었다.

하지만, data를 찾아서 html파일에 적용시켰을 떄,

계속 0으로 나타내어졌다. 회색 글씨로 =0 이라는 것이 희미하게 있었는데,

이 이유 때문인가 유추하고 있다.

이유를 알고 싶...다ㅠ

 

[결과]

결과!

이런 결과가 나오게 되었다.

이미지 화질이 조금 아쉽스만..

 

[전체 코드]

1) app.py

더보기
from flask import Flask, render_template
from bs4 import BeautifulSoup
import requests

 

app = Flask(__name__)
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, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')



@app.route('/')
def index():
# 멜론 크롤링
trs = soup.select('table >tbody > tr')
return render_template('index.html', data=trs)



if __name__ == '__main__':
app.run()



# bs4 시작코드
# '''
# 스크래핑 하고 싶은 주소를 url에 넣어주세요
# '''

 

# for tr in trs:
# title = tr.select_one('.rank01>span>a').text
# artist = tr.select_one('.rank02 > a').text
# rank = tr.select_one('.rank').text
# image = tr.select_one('img')['src']

 

# print(rank, title, artist, image)


2)index.html

더보기
<!Doctype html>
<html lang="en">

 

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
<style>

 

.background-banner {
background-image: linear-gradient(45deg,
rgb(51 43 43 / 75%),
max-height: 100%;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
}
</style>
</head>

 

<body data-bs-theme="dark">
<div class="background-banner">
<nav class="navbar border-bottom border-bottom-dark d-flex justify-content-space-between" data-bs-theme="dark">
<div class="ms-3">
alt="">
</div>
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link text-white" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-white" href="#">Music</a>
</li>
<li class="nav-item">
<a class="nav-link text-white" href="#">Album</a>
</li>
<li class="nav-item">
<a class="nav-link text-white">Movie</a>
</li>
</ul>
</div>
</div>
</nav>
</nav>

 

<div class="px-4 py-5 my-5 text-center">
<h1 class="display-5 fw-bold text-body-emphasis">Melody Share</h1>
<div class="col-lg-6 mx-auto">
<p class="lead mb-4">
<br>
노래를 들으면 생각나는 누군가가 있으신가요?
<br><br>
당신의 감성이 담긴 인생곡 플레이리스트
<br>
멜로디쉐어에서 소중한 사람과 함께 공유하세요.
</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
<!-- Button trigger modal -->
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#exampleModal">
음악 추가
</button>
</div>
</div>
</div>



<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">최애 음악</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form>
<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">유저</label>
<input type="text" class="form-control" id="exampleInputEmail1"
aria-describedby="emailHelp">
<div id="emailHelp" class="form-text">사용자(추천인)의 이름을 넣어주세요.</div>
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">노래 제목</label>
<input type="text" class="form-control" id="exampleInputPassword1">
<div id="emailHelp" class="form-text">좋아하는 노래 제목을 넣어주세요.</div>
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">가수</label>
<input type="text" class="form-control" id="exampleInputPassword1">
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">앨범 커버URL</label>
<input type="text" class="form-control" id="exampleInputPassword1">
</div>
<button type="submit" class="btn btn-danger">Submit</button>
</form>
</div>
</div>
</div>
</div>



<!-- Cards -->
<div class="row row-cols-1 row-cols-md-4 g-4 mx-auto w-75 pb-5">
{% for melon in data %}
<div class="col">
<div class="card h-100">
<img src="{{melon.select_one('img')['src']}}" class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">{{melon.select_one('.rank01>span>a').text}}</h5>
<p class="card-text">{{melon.select_one('.rank02 > a').text}}</p>
<p class="card-text">추천 by 미뿌감</p>
</div>
</div>
</div>
{% endfor %}
</div>



<div class="container">
<footer>
<div class="d-flex flex-column flex-sm-row justify-content-between py-4 my-4 border-top">
<p>© 2023 Company, Inc. All rights reserved.</p>
<ul class="list-unstyled d-flex">
<li class="ms-3"><a class="link-body-emphasis"
href="https://www.youtube.com/@SpartaCodingClub"><i class="bi bi-youtube"></i></a></li>
<li class="ms-3"><a class="link-body-emphasis"
href="https://www.instagram.com/spartacodingclub/"><i class="bi bi-instagram"></i></a>
</li>
<li class="ms-3"><a class="link-body-emphasis" href="https://spartacodingclub.kr/blog"><i
class="bi bi-postcard"></i></a></li>
</ul>
</div>
</footer>
</div>

 

integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz"
crossorigin="anonymous"></script>
</body>

 

</html>

[후기]

이번 주차는 비교적 일찍 끝났다~!

항해를 시작하고부터 우선순위에서 밀렸던

토익 공부를 오늘은 할 수 있어서 좋다 bb

울라울라울라쓩

 

728x90