왕초보 웹개발종합반 3주차

장정인·2021년 7월 19일
0

3주차 소감

  • 3주차 쉽다고 그랬는데 나는 코딩이 적성이 아닌가보다
  • requests, BS4 등으로 웹 크롤링 하는 법을 배웠다. 이 라이브러리들을 매 파일을 열 때마다 설치해야하는 줄 모르고 실수를 여러 번 했다. 그리고 이걸 파이썬 파일 서두에 입력하여 실행시키는 것도 아직 자주 까먹는다.

어려웠던 부분

Quiz-평점 똑같은 영화 가져오기

이게 어려웠다.

score_matrix = db.movies.find_one({'title':'매트릭스'})
target_score = score_matrix['score']

target_movies = list(db.movies.find({'score':target_score},{'_id':False}))

for target in target_movies:
    print(target['title'])

매트릭스의 점수만 어떻게 가져와서 find 에 넣느냐?가 제일 어려웠는데 나는 얼레벌레 'score':매트릭스['score']써서 대차게 망함.

매트릭스가 title인 데이터를 가져와 이름붙인 후 그것의 ['score']데이터를 정의해준다. 그래서 그 데이터를 조건으로 찾으면 되는 거였다.

rank에 상승율 섞여들어가는 문제

숫자 부분을 크롤링해 오면 그 주변의 상승율까지 딸려 온다는 문제가 있었다.

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta


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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

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

ginie = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for music in ginie:
    rank = music.select_one('td.number').text.strip()
    title =  music.select_one('td.info > a.title.ellipsis ').text.strip()
    artist = music.select_one('td.info > a.artist.ellipsis').text.strip()
    
    print(rank, title,artist )

이 부분이 문제였다.

rank = music.select_one('td.number').text.strip()

해결

rank = music.select_one('td.number').text[0:2].strip()

이렇게 하면 되는거였다...
[0:2]는 그 문자열의 0번째부터 2번째까지를 자른다는 소리이기 때문이다.

+추가
코드를 깔끔히 짤 필요성을 느낀다...

이렇게 짜면 안된다.

for music in ginie:
    rank = music.select_one('#body-content > div.newest-list > div > table > tbody > tr > td.number')
    title =  music.select_one('#body-content > div.newest-list > div > table > tbody > tr >(중복되니까 지우면 됨) td.info > a.title.ellipsis ')
    artist = music.select_one('#body-content > div.newest-list > div > table > tbody > tr > td.info > a.artist.ellipsis')
    rank_sen= (rank.text).strip()
    title_sen= (title.text).strip()
    artist_sen =(artist.text).strip()
    print(rank_sen, title_sen,artist_sen )

이게 잘 짠 코드임

ginie = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for music in ginie:
    rank = music.select_one('td.number').text.strip()
    title =  music.select_one('td.info > a.title.ellipsis ').text.strip()
    artist = music.select_one('td.info > a.artist.ellipsis').text.strip()
    
    print(rank, title,artist )

0개의 댓글