본문 바로가기

IT/스파르타코딩클럽(웹개발종합반)

웹개발 종합반 (3주차) (스파르타코딩클럽)

반응형

 

이제 3주차가 되었다 !

이번 주는 파이썬을 배울 예정이다.

파이썬은 예전엔 기초를 잠깐 배운 기억이 있어서 그래도 크게 안 어려울 것 같다.

 

파이썬을 배우는 이유는

서버를 파이썬으로 만들 예정이기 때문이다.

 

 

<파이썬 다운로드>

(윈도우)

https://www.python.org/ftp/python/3.8.6/python-3.8.6-amd64.exe

이 링크를 통해 파이썬을 다운로드 한다.

 

Add Python 3.8 to PATH 를 클릭하여 체크해주고 install Now를 클릭한다.

 

그리고 gitbash를 다운로드 해주어야 하기 때문에

https://git-scm.com/ 링크로 들어간다.

 

들어가서

Download for Windows 를 클릭한다.

 

64-bit Git for Windows Setup 을 클릭하여 다운로드 받는다.

계속해서 Next를 눌러 넘어가주면 되고 마지막에 View Release Notes 체크를 풀고 Finish를 클릭하면 끝난다.

 

vscode에서 python 사용을 위해 확장자를 설치한다.

 

그리고 새 파일을 생성한다.

pythonprac > hello.py

 

 

 

 

<Python을 설치한다는 의미>

= 컴퓨터가 파이썬을 알아들을 수 있도록 번역 팩을 설치하는 것이다.

 

 

<Python 사용해보기>

vscode에서 새터미널을 만든 후 Select Default Profile를 클릭한다.

 

그리고 Git Bash를 클릭하고 터미널을 삭제 후 다시 켜준다.

 

그러면 터미널이 이러한 상태로 생성된다.

 

 

이제 코드를 치고 오른쪽 클릭후 Run Python File in Terminal을 클립하여 

실행시킨다.

 

hello world 출력 성공!

 

 

 

<파이썬 기초>

간단한 기초 코드들을 실행시켜 보았다.

(파이썬은 문법이 진짜 java에 비해 엄청 간단한 듯하다.. 자료형 선언도 따로 안하고, 세미클론도 안붙이는듯)

a = 3
b = 5
print(a+b)

 

배열

a = ['사과', '배', '귤']
print(a[1])

 

딕셔너리

a = {'name' : '영수', 'age' : 24}
print(a['name'])

 

 

함수

javascript의 함수는 이렇게 생겼었다.

function hey(){
    alert()
}

 

그리고 python의 함수

def hey():
    print("hey")

hey()

 

 

조건문

age = 25

if age > 20:
    print('성인입니다.')
else:
    print('청소년입니다.')

 

 

반복문

ages = [5, 10, 13, 50, 29, 0]

for a in ages:
    if a > 20:
        print('성인입니다.')
    else:
        print('청소년입니다.')

 

 

 

<가상환경 설치>

가상환경 = 라이브러리를 담아두는 폴더 ? 라고 생각하면 된다. (라이브러리 관리)

 

미리 만들어 둔 바탕화면>sparta>pythonprac 폴더를 열어준다. (vscode에서)

그리고 터미널에 

python -m venv venv 를 입력하여 엔터를 치면

사진과 같이 venv 폴더가 생성된다.

 

그리고

오른쪽 하단에 3.8.6 64-bit 버튼을 클릭하고

 

별이 붙어있는 Python 3.8.6 ('venv': venv)를 클릭한다.

그리고

새터미널을 열어주면

 

venv가 붙은 것을 확인할 수 있다.

venv 폴더에서 라이브러리를 가져다 쓰겠다는 뜻이다. (또는 라이브러리를 venv 폴더에 깔겠다)

 

 

<라이브러리 사용>

터미널에 

pip install requests

를 입력해서 requests 라이브러를 설치한다.

 

requests 라이브러리 : Fetch의 역할 (서버에서 데이터를 가져오는 것)

이제 requests 라이브러리 사용해보기.

 

일단 javascript 할 때 썼던 미세먼지 API 다시 가져와보았다.

import requests

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

print(rjson)

결과 (API의 모든 데이터가 출력됨)

 

google에서 라이브러리의 doc을 찾아보면 그 라이브러리를 어떻게 쓰는지 알 수 있다. (다 외울 필요 없다는 뜻!!)

