https://www.notion.so/teamsparta/3-ed5a2f9b258b4ac6bb63b95c3af4f6a5
1. 2주차 복습 - 나홀로 링크 메모장에 openAPI
http://localhost:63342/frontend/index.html?_ijt=h79490mj4n1vlpmgd3ut38s655&_ij_reload#
<script> $(document).ready(function () { $('#cards-box').empty() listing(); }); function listing() { $('#cards-box').empty() $.ajax({ type: "GET", url: "http://spartacodingclub.shop/post", data: {}, success: function (response) { let rows = response ['articles'] for (let i = 0; i < rows.length; i++) { let comment = rows[i]['comment'] let desc = rows[i]['desc'] let image = rows[i]['image'] let title = rows[i]['title'] let url = rows[i]['url'] let temp_html = `<div class="card"> <img class="card-img-top" src="${image}" alt="Card image cap"> <div class="card-body"> <a href="${url}" class="card-title">${title}</a> <p class="card-text">${desc}</p> <p class="card-text comment">${comment}</p> </div> </div>` $('#cards-box').append(temp_html) } } }) } function openclose() { let status = $('#post-box').css('display'); if (status == 'block') { $('#post-box').hide(); $('#btn-posting-box').text('포스팅박스 열기'); } else { $('#post-box').show(); $('#btn-posting-box').text('포스팅박스 닫기'); } } </script> |
$('#cards-box').empty()
둘 중 어디에 넣어도 상관없음!
2. 파이썬
컴퓨터의 언어를 번역해주는 번역팩!
항상 오른쪽 마우스 누르고 Run 누르기!
- 함수
def aa(num1, num2): print('안녕!') return num1+num2 result = aa(2,3) print(result) |
파이썬에서는 중괄호{}같은 거 안 씀. def의 아래 탭되어서 나타나는 부분은 함수 aa의 내용물인 느낌! 함수 aa에 들어오면, print('안녕!') 실행하고, return num1+num2 실행. |
- 조건문
age = 25 if age > 20: print('성인입니다') else: print('청소년입니다') |
def is_adult(age): if age > 20: print('성인입니다') else: print('청소년입니다') is_adult(30) is_adult(15) |
조건문 -> 함수
- 반복문
list 예제
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박'] count = 0 for ff in fruits: if ff == '수박': count += 1 print(count) |
답 : 2 나옴.
list의 원소를 하나씩 빼서 사용하는 형태!
count += 1 는
count = count + 1 와 같다.
dictionary 예제
people = [{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38}, {'name': 'john', 'age': 7}, {'name': 'smith', 'age': 17}, {'name': 'ben', 'age': 27}] for person in people: if person['age'] < 20: print(person) |
people = [{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38}, {'name': 'john', 'age': 7}, {'name': 'smith', 'age': 17}, {'name': 'ben', 'age': 27}] for person in people: print(person['name'], person['age']) |
3. 웹스크래핑(크롤링)
- select_one인 경우
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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers) soup = BeautifulSoup(data.text, 'html.parser') title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a') print(title) |
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a> |
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
는 네이버 영화 창에 있는 그린 북에 커서를 두고 오른쪽 마우스 눌러서 검사로 들어간 뒤,
copy - copy selector 눌러서 복사한 것!
print(title)= /movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북
print(title.text) = 그린 북
print(title['href']) = /movie/bi/mi/basic.naver?code=171539
- select, select_one인 경우 1
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://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') for tr in trs: a_tag = tr.select_one('td.title > div > a') if a_tag is not None: title = a_tag.text print(title) |
영화 제목만 나옴! 그린 북 가버나움 베일리 어게인 주전장 포드 V 페라리 아일라 원더 ... |
#old_content > table > tbody > tr
한 줄씩 되어있는 묶음을 검사 - copy - copy selector 했을 때
#old_content > table > tbody > tr:nth-child(3)
#old_content > table > tbody > tr:nth-child(4)
이런 식으로 나옴.
select_one이 아니라 전체를 select 할 때는 줄마다 다른 것 같은 뒤에 밑줄 친 부분을 빼고 앞부분만 넣는다!
td.title > div > a
그리고 select_one일 때
그린 북 - 검사 - copy - copy selector
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a 중에
뒷 부분만 넣기!
if a_tag is not None:
print(a_tag) 했을 때 중간에 선 부분이 None으로 나옴.
그래서 그냥 print(title.text)하는 경우 None부분은 text가 없기 때문에 오류가 남.
중간에 if문을 넣어줘서 None을 걸러냄.
- select, select_one인 경우 2 - 응용
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://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') for tr in trs: a_tag = tr.select_one('td.title > div > a') if a_tag is not None: rank = tr.select_one('td:nth-child(1) > img')['alt'] title = a_tag.text star = tr.select_one('td.point').text print(rank, title, star) |
01 그린 북 9.60 02 가버나움 9.59 03 베일리 어게인 9.52 04 주전장 9.52 05 포드 V 페라리 9.51 06 아일라 9.49 07 원더 9.49 08 당갈 9.47 09 쇼생크 탈출 9.44 010 터미네이터 2:오리지널 9.43 11 보헤미안 랩소디 9.42 ... |
4. DB(DataBase)
Mongo DB - 데이터베이스. 기본적으로 데이터를 쌓아 두는 곳. Mongo DB는 내 눈에 보이지는 않지만 돌아가는 중.
Robo 3T - Mongo DB의 데이터를 시각화하여 우리 눈으로 볼 수 있게 하는 것.
데이터베이스는 데이터를 잘 가져다 쓰려고 쓰는 것!
> 데이터베이스 종류
SQL - 틀이 존재함. 열, 행을 미리 정해 놓음.
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니
ex) MS-SQL, My-SQL 등
NoSQL(Not Only SQL) - 틀 없이 한 줄 한 줄이 dictionary 형태로 들어감.
딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.
ex) MongoDB
- pymongo로 DB조작하기
from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta |
기본 틀
# 저장 - 예시 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'}) |
insert 데이터 넣음
find 데이터 찾음
update 있는 데이터 업데이트
delete 데이터 삭제
same_ages = list(db.users.find({'age':21},{'_id':False})) |
users - collection 이름
{'age':21} - 조건. 보통 비어있는 경우 많음! same_ages = list(db.users.find({},{'_id':False}))
{'_id':False} - id값은 나타내지 말아라
user = db.users.find_one({'name':'bobby'},{'_id':False}) |
하나만 가져오라고 하고 싶을 때!
if bobby가 여러명 있어도 제일 위에 하나만 가져옴.
db.users.update_one({'name':'bobby'},{'$set':{'age':19}}) |
bobby라는 이름을 가진 사람의 나이를 19로 바꿔라
db.users.update_many({'name':'bobby'},{'$set':{'age':19}}) |
bobby라는 이름을 가진 사람 모두의 나이를 19로 바꿔라
-> 실제로 잘 쓰지는 않음. (마찬가지로 delete_many도 있지만 거의 사용하지 않음.)
- 웹스크래핑 결과 pymongo로 데이터 DB에 저장하기
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') for tr in trs: a_tag = tr.select_one('td.title > div > a') if a_tag is not None: rank = tr.select_one('td:nth-child(1) > img')['alt'] title = a_tag.text star = tr.select_one('td.point').text doc = { 'rank':rank, 'title':title, 'star':star } db.movies.insert_one(doc) |
- QUIZ dbquiz.py
1. from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta movie = db.movies.find_one({'title':'매트릭스'}) print(movie['star']) |
|
2. from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta movie = db.movies.find_one({'title':'매트릭스'}) target_star = movie['star'] target_movies = list(db.movies.find({'star':target_star},{'_id':False})) for target in target_movies: print(target['title']) |
-> 그냥 print(target_movies)해도 상관 없는데, 이렇게 list 안에 dictionary들이 들어있는 경우에는 이렇게 해주는 게 더 보기 편함! |
3. from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}}) |
다른 애들이 다 문자열이니까 관리하기 편하도록 0도 숫자가 아닌 문자열('0')로 표시해주는 것이 더 좋음. |
'SpartaCodingClub > week 3' 카테고리의 다른 글
3주차 과제 _지니뮤직 웹스크래핑 / geine.py (0) | 2021.09.02 |
---|