오늘은 파이썬을 사용하여 웹을 크롤링하는 방법을 공부했습니다.
혼란도 했지만, 방법에 그리 어렵지 않기 때문에 익숙해지면 곧바로 활용할 수 있다고 생각한다🤔
목차
크롤링 기본 설정
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.naver?sel=pnt&date=20210829',headers=headers)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
#############################
# (입맛에 맞게 코딩)
#############################
BeautifulSoup 내 선택에서 미리 정의 된 방법
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명(속성="값")')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
Quiz – 지니 1위~50위 곡을 스크레이핑 해 본다
나가야 할 결과
더 보기
팁
0) 출력할 때는 print(rank, title, artist) 한다!
1) 전부터 2문자만 자른다!
text(0:2) 쓰기
2) 여백이나 다른 문자가 나오면 파이썬의 내장 함수 인 strip을 사용합니다.
내 코딩 결과
15위 Peaches를 제외한 값은 올바르게 출력되었다.
Peache 여백이 발생한 이유를 확인해 보면,19금라는 코드를 가졌다
해결 방법 ⭐
19금삭제하는 코드가 무엇인지 보았습니다.
“BeautifulSoup에서 하위 태그를 제외한 상위 태그의 텍스트만 추출” 라는 문장이 있고, 대표적인 방법이다 decompose()그리고 extract()를 찾을 수 있었다.
decompose() 코드 사용
soup.find('span', class_='icon icon-19').decompose()
- soup에서 find 메소드를 사용하여 span 및 class_=’icon icon-19′ 찾기
(금은 하위 부모 span에 포함되어 있습니다) - decompse() 메서드를 사용하여 find 값 삭제
최종 코드
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'}
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
soup.find('span', class_='icon icon-19').decompose()
trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for tr in trs:
title = tr.select_one('td.info > a.title.ellipsis').text.strip()
rank = tr.select_one('td.number').text(0:2).strip()
name = tr.select_one('td.info > a.artist.ellipsis').text
print(rank, title, name)