또는 google에 그냥 사용법 검색해봐도 어떻게 사용하는지에 대한 글들이 많음..

 

javascript 때 많이 했던 API안의 '구 이름'과 '미세먼지 수치'만 찍어보기를

이번엔 python으로 해보았다. (코드가 더 간단해져서 좋음 ㅠㅠ)

import requests

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
rows = rjson['RealtimeCityAir']['row']
for a in rows:
    gu_name = a['MSRSTE_NM']
    gu_mise = a['IDEX_MVL']
    print(gu_name, gu_mise)

 

결과

 

 

 

 

<웹스크래핑(크롤링)>

일단 웹 스크래핑 해보기 (영화제목)

크롤링 : 웹에 접속해서 데이터를 솎아내어 가져오는 것.

 

일단 새로운 라이브러리를 설치해야 한다.

pip install bs4 를 터미널에 입력해서 설치한다.

 

(설치하는 라이브러리 이름 : beautifulsoup4)

(현재 터미널이 venv 폴더로 잘 설정되어있는지 확인하기 !!)

 

 

크롤링 기본 코드 세팅

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

# 코딩 시작

이제 여기에 코딩을 하면 된다.

현재 웹에 접속하기위해 Requests 라이브러리를 이용하였고,

이제 솎아내서 가져오기 위해 BeautifulSoup을 이용할 예정이다.

(우리가 가져올 웹페이지: 랭킹 : 네이버 영화 (naver.com))

 

 

 

soup을 출력해보면,

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

print(soup)

그 웹 페이지의 html을 가져오고 있는 것을 확인할 수 있다.

이제 여기서 필요한 부분만 빼오면 된다.

 

 

웹 페이지에서 가져올 부분의 copy selector를 해준다.

 

 

그리고 코드에 select_one을 통해 넣어주면

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

a = soup.select_one('#old_content > table > tbody > tr:nth-child(3) > td.title > div > a')
print(a)

원하던 부분의 html을 가져온 것을 확인할 수 있다.

 

 

그리고 또 저 html 부분에서 text만 빼오고 싶을 때는, print 부분에 코드를

print(a.text)

이렇게 고쳐주면 된다.

 

 

 

이번엔 웹페이지의 제목들을 다 가져와 보았다.

첫번째 제목의 selector를 copy 해주고

다른 tr들도 copy 봐서 공통인 부분만 코드에 사용해준다.

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    print(tr)

그러면 tr들의 html이 다 출력되는 것을 볼 수 있다.

 

이제 여기서 제목만 보고싶다면, 

제목부분의 selector copy를 또 해준다.

복사한 값은 

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
 

이렇게 되지만, 앞부분은 이미 가져온 값들이기 때문에 뒷부분만 사용해준다.

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')


trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None:
        print(a.text)

select_one()   -> 하나만 가져올 때 (배열 느낌)

select()   -> 여러개 가져올 때

 

if a is not None:

부분은 tr중에 text가 없어서 None이라고 뜨는 부분이 있기 때문에,

None 아닐 때만, a의 글자를 출력하도록 한 것이다.

그러면 이런식으로 제목들만 가져올 수 있다.

 

 

 

이번에는 위와 동일한 웹에서 순위와 별점도 가져오기

이번엔 강의를 따라하지 않고 내가 미리 스스로 풀어보았다.

내 코드

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(2) > td.point
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a = tr.select_one('td.title > div > a')
    b = tr.select_one('td:nth-child(1) > img')
    c = tr.select_one('td.point')
    if a is not None:
        print(b['alt'], a.text, c.text)

결과는 성공 ㅎㅎㅎ

 

강사님의 코드

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

movies = soup.select('#old_content > table > tbody > tr')

for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        print(rank, title, star)

확실히 쉬운 부분인데도 불구하고 강사님의 코드가 조금 더 깔끔한 것을 볼 수 있다..

분발 해야지 !

 

 

 

<DB>

데이터베이스를 왜 쓰는가 ? : 데이터를 더 잘 정리(가져오기)하기 위해 

(Index 라는 순서로 데이터들이 정렬되어 있음)

 

Database에는 크게 2가지 종류가 있다.

  • SQL   (=엑셀) (틀이 이미 정해져 있기 때문에 사람이 실수 할 일이 적다)
  • NoSQL (Not Only SQL)  -> 정형화된 틀이 있는 것이 아닌 데이터를 내 마음대로 저장할 수 있음 (유연성이 좋음)   - MongoDB

 

