데일리로그C:
article thumbnail
Published 2022. 6. 23. 23:51
22.06.23(목) Python/Web_log

※ 4,5주차에 파이썬 사용해서 컴퓨터한테 서버 역할을 해줘 명령 내림

 몽고db = 데이터베이스(눈에 보이지 않게 데이터 쌓아두는 곳) 

     로보3t = 몽고db 데이터를 시각화 해주는 프로그램 

 

 


Ajax 복습

   --> 나홀로 링크 메모장에 API 넣기 ( http://spartacodingclub.shop/post )

 

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

영화 메모장!!


 

파이썬

   --> 일종의 번역 패키지(명령 내린 걸 컴퓨터가 알아듣게 번역해줌)

   --> 데이터분석 가능, 직관적임, 라이브러리 풍부함, 진입장벽 낮음!

   --> 중괄호 안씀!!!! 그 대신 줄로 판단

   --> 땀( ; ) 이 아니라 콜론( : )으로 씀!!!!!

 

   ※ 사용법 설명  

       ▷ 파이참에서 File - new project - pythonprac 폴더 열기 (★ 주의사항 ★ venv 폴더 절대 건들지말기!)

       ▷ pythonprac 폴더 우클릭 - new - pythonfile

   

 

1) 변수

 ---> 자바스크립트랑 다르게 let 선언 같은거 안적어도 됨! 

 ---> print 하고 실행 : 우클릭 - Run ★ 주의사항 

 

 

 

 

 

 

 

 

에러 보는  꿀팁!!

   ---> print( first_name + num )

            : 에러난 위치

   ---> 맨 마지막 줄에 TypeError

            : 에러에 대한 설명

 

 

 

 

 

2) 자료형

  (1) 리스트 --> 자바스크립트와 유사!

a_list = [ '사과', '배', '감' ]
print(a_list)     -------RUN-------->  [ '사과', '배', '감' ]
a_list = [ '사과', '배', '감' ]
print(a_list [0] )    -------RUN--------> 사과
a_list = [ '사과', '배', '감' ]
a_list.append( '수박' )
print(a_list)    -------RUN--------> [ '사과', '배', '감', '수박' ]

 

  (2) 딕셔너리 --> 자바스크립트와 유사!

a_dict = { 'name' : 'bob', 'age' : 27 }
print(a_dict)     -------RUN-------->  { 'name' : 'bob', 'age' : 27 }
a_dict = { 'name' : 'bob', 'age' : 27 }
print(a_dict [ 'name' ])     -------RUN-------->  bob
a_dict = { 'name' : 'bob', 'age' : 27 }
a_dict[ 'height' ] = 180
print(a_dict)     -----RUN----->  { 'name' : 'bob', 'age' : 27, 'height' : 180 }

 

 

3) 함수  

   --> sum 이 아닌 다른 이름이어도 됨!!

def sum(num1, num2)
      return num1 + num2

result = sum(2,3)
print(result)      -------RUN-------->  5
def sum(num1, num2) : 
      print( '안녕! ' )
      return num1 + num2
result = sum(2,3)
print(result)      -------RUN-------->  안녕!     5
age = 25

if age > 20 :
     print( '성인입니다' )
else :
     print( '청소년입니다' )    -------RUN-------->  성인입니다
def is_adult(age) :
      if age > 20 :
           print( '성인입니다' )
      else :
           print( '청소년입니다' )

is_adult(30)      -------RUN-------->  성인입니다
is_adult(15)       -------RUN-------->  청소년입니다  

 

4) 반복문

   --> 리스트의 원소를 하나씩 빼서 쓰는 방식!!(리스트가 다 뺐으면 끝!!)

   --> .length 사용 X

   --> 반복문과 리스트는 세트!! 같이 사용됨!

 

fruits = [ '사과', '배', '배', '감', '수박', '귤', '딸기', '사과', '배', '수박' ]

count = 0
for ff in fruits:
      if ff == '수박':
         count += 1

print(count)       -------RUN-------->  2  

    ㄴ> ff가 수박이면 count에 1씩 올려줘라

 

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' ])      
                             -------RUN-------->  bob 20    carry 38    john 7    smith 17     ben 27

 

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)     -------RUN--------> {'name': 'john', 'age': 7} {'name': 'smith', 'age': 17}

 

★ 주의사항 ★ 중괄호 대괄호 어느 때에 사용하는지 XXXX

                         if person[ 'age' ] < 20

                            ㄴ> " person에 age를 빼내올땐 대괄호를 쓰는구나~" 처럼 묶어서 파악하기!!

 

 

※ 파이썬 패키지 설치  

       ▷ 가상환경(virtual environment)  --> venv 폴더

                 : 프로젝트별로 패키지들을 담을 공구함(라이브러리 담아두는 폴더)

       ▷구글링 키워드 : python OOO 패키지 

 

 

requests 패키지

   --> 기본 세팅

 

 

 

1. RealtimeCityAir 딕셔너리 > row >  0번째 > MSRSTE_NM 알아보기

