반응형
배운 것
python 기본 문법
크롤링
mongoDB
내용 정리
크롤링
ㅇ 크롤링을 위해선 Requests, bs4 라이브러리가 필요
Requests 라이브러리 활용 예시
import requests # requests 라이브러리 설치 필요
r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()
gus = rjson['RealtimeCityAir']['row']
for gu in gus:
if gu['IDEX_MVL'] < 60:
print (gu['MSRSTE_NM'], gu['IDEX_MVL'])
서울의 미세먼지를 표시해주는 서울시 대기 OpenAPI에서 값을 가져와 마음대로 연산이 가능!
ㅇ 크롤링 기본 세팅
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')
#############################
# (입맛에 맞게 코딩)
#############################
Requests와 bs4 라이브러리를 설치하고
기본 세팅을 한 후에, select, select_one을 사용해 크롤링
ㅇ 사용방법
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
크롬 개발자도구를 참고해, 크롤링하고 싶은 부분을 Copy Selector로 복사해 크롤링할 때 이용한다
ex) 지니 뮤직에서 순위, 곡이름, 가수이름을 크롤링 하기
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=D&ymd=20220110&hh=23&rtm=N&pg=1',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# select를 이용해서, tr들을 불러오기
songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
# songs (tr들) 의 반복문을 돌리기, 각 노래의 정보를 추출
for song in songs:
# 순위, 곡 이름, 가수 이름
rank = song.select_one('td.number').text[0:2].strip()
name = song.select_one('td.info > a.albumtitle.ellipsis').text
singer = song.select_one('td.info > a.artist.ellipsis').text
print(rank, name, singer)
# 순위
#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.albumtitle.ellipsis
# 가수 이름
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
크롤링 결과가 아래와 같이 출력된다
MongoDB
- No-SQL의 한 종류
- 딕셔너리 형태로 데이터를 저장해두는 DB
- 데이터 하나 하나 마다 같은 값들을 가질 필요가 없음
- 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있음
파이썬에서 사용하기 위해선 pymongo 라이브러리가 필요
# (pymongo라이브러리 인스톨 후)
from pymongo import MongoClient # pymongo를 임포트 하기
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다.
# 코딩 시작
# insert / find / update / delete
# insert
doc = {'name':'biky','age':20,'gender':'female'}
db.users.insert_one(doc)
# find
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
same_ages = list(db.users.find({'age':20},{'_id':False})) # 나이가 20인 데이터 가져옮, id는 표시x
for person in same_ages:
print(person)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
user = db.users.find_one({'name':'bobby'},{'_id':False})
# update
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# delete
db.users.delete_one({'name':'bobby'})
ex) 지니 뮤직에서 순위, 곡이름, 가수이름을 크롤링한 결과를 DB에 저장하기
...
for song in songs:
rank = song.select_one('td.number').text[0:2].strip()
name = song.select_one('td.info > a.albumtitle.ellipsis').text
singer = song.select_one('td.info > a.artist.ellipsis').text
doc = {
'rank': rank,
'name': name,
'singer': singer
}
# 'songs'라는 collection에 {'rank':rank, 'name':name, 'singer':singer}를 넣음
db.songs.insert_one(doc)
DB에 저장된 결과
느낀 점 / 보완할 점
스프링을 하다가 JS와 python개념들이 머리에 들어오니까 아주 복잡하고 정리가 안되는 느낌
하나하나 다시보며 개념을 정립해야겠다
조급해하지말자
'아카이브' 카테고리의 다른 글
스파르타 코딩클럽 [ 웹개발 종합반 ] - 회고 (0) | 2022.01.18 |
---|---|
스파르타 코딩클럽 [ 웹개발 종합반 ] - 5주차 (0) | 2022.01.18 |
스파르타 코딩클럽 [ 웹개발 종합반 ] - 4주차 (0) | 2022.01.18 |
스파르타 코딩클럽 [ 웹개발 종합반 ] - 2주차 (0) | 2022.01.08 |
스파르타 코딩클럽 [ 웹개발 종합반 ] - 1주차 (0) | 2022.01.06 |