강의에서는 최신 클라우드 서비스인 mongoDB Atlas를 사용할 예정이다.

 

 

 

mongoDB 시작하기

mongoDB를 사용하기 위해서는 가입을 해야한다.

  1. https://account.mongodb.com/account/register 링크로 들어가기
  2. 구글로 로그인
  3. Accept Privacy...Service 에 체크
  4. Submit

그리고 Build a Database를 클릭한다.

 

그리고 Free를 선택한 후 Create를 한다.

 

 

Username과 Password를 변경해 준 후 Create User를 클릭한다.

 

IP Address에는 0.0.0.0을 입력하고 Add Entry를 클릭한다.

그리고Finish and Close 버튼까지 눌러준다.

 

이제 Go to databases를 클릭한다.

 

 

 

mongoDB 연결

내 컴퓨터의 있는 파이썬과 인터넷에 있는 mongoDB를 연결하는 것이다.

내 컴퓨터에서 데이터를 저기 인터넷에 있는 mongoDB에 쏴주기도 하고 가져오기도 할 것이다.

 

mongoDB를 조작하기 위해서는 2개의 라이브러리가 필요하다.

  • pymongo   
  • dnspython

설치방법은 터미널에(venv폴더) 

pip install dnspython

pip install pymongo

를 입력해주면 된다.

 

 

이제 pymongo를 이용해서 DB에 접속을 해볼 것이다.

pymongo 기본 코드

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

URL 부분에는 mongoDB 주소를 넣어주면 된다.

 

connect 버튼을 누르고

 

Connect your application을 누른다.

 

DRIVER를 Python으로 바꾸고 VERSION도 3.6으로 변경해준 후, 밑에 복사버튼을 누르면 주소가 복사된다.

그리고 Close 해주면 된다.

 

그리고 pymongo 기본 코드의 URL 부분에 붙여넣기 해주면 끝!

아 그리고 URL 붙여넣기 한 뒤에, password 부분을 지우고 자신이 설정해준 패스워드로 변경해준다.(password : test)

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

 

 

데이터 넣어보기

mongoDB는 딕셔너리를 넣어주면 된다.

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

doc = {
    'name' : '영수', 
    'age' : 24
}

db.users.insert_one(doc)

doc라는 딕셔너리를 만들어주고,

db.users.insert_one()을 이용해 doc 딕셔너리를 추가해주고

(users는 Collections라는 소그룹? 정도로 생각해주면 된다. DataBase-> 대그룹 , Collections -> 소그룹)

Browse Collections를 클릭해주면

 

users라는 Collections 안에 방금 생성한 딕셔너리가 잘 들어있는 것을 확인할 수 있다.

 

 

pymongo를 이용해서 mongoDB 조작해보기

데이터를 가져오는 것을 연습해보기 위해 딕셔너리를 조금 더 넣어봤다.

 

 

mongoDB find하는 기본 코드

all_users = list(db.users.find({},{'_id':False}))

이제 여기서 for문을 돌려서 출력하게 되면

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

all_users = list(db.users.find({},{'_id':False}))

for a in all_users:
    print(a)

mongoDB에 넣었던 데이터들이 잘 출력된다.

 

 

find하는 코드에서

,{'_id':False}

이 부분을 빼게 되면 출력할 때, _id라는 값들이 붙어서 나오기 때문에

_id 라고 찍혀서 나오는 부분을 안나오게 하기위해 사용하는 코드이다.

 

 

리스트를 다 출력하는 것이 아닌 하나의 값만 출력하고 싶으면

find_one으로 바꾸어주면 된다.

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

user = db.users.find_one({},{'_id':False})
print(user)

 

 

 

이번에는 저장되어 있는 데이터값을 바꿔보기

update_one을 이용하면 된다.

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.users.update_one({'name':'영수'},{'$set':{'age':5}})
user = db.users.find_one({},{'_id':False})
print(user)

name이 영수인 것을 찾아서 age를 5로 바꾸라는 뜻이다.

 

결과를 출력해보면, 영수의 age가 5로 잘 바뀐 것을 볼 수 있다.

 

 

이번에는 영수를 없애보기

delete_one을 사용하면 된다.

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.users.delete_one({'name':'영수'})
all_users = list(db.users.find({},{'_id':False}))
for a in all_users:
    print(a)

name이 영수인 것을 없애라는 뜻이다.

모든 디렉터리를 출력해보면

영수가 없어진 것을 볼 수 있다.

 

