티스토리 뷰

반응형

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라는 컬렉터에 들어가는 것을 확인 가능.

 

 

MongoDB Cloud

MongoDB Cloud is a unified data platform for modern applications and includes a global cloud database, search, data lake, mobile, and application services.

www.mongodb.com

위 문법으로 진행해서 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() /# 15strip함수가 있는데 peaches가 왜 이상하게 나오는지 잘 모르겠다.

artist = genie.select_one('td.info > a.artist.ellipsis').text.strip()

 

print(rank,title,artist)

 

문제점 : 동일한 코드인데 15위에 있는 peaches는 왜 저렇게 나오는지 잘 모르겠음.

 

반응형
댓글