3주차 개발일지🎈

세리·2021년 9월 5일
0

스파르타코딩클럽

목록 보기
3/5

3주차 배운내용!

  • Python, 크롤링, mongoDB

파이썬 기초 문법

  • 변수 & 기본연산

    a = 3      # 3을 a에 넣는다
    b = a      # a를 b에 넣는다
    a = a + 1  # a+1을 다시 a에 넣는다
    
    num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
    num2 = 99 # 99의 값을 num2이라는 변수에 넣는다
    
    # 변수의 이름은 마음대로 지을 수 있음!
    # 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?
  • 자료형

    • 숫자, 문자형

      name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
      num = 12 # 숫자가 들어갈 수도 있고,
      
      is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.
      
      #########
      # 그리고 List, Dictionary 도 들어갈 수도 있죠. 그게 뭔지는 아래에서!
    • 리스트 형 (Javascript의 배열형과 동일)

      a_list = []
      a_list.append(1)     # 리스트에 값을 넣는다
      a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다
      
      # a_list의 값은? [1,[2,3]]
      # a_list[0]의 값은? 1
      # a_list[1]의 값은? [2,3]
      # a_list[1][0]의 값은? 2
    • Dictionary 형 (Javascript의 dictionary형과 동일)

      a_dict = {}
      a_dict = {'name':'bob','age':21}
      a_dict['height'] = 178
      
      # a_dict의 값은? {'name':'bob','age':21, 'height':178}
      # a_dict['name']의 값은? 'bob'
      # a_dict['age']의 값은? 21
      # a_dict['height']의 값은? 178
    • Dictionary 형과 List형의 조합

      people = [{'name':'bob','age':20},{'name':'carry','age':38}]
      
      # people[0]['name']의 값은? 'bob'
      # people[1]['name']의 값은? 'carry'
      
      person = {'name':'john','age':7}
      people.append(person)
      
      # people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
      # people[2]['name']의 값은? 'john'
  • 함수

    • 함수의 정의 - 이름은 마음대로 정할 수 있음!

      # 수학문제에서
      f(x) = 2*x+3
      y = f(2)
      y의 값은? 7
      
      # 참고: 자바스크립트에서는
      function f(x) {
      	return 2*x+3
      }
      
      # 파이썬에서
      def f(x):
      	return 2*x+3
      
      y = f(2)
      y의 값은? 7
    • 함수의 응용

      def sum_all(a,b,c):
      	return a+b+c
      
      def mul(a,b):
      	return a*b
      
      result = sum_all(1,2,3) + mul(10,10)
      
      # result라는 변수의 값은?
  • 조건문

    • if / else 로 구성!

      def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
      	if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
      		 return True   # True (참)을 반환한다.
      	else:            # 아니면,
      		 return False  # False (거짓)을 반환한다.
      
      result = oddeven(20)
      # result의 값은 무엇일까요?
      def is_adult(age):
      	if age > 20:
      		print('성인입니다')    # 조건이 참이면 성인입니다를 출력
      	else:
      		print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력
      
      is_adult(30)
      # 무엇이 출력될까요?
  • 반복문

    • 파이썬에서의 반복문은, 리스트의 요소들을 하나씩 꺼내쓰는 형태

    • 즉, 무조건 리스트와 함께 쓰임

IDEX_MVL 값이 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:
	if gu['IDEX_MVL'] < 60:
		print (gu['MSRSTE_NM'], gu['IDEX_MVL'])

웹스크래핑 해보기 (영화 제목)

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 = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        # a의 text를 찍어본다.
        print (a_tag.text)
  • beautifulsoup 내 select에 미리 정의된 다른 방법

    # 선택자를 사용하는 방법 (copy selector)
    soup.select('태그명')
    soup.select('.클래스명')
    soup.select('#아이디명')
    
    soup.select('상위태그명 > 하위태그명 > 하위태그명')
    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
    
    # 태그와 속성값으로 찾는 방법
    soup.select('태그명[속성="값"]')
    
    # 한 개만 가져오고 싶은 경우
    soup.select_one('위와 동일')
  • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있음

    1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
    2. 원하는 태그에서 마우스 오른쪽 클릭
    3. Copy → Copy selector로 선택자를 복사할 수 있음

pymongo 기본 코드

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

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'})

3주차 숙제 : 지니뮤직 크롤링하기

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=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')

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN