[개발일지] 웹개발 종합반 3주
<스파르타코딩 웹개발종합반 수강일지>
웹개발 종합반 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)