본문 바로가기

프로그래밍/개발일지

[스코클] 비개발자를 위한 웹개발 종합반-3주차

728x90

1. 스파르타피디아 연습 및 복습

1.1. 스파르타피디아에 open API 붙여보기

1.2. console에 출력해보기

1.3. 웹페이지에 출력하기

1.4. 기존에 보이던 내용 숨기기/삭제하기

1.5. 내용을 붙일 틀 입력시키기

 

2. 파이썬 기초공부

2.1. 변수, 자료형, 함수, 조건문, 반복문

2.2. package

2.3. 가상환경 (Virtual environment) - 프로젝트별로 패키지를 담을 보관함: venv library 루트

- 프로젝트별로 사용해야 할 패키지의 버전이 다를 수 있기 때문.

2.4. API 가져오기

2.5. 크롤링

2.5.1. 할일

- 웹사이트에 요청해서 html 가져오기 (requests)

- 그 안에서 제목 찾기 (쉽게 찾게하는 라이브러리 이용: beautifulsoup)

2.5.2. beautifulsoup 사용법

- beautiful soup library 가져오기

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'}
#headers: 브라우저 콜 날리는 것을 사람이 콜 날리는 것처럼 만드는 것
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)
#requests: 내가 긁어오고싶은 url 넣기. 맨 뒤에 헤더 들어감
soup = BeautifulSoup(data.text, 'html.parser')

 

2.5.3. beautifulsoup 활용하기

- 긁어오고싶은 자료중 하나 우클릭-inspection-elements-해당위치 커서놓고 다시 우클릭 - copy - copy inspecter - 붙여넣기

- 붙여넣은 코드 중 다른 패턴 전까지 복사 후 soup.select('...')에 붙여넣기

- 아래 예에서는 맨 앞에서 tr까지

#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(2) > td.info > a.title.ellipsis

- 맨 앞에서 tr까지는 동일한 패턴의 내용을 가리킴

- 그 뒤에 nth-child(1)는 특정 데이터 id (e.g., 지니뮤직에서는 특정 음악정보, 네이버영화에서는 특정 영화 정보)

- 맨 마지막 a.title.ellipsis 는 특정 데이터 중 한개의 정보를 나타냄 (여기서는 제목)

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

-> 이것이 해당 묶음(순위, 노래제목, 가수, 앨범 등의 묶음)의 공통 패턴을 가리킴. 그래서 soup.select에 집어 넣으면 위의 패턴을 모두 잡아낼 수 있음. 

 

- musics라는 데이터를 지정한 후 for문을 통해 musics 안에 있는 개별 music를 반복하는 명령 실행

- title, rank, singer 각각 구체적으로 어느데이터를 가져올지 지정. 뒤에 데이터를 어떻게 처리해서 보여줄지를 구체화

*text는 텍스트만, text[0:2] 는 텍스트중 맨 앞 두개, strip은 앞뒤 공간 여백 없애기

for music in musics:

    title = music.select_one('td.info > a.title.ellipsis').strip
    rank = music.select_one('td.number').text[0:2]
    singer = music.select_one('td.info > a.artist.ellipsis').text

    print(rank, title, singer)