usop 2022. 6. 6. 17:42

 

문제

위에 그림처럼 지니 차트가 출력되게 크롤링 하기.

지니 url : https://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1

 

슬라이싱(slicing) 과 공백 제거(strip)를 이용해야 깔끔하게 한 줄에 정리되서 나온다.

slicing 사용은 예를 들어 설명하자면 다음과 같은 배열을 가진 A가 있다.

A = ['a','b','c','d','e'] 

A[start : end : step] 의 규칙으로 사용한다.

start는 시작지점, end는 끝지점(끝지점은 포함하지 않고 그 앞까지), step 보폭(방향 및 몇개씩 끊어올지 등의 규칙)

A[0:2] => 0번째 부터 시작이니 'a'부터 , 2번째 앞까지니깐 'c' 의 앞 까지가 해당된다. 즉, 'a','b' 만 출력된다.

A[1:4] => 'b','c','d'

A[::2] => 2칸씩 이동하며 가져온다. 'a','c','e'

A[3::-1] => 3번부터 거꾸로 가져온다. 'd','c','b','a'

 

strip은 공백 제거

 

 

<전체 code>

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')

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

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

# 슬라이싱(slicing) 과 strip(공백 제거) [0:2]는 0번째 문자부터, 2번째 앞 까지 가져와라, strip은 공백제거하기