테킷 수업을 하던 중 강의 내용에서 실시간 검색 순위를 가져오는 것을 배웠는데 실검이 없어지고 다른 예제를 찾아보다가 발견한 네이버 웹툰 순위
하지만 우리가 공부한 코드와 내용이 달라서 3주 전엔 해결하지 못한 과제였음
이번 ai school 박조은 강사님의 강의를 듣고 문제를 해결해서 이렇게 적어봄
네이버 웹툰 실시간 순위 데이터 파일을 만들어보자
박조은 강사님 수업에서는 table
형식으로 된 html을 받아 데이터 프레임을 만들었지만 나는 리스트 형태의 html을 데이터 프레임으로 넣는 것이라 내용은 조금 다릅니다.
아래에는 강의내용과 함께 정리할 것으로 코드만 있지는 않아요.
(내용이 아주 많을 것이라는 이야기)
주피터 노트북을 사용할까 했지만, 현재 코랩으로 공부 중이기 때문에 코랩으로 하겠음
웹사이트(website), 하이퍼링크(hyperlink), 데이터(data), 정보 자원을 자동화된 방법으로 수집, 분류, 저장하는 것.
🔗출처 링크
웹 사이트(website)에 존재하는 데이터 중에서 필요한 데이터만을 추출하도록 만들어진 프로그램.
🔗출처 링크
웹 크롤링 | 웹 스크래핑 |
---|---|
웹 페이지의 링크를 타고 계속해서 탐색 | 데이터 추출을 원하는 대상이 명확해서 특정 웹사이트만을 추적 |
중복제거 필수 | 특정 데이터만을 추출하기 때문에 중복제거 필수는 아님 |
무분별한 크롤링을 막기 위해 robots.txt
로 권고안을 만들어 둠
웹서버에 요청을 보내도 로봇으로 판단되어 요청이 거부당하는 일이 생길수도 있음
따라서 요청하기 전 headers
를 생성하여 같이 보내주면 됨.
웹 스크래핑을 하기 전 robots.txt를 확인해야 함
/robots.txt
를 추가Disallow : /
Allow : /navercontest/2022
read_html()
로 받을 수 없다.import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
from datetime import datetime
cmd
를 연다pip install beautifulsoup4 pandas requests
를 입력한다requests
: http 통신을 하기 위한 라이브러리BeautifulSoup
datetime
: 시간을 가져와주는 라이브러리url = 'https://comic.naver.com/webtoon/weekday'
read_html
로 불러와지는지 확인rsp = requests.get(url)
rsp.status_code
html = bs(rsp.text)
검사
클릭find
: 클래스명으로 찾음select
: html 코드에서 copy selector를 찾아서 적으면 빠름rank=html.select('#realTimeRankFavorite > li > a')
이 과정은 사실 하고 싶은대로 하면 되는데
나는 수업에서 table을 가지고 데이터 프레임으로 만들었기 때문에
리스트로도 데이터 프레임을 만들어보도록 하겠음
rank_df = pd.DataFrame()
title_list, rank_num = [], []
for cartoon in rank:
rank_num.append(cartoon['onclick'].split("'")[-2])
title_list.append(cartoon['title'])
rank_df['순위'] = rank_num
rank_df['제목'] = title_list
rank_df
now = datetime.now()
file_name = f'{now.year}{now.month}{now.day}_{now.hour}h{now.minute}m_cartoon.csv'
rank_df.to_csv(file_name, index = 0)
pd.read_csv(file_name)
결과