[내일배움캠프 사전공부 웹개발 3주차]

안떽왕·2023년 2월 23일
0

파이썬

파이썬에서 변수지정은 자바스크립트와는 다르게 매우 간단하다

a = 2
b = ['사과', '배', '감']
c = {'name' : '영수', 'age' : 24}

파이썬에서의 함수생성

def sum(a, b, c):
    return a + b + c

result = sum(1, 2, 3)

print(result)

파이썬은 줄맞춤을 반드시 해야 함수속에 적은 내용이라는것을 인식한다.
출력값은 1 + 2 + 3인 6이 출력된다.

파이썬의 조건문

age = 25

if age > 20:
    print('성인입니다.')
else:
    print('청소년입니다.')

25살이 20살보다 크기 때문에 ‘성인입니다.’가 출력된다.

파이썬의 반복문

ages = [5, 10, 13, 23, 25, 9]

for a in ages:
    if a > 20:
        print('성인입니다')
    else:
        print('청소년입니다')

a라는 변수에 값을 하나씩 가져온다.

requests 패키지 사용해보기

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

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

rows = rjson['RealtimeCityAir']['row']

for a in rows:
    gu_name = a['MSRSTE_NM']
    gu_mise = a['IDEX_MVL']
    print(gu_name, gu_mise)

웹스크래핑(크롤링)

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

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None:
        print(a.text)

크롤링을 하려는 사이트에 접속해서 원하는 위치에 우클릭 검사로 해당 html을 분석함

분석해보니 원하는 데이터는 tr에 담겨 있었음

soup안에 해당 데이터틀이 담기게 설정되어 있으니 trs 변수를 생성해서 soup안에 tr까지의 데이터를 선택해 넣음

이후 for문을 통해 trs의 tr까지의 데이터 들은 tr변수로 하나씩 넘어가고 그안에 원하는 값을 얻기 위해 a 변수에 tr의 데이터중 필요한 부분을 수집

참고로 select는 결과값이 리스트의 형태로 저장되고, select_one은 글자대로 저장된다

이 상태로 출력해보니 중간마다 None이 끼워져 있었는데 이는 사이트에서 10등마다 구분하기 위해 만든 구분선이였다.

그래서 if문을 사용해 None값이 아닐때만 출력하도록 하여 원하는 값을 얻어냈다.

네이버영화에서 순위, 영화이름, 평점 크롤링하기

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

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a= tr.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        star = tr.select_one('td.point').text
        print(rank, title, star)

네이버 영화 페이지에서 우클릭 검사 후 원하는 위치에 블록이 쳐지는 코드를 찾는다

필요한 코드를 셀렉트 복사를 통해 가져온 후 필요한 부분만 select_one에 붙혀넣는다.

그 상태로 한번 출력해보고 필요한 부분을 다시 확인한다.(위 코드에서 rank의 경우 ‘alt’)

print(rank[’alt’])이런식으로 작성해도 문제는 없지만 코드의 가독성을 위해 변수 지정코드에 붙힌다.

star의 경우 텍스트만 가져오기에 .text를 통해 가져온다.

이후 출력하면 완성

DB개괄

DB를 쓰는 이유는 잘 넣어두기 위해서가 아니라 나중에 잘 찾기 위해서이다.

DB의 종류

SQL(MS-SQL, MY-SQL 등)

  1. 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사함
  2. 데이터가 엄청 많아지면 중간에 갑자기 열 하나를 더하기는 어려움
  3. 정형화되어 있는 만큼, 데이터의 일관성이나 분석에 용이할 수 있다.

NoSQL(MongoDB)

  1. 딕셔너리 형태로 데이터를 저장하는 DB
  2. 데이터 하나 하나 마다 같은 값들을 가질 필요가 없음
  3. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있음

MongoDB-Atlas 연결하기

pymongo와 dnspython 설치가 필요함

pip install dnspython

pip install pymongo

데이터베이스에 데이터 입력하기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

doc = {
    'name' : '영수',
    'age' : 24
}
db.users.insert_one(doc)

url은 내 데이터베이스 주소이며, 그중 sparta:test는 아이디:비밀번호 이다.
위의 경우 users 에 doc의 데이터가 저장된다.

데이터베이스의 데이터 가져오기

모든 데이터를 불러올때

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

all_users = list(db.users.find({},{'_id':False}))

for a in all_users:
	print(a)

뒤에 {'_id':False}))는 id값을 안보겠다는 의미, 깔끔하게 데이터만 보려면 저 문구를 붙이면 된다.

하나만 불러올때

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

user = db.users.find_one({}, {'_id':False})
print(user)

이러면 가장 앞에있는 데이터 하나만 불러온다.

데이터베이스의 데이터 수정하기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.users.update_one({'name':'영수'},{'$set':{'age':19}})

이러면 영수의 나이가 19로 변경된다.

데이터베이스의 데이터 삭제하기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.users.delete_one({'name':'영수'})

사실상 실무에서 쓰일 일은 거의 없다. 이러면 영수의 데이터가 삭제된다.

데이터베이스 조작 용어 정리

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
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'})

크롤링결과 데이터베이스에 저장하기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

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

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a= tr.select_one('td.title > div > a')
    if a is not None:
        title = a.text
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        star = tr.select_one('td.point').text
        doc = {
            'title' : title,
            'rank' : rank,
            'star' : star
        }
        db.movies.insert_one(doc)
```![](https://velog.velcdn.com/images/william741/post/564d28db-f64f-4ede-a0e8-e721ea0289f1/image.png)

이미 만들었던 크롤링 결과코드 위에 DB를 이용하기 위한 코드 3줄을 입력해주고

if문 안에 doc 변수 안에 딕셔너리 형태로 만들어서 저장

이후 역시 if문 안에 doc 변수를 movies 데이터베이스에 저장함으로서 업로드 완료

### 데이터베이스에서 영화 가버나움의 평점 가져오기

```python
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

movie = db.movies.find_one({'title':'가버나움'})
print(movie['star'])

가버나움과 같은 평점의 영화 가져오기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

movie = db.movies.find_one({'title':'가버나움'})
target_star = movie['star']

movies = list(db.movies.find({'star' : target_star},{'_id':False}))
for a in movies:
    print(a['title'])

target_star 변수에 가버나움의 평점을 집어넣음

movies 변수에 평점이 target_star와 같은 모든 데이터를 가져옴

for문을 이용해 하나씩 값을 집어 넣고 변수 a를 출력

가버나움의 평점을 0으로 만들기

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.6k98ulg.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.movies.update_one({'title':'가버나움'},{'$set':{'star':0}})
profile
이제 막 개발 배우는 코린이

0개의 댓글