개발일지
복습일지 03.5
킹리치카
2021. 9. 5. 03:28
복습일지 03.5 .5 가 붙은 이유는 스파르톤 진행 중 복습한 내용이기 때문에 양이 너무 많아서 ㅋㅋ
이번 복습은 크롤링에 대한 내용이었다.
확실히 배운지 오래되면 다 까먹는다. 열공 필수!
빈 화면에 멍해지지말고 copy selector을 기억하자 xpath도 사용해본적이 있지만 그건 확실하게 아는게 아니니까 일단 잊기로 했다.
import requests
from bs4 import BeautifulSoup
# 타겟 URL을 읽어서 HTML를 받아오고,
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.nhn?sel=pnt&date=20200303',headers=headers)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
#############################
movie = soup.select('#old_content > table > tbody > tr')
#개발자도구 > copy selector를 이용한다.
#헷갈릴땐 같은 맥락 두개를 가져와서 비교해서 쓴다
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a 1위 영화이름
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a 2위 영화이름
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img 1위 숫자
#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img 2위 숫자 alt에 순위가 들어있음
#(<img src="https://ssl.pstatic.net/imgmovie/2007/img/common/bullet_r_r01.gif" alt="01" width="14" height="13">)
#old_content > table > tbody > tr:nth-child(2) > td.point 1위 평점
#old_content > table > tbody > tr:nth-child(3) > td.point 2위 평점
모르겠다면 일단 필요한 부분을 copy selector 해와서 비교해보고 시작하면된다.
for movie_name in movie:
# a태그 까지 찾아 들어가는 경로를 준다.
a_tag = movie_name.select_one('td.title > div > a')
#text를 붙이면 에러가 발생하기 때문에 none이 필요
#비어있는 항목이 존재하기 때문이다.
if a_tag is not None:
a_name = a_tag.text
#alt는 img 태그속 속성이기 때문에!(이미지 파일이 깨졌을 때 표시할 텍스트를 말한다)
a_rank = movie_name.select_one('td:nth-child(1) > img')['alt']
a_score = movie_name.select_one('td.point').text
print(a_rank, a_name, a_score)
1위부터 2위~ 쭉 가져오기 위해선 for문을 돌려야한다.
그렇다면 동일한 부분을 하나의 변수에 때려넣고, 나머지 부분을 for문으로 돌려버린다. 아마도 그런것 같다?
아래의 if문은 text로 출력할때 에러가 뜨거나, 빈공간이 있을때 사용하면 좋다. None값인 태그는 제외해주는 것
다른 예로 지니뮤직을 크롤링 할 땐 None값이 없었기 때문에 if 문을 만들 필요가 없었다.
지니뮤직은 복습으로 하니까 간단했다규~
music_list = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
#노래제목
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis 1위
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis 2위
#순위
#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
for music in music_list:
title = music.select_one('td.info > a.title.ellipsis').text.strip()
rank = music.select_one('td.number').text[0:2].strip()
artist = music.select_one('td.info > a.artist.ellipsis').text
print(rank,'위',title,'-',artist)
출력도 완벽했다 ^^
이제 실전 나홀로메모장에 적용시키는 일만 남았다. 그거 하고나면 6시 될것같으니 복습일지 04로 찾아오겠음!