pymongo 기본 코드 요약본

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

앞으로 mongoDB를 이용할 때, 여기서 복사해서 쓰면 된다.

 

 

저번에 완성했던 웹 스크래핑 코드의 결과를 mongoDB에 저장해보기

저번에 완성했던 코드

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(2) > td.point
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        star = tr.select_one('td.point').text
        print(rank, title, star)

웹사이트에서 영화 순위, 제목, 별점을 가져왔던 코드이다.

 

이제 이 코드의 결과를 mongoDB에 저장하면 된다.

 

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

import requests
from bs4 import BeautifulSoup

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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(2) > td.point
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        star = tr.select_one('td.point').text
        doc = {
            'title': title,
            'rank' : rank,
            'star' : star
        }
        db.movies.insert_one(doc)

일단 맨위에 mongoDB와 연결해주는 코드를 넣어주어야 한다.

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

그리고 원래는 title, rank, star를 print했지만 그부분을 없애고

doc이라는 딕셔너리를 만들어서 title, rank, star 값을 넣어준다.

그후 insert를 이용해서 doc이라는 딕셔너리를 넣어주면 된다. (collections를 users가 아닌 movie로 바꿔서 만들어 주었다)

 

결과

movies라는 collection 안에 doc 딕셔너리가 잘 들어갔다.

 

이번엔 위에서 영화들 정보를 넣은 것을 이용하여 데이터 조작 연습하기

1. 영화제목 '가버나움'의 평점 가져오기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

movie = db.movies.find_one({'title' : '가버나움'})
print(movie['star'])

title이 가버나움인 딕셔너리를 movie라는 변수에 넣어주고,

그 movie(가버나움)의 star(평점)을 출력한 것이다.

 

 

2. '가버나움'의 평점과 같은 평점의 영화 제목들을 가져오기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

movie = db.movies.find_one({'title' : '가버나움'})
target_star  = movie['star']

movies = list(db.movies.find({'star':target_star}, {'_id':False}))
for a in movies:
    print(a['title'])

'가버나움'의 평점을 target_star라는 변수에 넣어주고

movies라는 변수에 target_star(가버나움의 평점)와 같은 평점의 영화들을 넣어준다. (find_one이 아니라 그냥 find이기 때문에 리스트로 여러개값이 들어감)

그리고 for문을 돌려서 그 영화들의 제목만 출력되게 한 것이다.

 

 

3. '가버나움' 영화의 평점을 0으로 만들기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.q7rbruf.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.movies.update_one({'title' : '가버나움'}, {'$set' : {'star':0}})
star = db.movies.find_one({'title' : '가버나움'})
print(star['star'])

update_one을 이용해서 title이 '가버나움'인 영화의 'star' (평점)의 값을 0으로 만둔 후 

'가버나움'의 평점을 출력하였더니 

평점이 0으로 변경된 것을 확인할 수 있었다.

 

 


3주차 숙제. 지니 뮤직의 1위부터 50까지 곡 스크래핑

내가 작성한 코드

import requests
from bs4 import BeautifulSoup

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('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20230101',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2)
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for tr in trs:
    rank = tr.select_one('td.number').text[0:2]
    title = tr.select_one('td.info > a.title.ellipsis').text
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank.strip(), title.strip(), artist)

크롤링 할 수 있도록 기본적인 세팅을 하고, (URL은 지니뮤직 사이트)

rank, title, artist에 selector copy한 값들을 넣어 출력하였다.

text[0:2]는 rank의 제대로 된 출력을 위해 2칸 뒤 부터 출력되도록 하였고,

strip()은 순위와 곡제목이 깔끔하게 나오도록 붙여주었다.

 

결과

캡처할때 화면에 다 안담겨서 짤렸지만, 밑에 50위까지 다 출력되는 것을 확인할 수 있다.

 

 

정답 코드

import requests
from bs4 import BeautifulSoup

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('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20230101',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)

 

 

 

 

3주차가 끝났다 !

3주차는 크롤링과 DB를 배우면서 사실은 처음 배우는 내용이라 헷갈리는 부분도 많고 에러도 많았던 것 같다..

그래도 강사님이 쉽게 설명해주신 덕에 3주차도 무사히 끝낼 수 있었다.1, 2 주차의 내용들은 그래도 내심 쉬웠는데, 이번 내용들은 조금 어려워서 복습을 해야할 것 같다 ㅠㅠㅠ4주차도 화이팅 합시다

반응형