※ 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 |