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)