티스토리 뷰
Python 시작하기.
venv은 없는 폴더로 생각할 것. 여기에 무언가 만들면 안됨. (라이브러리가 패키지로 담기는 곳임 : 가상환경)
Python은 변수를 정의할 때 let 이런 것 필요없음.
그냥 쓰면 됨.
a = 2
b = 3
print(a+b)
a = 'jihhon'
b = 'lee'
a_list = ['사과','배','감']
print(a_list[1])
Python에서 함수 정의하는 방법
def sum(a,b):
return a+b
result = sum(1,2)
print(result)
직관적이다. {} 필요없다. 대신 들여쓰기가 굉장히 중요하다.
def is_adult(age):
if age > 20 :
print('성인입니다')
else :
print('청소년입니다')
반복문은 일반 문장들과 다르다.
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
for fruit in fruits :
print(fruit)
애초에 리스트 (배열처럼 된 녀석)을 써먹기 위해서 만들어진 언어.
fruits에 있는 것을 하나씩(fruit)꺼내서 쓰겠다는 의미.
직관적으로 이해가 되도록. (fruit > aaa)로 바꿔도 상관없음
딕셔너리형 데이터 컨트롤 방법.
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['name'])
굉장히 특이하지만... 오히려 적응하면 쉬울지도??
1) 반복문은 하나씩 꺼내온다.
2) 자료형은 그 타입에 맞게 알아서 해석해서 써먹는다.
Python 요약
1)직관적인 언어다.
2)변수 정의 필요없다
3)들여쓰기를 잘해야한다.
4)반복문도 직관적이다.
남들이 써놓은 라이브러리를 Python에서는 패키지라고 부른다.
패키지를 불러오면 venv 폴더로 들어감.
패키지 불러오는법
파일 - 설정 - 프로젝트이름 - Python 인터프리터 - [+] 버튼 누르기 + 패키지명 입력 + 패키지 설치
패키지중 requests의 역할 = Ajax 같은 녀석을 깔아준 것.
requests 패키지 써서 실습해본 것
import requests # requests 라이브러리 설치 필요
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
rows = rjson['RealtimeCityAir']['row']
for row in rows :
gu_name = row['MSRSTE_NM']
gu_mise = row['IDEX_MVL']
if gu_mise < 10:
print(gu_name)
크롤링 기본세팅 하는법
BeautifulSoup이라는 것을 쓰면된다.
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.naver?sel=pnt&date=20210829',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies :
a = movie.select_one('td.title > div > a')
if a is not None :
print(a.text)
나중에 우리는 data에 있는 URL주소만 바꿔서 쓰면 된다.
BeautifulSoup 사용하는 방법.
(크롤링할 사이트에서 검사 후 요소별로 문법 체크)
검사 - 문장에서 copy - copy selector [크롤링할 데이터 찾아오는 방법]
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
star = movie.select_one('td.point').text
print(rank, title, star)
print(rank)를 하면 나오는 값
rank라는 데이터에는 alt, height, src, width가 들어있는데 이중에서 alt만 가져오면 되니
rank['alt']를 하면 되는 부분.
DB를 쓰는 이유 = 저장하기 위해서? X / 쉽고 빠르게 잘 찾기 위해서.
최근에는 DB를 클라우드 mongoDB Atlas 등의 서비스를 이용하면 됨.
회원가입하기
강의와 순서가 살짝 다름. (참고)
mongoDB 실습
패키지 설치 필요 : dnspython, pymongo
DB에 데이터를 넣는 실습.
from pymongo import MongoClient
client = MongoClient('URL 입력')
db = client.dbsparta
doc = {
'name' : 'bob',
'age' : 27
}
db.users.insert_one(doc)
users라는 컬렉터에 들어가는 것을 확인 가능.
위 문법으로 진행해서 Browse Collections하면 보임.
mongoDB 사용하는 기본적인 문법
from pymongo import MongoClient
client = MongoClient('URL 입력')
db = client.dbsparta
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
위 문법 + MongoDB 사이트 두가지만 있으면 DB연결은 언제나 가능.
특정 조건에 맞는 DB만 찾아내는 문법.
star = 변수
'star' = DB에 있는 데이터.
find('star':star) = find(DB : 변수)
movie = db.movies.find_one({'title':'가버나움'})
star = movie['star']
all_movies = list(db.movies.find({'star':star}))
3주차 과제 : 지니에서 제목, 가수, 순위 크롤링해오기.
1) 사이트에서 검사 > Copy > Copy Selector로 2개 가져오기.
2) 두개 중에 공통되는 부분이 어디인지 찾아보기.
3) 공통이 될 수 있는 부분을 select('')로 묶어서 변수 하나 설정해주기.
4) for문을 돌려서 반복을 할 수 있게 하고, 제목, 가수, 순위 별로 변수 설정하기.
5) 변수에는 Copy Selector에서 반복되지 않는 각각의 요소를 넣기
6) .text 함수를 이용해서 그 안에 있는 내부 데이터만 읽어오기.
Tip.
여러개의 문자가 있는데 그중 일부(2개)만 출력하고 싶다면 text[0:2] 옵션을 이용.
문장에 불필요한 공백이 많이 포함되어있다 (앞/뒤로) 이 경우에는 strip()함수 사용.
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=M&rtm=N&ymd=20210701',headers=headers)
# 순위, 곡 제목, 가수 크롤링 해오기.
# 순위 크롤링
#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(2) > 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(2) > td.info > a.title.ellipsis
#가수 크롤링
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(6) > td.info > a.artist.ellipsis
soup = BeautifulSoup(data.text, 'html.parser')
genies = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for genie in genies :
rank = genie.select_one('td.number').text[0:2].strip() #2자리씩 끝내는데, 공백있으면 없애라 / strip없으면 1~10위가 띄어쓰기 됨.
title = genie.select_one('td.info > a.title.ellipsis').text.strip() /# 15위 strip함수가 있는데 peaches가 왜 이상하게 나오는지 잘 모르겠다.
artist = genie.select_one('td.info > a.artist.ellipsis').text.strip()
print(rank,title,artist)
문제점 : 동일한 코드인데 15위에 있는 peaches는 왜 저렇게 나오는지 잘 모르겠음.