import requests      // requests 라이브러리 설치 필요

r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rjson = r.json()   ------> rjson을 프린트 할 수 있게 변형 한거임

print( rjson [ 'RealtimeCityAir' ] [ 'row' ] [ 0 ] [ 'MSRSTE_NM' ] )   ----RUN------>  중구

 

2. for - in 문

   --> 어떤 범위에 있는 변수 하나하나에 반복 작업을 일정한 간격으로 수행할 때 사용

import 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 :    --------> gus 범위 안에 있는 gu 변수를 반복
	print(gu)   --------RUN------> {'MSRDT': '202206232200', 'MSRRGN_NM': '도심권', 'MSRSTE_NM': '중구', 'PM10': 17.0, 'PM25': 10.0, 'O3': 0.036, 'NO2': 0.017, 'CO': 0.4, 'SO2': 0.003, 'IDEX_NM': '보통', 'IDEX_MVL': 56.0, 'ARPLT_MAIN': 'O3'} 등등...

      ㄴ> gus 안에 gu를 반복!! 

 

3. 구이름이랑 미세먼지 값만 반복

import 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' ] 
	print(gu_name, gu_mise)       -------RUN------> 중구 56.0 종로구 60.0 용산구 65.0 등등

 

4. 3번 중 미세먼지가 65보다 큰 값만

import 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 > 65 :
		print(gu_name, gu_mise)  -------RUN------> 성동구 66.0  구로구 66.0   서초구 66.0

 

 

beautifulsoup4 패키지

   --> 크롤링 : 구글이나 네이버 검색 엔진이 내 사이트를 퍼가는 행위   V

   --> 웹스크랩핑 : 신문 스크랩 하듯이 (크롤링과 혼용해서 사용)

          ㄴ> 가능한 이유? 이미 받아온 걸 가지고 솎아내는 것이라서

          ㄴ> 중요한 기술 : 1) 코드 단에서 요청(requests 사용)

                                       2) html 중 원하는거 잘 솎아내는 것(bs4 사용)

 

   --> 사용 방법: 1) select_one : 하나 나옴     2) select : 리스트로 여러개 나옴

 

   --> 기본 세팅

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

# 코딩 시작

   ※ 코드 설명  

       ▷ headers : 코드 단 요청을 막아둔 사이트들이 많음 그래서 브라우저에서 엔터친거마냥 효과 내어줌

       ▷ data : url

       ▷ soup = ~~~ : 받은 데이터를 가지고 솎아내기 좋은 bs4 형태로 만들어서

       ▷ print : 코드 단에 프린트

 

 

 

https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20200303 (아래 실습에서 사용)

 

랭킹 : 네이버 영화

영화, 영화인, 예매, 박스오피스 랭킹 정보 제공

movie.naver.com

 

1.  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)   ---RUN---> <a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>

   ※ 해당 글자 우클릭 > 검사 > 파란 부분 우클릭 > Copy > Copy selector > ' ' 안에 붙여넣기

 

 

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


title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')

print(title.text)   ---RUN---> 그린 북

      ㄴ> print(title.text)  : 태그 내 텍스트 가져오기

 

 

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://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['href'])   ---RUN---> /movie/bi/mi/basic.naver?code=171539

      ㄴ> print(title [ ' href ' ] ) : 태그 내 속성 가져오기

 

 

 

4. html 구조 파악 > copy selector 여러개 비교 > 동일한 부분이 계속반복됨 을 파악!!!

   --> select 는 리스트 형식으로 나옴

 

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a

#old_content > table > tbody > tr:nth-child(5) > td.title > div > a

 

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')
    print(a_tag)   
    
    -----RUN---> None
    		<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>

   ㄴ> None 은 line 태그 때문임!!

         이 상태에서 print(a_tag.text) 하면 오류 뜸

          print(a_tag.text)
          AttributeError: 'NoneType' object has no attribute 'text'  (none 타입에 text 없다)

 

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)   -----RUN---> 그린 북  가버나움  베일리 어게인  주전장  등등

     ㄴ> trs 범위 내에서 tr 변수를 반복하는데, if a_tag 에서 None 이 아닌 것만 text 프린트해라

 

 

5. 순위, 영화제목, 평점 순으로 print

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)

      ㄴ> 하나 입력하고 print 해보고 이런식으로 계속 확인하면서 할 것!!!

      ㄴ> rank : #old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img  

                 ---> RUN 확인 ---> 필요 [ 'alt' ] 입력

      ㄴ> star : #old_content > table > tbody > tr:nth-child(2) > td.point   

                 ---> RUN 확인 ---> .text 만 나오게 입력

'Python > Web_log' 카테고리의 다른 글

22.06.27(월)  (0) 2022.06.27
22.06.24(금)  (0) 2022.06.24
22.06.04  (0) 2022.06.23
22.06.22(수)  (0) 2022.06.23
22.06.21(화)  (0) 2022.06.22
profile

데일리로그C:

@망밍

포스팅이 도움됐다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...