etc.
005 / 스파르타코딩클럽 왕초보 웹개발 3주차 일지 (파이썬)
zubetcha
2021. 10. 22. 18:18
1. 파이썬 기초 문법
- 변수, 자료형, 함수, 조건문, 반복문
01. 변수
- javascript에 비해서 굉장히 직관적
a = 2
b = 3
print(a+b)
결과값 > 5
first_name = 'juhye'
last_name = 'jeong'
print(first_name+last_name)
결과값 > juhyejeong
02. 자료형
- list 또한 동일
a_list = ['사과', '배', '감']
print(a_list)
결과값 > ['사과', '배', '감']
- list 추가 메소드 .append (궁금한 게 있을 때는 구글링하는 습관 들이기)
a_list = ['사과', '배', '감']
a_list.append('수박')
print(a_list)
결과값 > ['사과', '배', '감', '수박']
- 딕셔너리도 동일
a_dict = {'name':'bob', 'age':27}
print(a_dict)
결과값 > {'name':'bob', 'age':27}
print(a_dict['name'])
결과값 > bob
- 딕셔너리 추가
a_dict = {'name':'bob', 'age':27}
a_dict['height'] = 178
print(a_dict)
결과값 > {'name':'bob', 'age':27, 'height':178}
03. 함수
def sum(num1, num2):
return num1+num2
result = sum(2, 3)
print(result)
결과값 > 5
- 함수에서 콜론 : 의 의미는 포함한다는 의미
- 즉 콜론에서 enter 후 아랫줄에 탭이 자동으로 들여져 있는 상태에서 작성하는 것들은 모두 해당 함수의 정의 (혹은 변수) 에 속함
04. 조건문
age = 25
if age > 20:
print('성인입니다')
else:
print('청소년입니다')
실행 결과값 > 성인입니다
# 함수로 만들어보기
def is_adult(age):
if age > 20:
print('성인입니다')
else:
print('청소년입니다')
is_adult(3o) > 성인입니다
is_adult(15) > 청소년입니다
05. 반복문
# 반복문은 리스트 안에서 하나씩 돌면서 가져와서 쓰는 것
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
for fruit in fruits:
print(fruit)
결과값
사과
배
배
감
수박
귤
딸기
사과
배
수박
# 리스트 안에 딕셔너리가 포함되어 있는 경우
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': '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'])
결과값
bob
carry
john
smith
ben
# 콤마 , 를 이용해 두 개의 값을 같이 찍을 수도 있음
for person in people:
print(person['name'], person['age'])
결과값
bob 20
carry 38
john 7
smith 17
ben 27
# 조건문 사용
for person in people:
if person['age'] < 20:
print(person]
결과값
{'name': 'john', 'age': 7}
{'name': 'smith', 'age': 17}
2. 패키지 사용해보기
01. requests
# requests 사용해보기
import requests # requests 라이브러리 설치 필요
r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()
print(rjson['RealtimeCityAir']['row'][0]['NO2'])
# 반복문을 활용하여 미세먼지가 60 이상인 구 이름과 미세먼지 값 출력하기
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:
gu_name = gu['MSRSTE_NM']
gu_mise = gu['IDEX_MVL']
if (gu_mise > 60):
print(gu_name, gu_mise)
02. 웹스크래핑 (크롤링) / bs4
크롤링 기본 세팅
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')
# 코딩 시작
📌 bs 에서 텍스트를 가져올 때는 .text, 속성을 가져올 때는 ['href']
📌 .select 메소드는 결과가 list 형으로 나옴
영화 순위, 제목, 별점 가지고 오기
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')
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img
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
point = tr.select_one('td.point').text
print(rank, title, point)
03. pymongo
- pymongo란? mongoDB를 조작하기 위한 라이브러리
- mongoDB > 딕셔너리 형태의 데이터가 쌓이는 프로그램
- pymongo 기본 코드
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
# insert / find / update / delete
# insert
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# find
same_ages = list(db.users.find({'age':21},{'_id':False}))
for person in same_ages:
print(person)
# find_one
user = db.users.find_one({'name':'bobby'})
print(user)
# update
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# update_many (모두 찾아서 갱신)
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# delete_one
db.users.delete_one({'name':'bobby'})
3. 웹 스크래핑 결과 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')
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img
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
point = tr.select_one('td.point').text
doc = {
'rank':rank,
'title':title,
'point':point
}
db.movies.insert_one(doc)
4. 숙제 - 음악 사이트의 순위, 노래제목, 아티스트 가져오기
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://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')
#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.title.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
for tr in trs:
rank = tr.select_one('td.number').text.split()[0]
title = tr.select_one('a.title.ellipsis').text.strip()
artist = tr.select_one('a.artist.ellipsis').text
print(rank, title, artist)
doc = {
'rank':rank,
'title':title,
'artist':artist
}
db.musics.insert_one(doc)