쓰려고 보니 벌써 다 까먹었지만 처음부터 다시 되돌아보며 이해한 내용을 정리해본다.
1. 설치한 것들
- python
- mongoDB
- Robo3T
2. 배운 것
python, 크롤링, mongoDB
1. 파이썬을 설치한다?
컴퓨터는 1001010 같은 언어만 알아 듣는다. 그래서 내가 쓰는 파이썬 문법을 컴퓨터가 알아들으려면 번역을 해주어야한다. 그래서 파이썬을 설치한다는 것은 일종의 번역 패키지를 설치하는 것이다.
2. 파이썬 패키지?
파이썬 패키지는 이미 만들어진 기능들을 모아 놓은 것이다. 이 패키지를 또 묶어 놓은 것을 라이브러리라고 볼 수 있다. 그래서 이 기능들을 사용하기 위해 패키지를 설치한다. 즉, 패키지를 설치한다는 것은 패키지를 묶어놓은 라이브러리를 설치한다는 것과 같다.
3. 패키지 사용하기
Requests 라이브러리를 사용해본다. 이 라이브러리를 사용해서 API의 원하는 값을 가져올 수 있다. 서울시 ㅇㅇ구의 미세먼지 값을 가져와보았다.
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'])
4 웹스크래핑(크롤링)
크롤링은 웹페이지에서 내가 원하는 부분의 데이터만 가져오는 것이다. 이때 beautifulsoup4라는 패키지가 새로 필요하다.
```python
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')
#############################
# (입맛에 맞게 코딩)
#############################
```
위의 기본 세팅을 바탕으로 soup.select(전부 가져오기), selct_one(하나만 가져오기)를 사용해서 크롤링한다.
5. DB
mongoDB는 저장한 DB가 눈에 보이지 않는다.(GUI를 제공하지 않음) 때문에 Roboto3T를 설치하여 눈으로 볼 수 있도록 한다. DB는 크게 두가지 종류가 있다. RDBMS(SQL), No-SQL이 있다. RDBMS(SQL)는 쉽게 생각하면 엑셀처럼 정해진 틀에 데이터를 저장하는 것이다. No-SQL은 RDBMS처럼 틀이 없다. 딕셔너리 형태로 데이터를 저장하며, 어떤 줄엔 하나만 저장했다가 어떤 줄엔 두 개 같은 식으로 일관성 없이 자유롭게 저장할 수 있다. mongoDB가 바로 No-SQL이다.
6. Pymongo 라이브러리
mongoDB를 조작하려면 Pymongo 라이브러리가 필요하다. 따라서 Pymongo 패키지를 설치해준다.
from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.namewhatiwant # 'namewhatiwant'라는 이름의 db를 만듭니다.
#코딩시작
위는 Pymongo 기본코드이다.
# 저장 - 예시
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'})
기본코드를 바탕으로 위의 코드들을 사용하여 DB를 다룰 수 있다.
7. 숙제 : 지니뮤직 사이트 크롤링(스크랩핑)
순위 / 곡제목 / 가수를 크롤링하였다. 여기서 문제는 순위였는데 순위를 크롤링 해오면 1 상승, 2 하락 같은 뒤에 필요없는 것까지 크롤링 되는 것이었다. 때문에 뒤의 것들을 없애고 싶었다. 이때 span을 어떻게 없애야하는 지를 한참 검색했다. 그러다 방법을 찾아냈다. 이게 맞는지, 잘 작동된 건지는 모르겠지만 tr.select_one('td.number').span.extract().text extract()을 사용해서 span만 없애고 나머지 원하는 것만 남겼다. 그 다음 span이 없어진 상태의 rank = tr.select_one('td.number').text.strip() 를 가져오는 방법을 사용했다. 그래서 해결을 하고 숙제를 제출하였다. 그런데 그 다음에 해설영상을 보는데 [0:2] 를 사용해서 문자열을 나누는 방식을 사용하셨다. 줄이 추가 될 필요도 없고 아주 간단했다. 이럴수가! 잘 알아두고 나중에 잘 사용해야겠다.
'Week I Learned' 카테고리의 다른 글
[WIL] 항해99 Week4 회고 | 3-2 주특기 숙련 | 3-3 주특기 심화 | ORM, SQL vs NoSQL (0) | 2022.02.07 |
---|---|
[WIL] 항해99 Week3 회고 | 3-1 주특기 입문 | 3-2 주특기 숙련 | Restful API, package.json (0) | 2022.01.30 |
[WIL] 항해99 Week2 회고 | 02 알고리즘 기초 | 03 주특기 입문 | JavaScript의 ES란?, ES5/ES6 문법 차이 (0) | 2022.01.24 |
[WIL] 항해99 Week1 회고 | 01 웹 미니 프로젝트 | 02 알고리즘 기초 | JWT, API (0) | 2022.01.16 |
[항해99] 사전준비 웹개발종합반 4주차 (0) | 2021.12.25 |