Study/Development

[개발일지] 웹개발 종합반 3주

titann 2022. 7. 24. 00:49

<스파르타코딩 웹개발종합반 수강일지>

웹개발 종합반 3주차 수강

 

수업내용: Python / DB(mongoDB)

 

1. Python 기본 문법: 변수 / 자료형 / 함수 / 조건문 / 반복문

2. Python 웹 크롤링

3. DB: mongoDB 연결하여 data 올리기

 

Python을 처음 배웠는데, 생각보다 훨씬 간단한 문법에 놀랐고, 크롤링 원리를 알게되어 재밌었다.

여러 패키지를 다운받아야 하는데, 그 패키지를 잘 기억해두어야겠다.

 

DB 연결이 잘 안되어 해멨으나, 도움을 받아 FAQ로 해결하였다.

 

또한, 크롤링 시 원치않는 자료가 자꾸 끌어와져 제외시키는데 정말 고생했다.

 

<과제>

Genie 음악 순위사이트 크롤링하기: 순위 / 제목 / 가수명

 


<기억할것들>

 

1. Python 기초 문법

 - 변수 / 자료형 / 함수 / 조건문 / 반복문

 

-변수&기본연산

# 변수&기본연산
a = 1      
b = 2      
print(a+b) # 3

 

-자료형

# 자료형

# 1. 숫자, 문자형

name = 'bob' # 문자열
num = 12 # 숫자
is_number = True # True 또는 False -> "Boolean"

# 2. 리스트형

a_list = []
a_list.append(1)     # a_list = [1]
a_list.append([2,3]) # a_list = [1,[2,3]]

# a_list[0] = 1
# a_list[1] = [2,3]
# a_list[1][0] = 2

# 3. Dictionary형

a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178

# 4. Dictionary형 + List형

people = [{'name':'bob','age':20},{'name':'carry','age':38}]

person = {'name':'john','age':7}
people.append(person)

# people = [{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38}, {'name': 'john', 'age': 7}]

 

-함수

def f(x):
	return 2*x+3
    
def sum_all(a,b,c):
	return a+b+c

def mul(a,b):
	return a*b

 

-조건문

	if num % 2 == 0:
		 return True  
	else:            
		 return False

 

-반복문

fruits = ['사과','배','감','귤']

for fruit in fruits:
	print(fruit)

 

 

 

2. Python 패키지 설치

 - requests: json파일 등 불러오기 가능

 - bs4: BeautifulSoup - 크롤링 패키지 

 - pymongo/dnspython: mongoDB 사용 시 필수

 - certifi: 보안 관련 추가설정

 

 

3. pymongo 기본 코드 및 사용 코드 요약

 - 기본으로 써줘야 하는 코드, 나의 경우 certifi 관련 코드가 더 들어있다.

from pymongo import MongoClient
import certifi

ca = certifi.where()

client = MongoClient('mongodb+srv://test:sparta@cluster0.dbsrmm8.mongodb.net/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta
MongoClient

 

 - 자주쓰는 코드 요약

# 저장 - 예시
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'})

 

 

4. Python 크롤링 

 - 크롤링 코드 작성 전 기본으로 써야하는 코드

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

# 코딩 시작

* 크롬브라우저에서 원하는 자료값을 우클릭 > Inspect

*개발자도구 내에서 원하는 태그를 우클릭 > Copy > Copy Selector

*셀렉터를 복사하여 비교한 뒤 어디까지 가져올 지 생각해본다.

 

- 불러오기 코드

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

 

-크롤링 시 예외처리

# 자료값이 None인 경우 제외
    for movie in movies:
        # movie 안에 a 가 있으면,
        a_tag = movie.select_one('td.title > div > a')
        if a_tag is not None:
            # a의 text를 찍어본다.
            print (a_tag.text)

# strip() 자료값에 공백 제외
	artist = music.select_one('td.info > a.artist.ellipsis').text.strip()

# text[0:2] 앞에서 2글자만 끊기
	rank = music.select_one('td.number').text[0:2].strip()

# 자료값에 span값 제외 - strip()함수를 여러번 썼다
    title = music.select_one('td.info > a.title.ellipsis').text.strip().strip('19금').strip()

 

5. 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://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

# body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
# 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(15) > td.info > a.artist.ellipsis
# body-content > div.newest-list > div > table > tbody > tr:nth-child(15) > td.info > a.title.ellipsis

musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for music in musics:
    rank = music.select_one('td.number').text[0:2].strip()
    title = music.select_one('td.info > a.title.ellipsis').text.strip().strip('19금').strip()
    artist = music.select_one('td.info > a.artist.ellipsis').text.strip()
    # print(rank, title, artist)
    # print(music.select_one('td.info > a'))

    # c = music.select_one('td.point')

    # print(b)
people = [{'name':'bob','age':20},{'name':'carry','age':38}]

person = {'name':'john','age':7}
people.append(person)

print(people)

 

반응형