Python의 beautifulsoup과 request를 import 하여서 네이버 영화와 지니 음악 스트리밍 사이트의 영화와 음악 목록들을 크롤링해보았다.
headers를 사용한 이유는 일반적인 request가 대부분의 사이트에서 보안이슈 등으로 잠겨있기 때문에 내가 요청하는 py코드가 브라우저라고 착각하게 만드는 코드이다.
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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
trs = soup.select('#old_content > table > tbody > tr')
# 코딩 시작
print(trs)
for tr in trs:
a_tag = tr.select_one('td.title > div > a')
if a_tag is not None:
rank = tr.select_one('td.ac > img')
rank = rank['alt']
title = a_tag.text
star = tr.select_one('td.point')
star = star.text
print(rank , title, star)
doc = {
'rank':rank,
'title':title,
'star':star
}
또한 MongoDB를 이용하여 크롤링한 데이터를 저장해보기도 하였다. 기존에 MariaDB를 SQL로 다뤄봤는데 CLI로 다루었으나, 이번에는 NoSQL타입인 MongoDB에 Pymongo를 이용하여 데이터를 조작하고 조작한 데이터를 Studio3T라는 GUI 어플리케이션으로 다루어보았다.
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
same_ages = list(db.users.find({'age':21},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
아래는 지니뮤직을 크롤링해보았다.
import requests
from bs4 import BeautifulSoup
import requests
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.list')
# 코딩 시작
for tr in trs:
title = tr.select_one('td.info > a.title')
artist = tr.select_one('td.info > a.artist')
rank = tr.select_one('td.number')
if title is not None:
title = title.text.strip()
artist = artist.text.strip()
rank = rank.text[0:2].strip()
print(rank,title,artist)
지니뮤직에서는 음악의 제목과 가수 그리고 순위를 크롤링하여서 trim()과 비슷한 strip()을 이용하여 공백을 제거하여보았다. rank가 아니라 str처리된 text의 뒤에 [0:2]를 하여야 필요한 부분만 추출 할 수 있음을 알게 되었다.