사전 스터디(웹개발 종합반 3주차)

[수업 목표]
1. 파이썬 기초 문법을 안다.
2. 원하는 페이지를 크롤링 할 수 있다.
3. pymongo를 통해 mongoDB를 제어할 수 있다.

 


✍️새로 학습한 내용


1. 파이썬 패키시 설치 및 사용(pycharm)

  • 용어정리
👉 함수 : 특정 작업을 수행하는 독립된 기능을 수행하는 단위
👉 메소드 : 클래스,구조체,열거형 등에 포함되어 있는 함수를 메소드라 지칭한다.
👉 모듈 : 함수,변수,클래스를 모아놓은 것, 일반적으로 .py 파일 하나를 말한다.
👉 패키지 : 특정 기능과 관련된 여러 모듈을 한 폴더 안에 넣어 관리
👉 라이브러리 : 여러 패키지와 모듈들을 모아놓은 것
👉 가상환경 : 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해,  파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경, 프로젝트별 별도의 환경.
👉 pip(python install package) :  Python용 패키지 설치 프로그램 (출처 : pip documentation)

 
⭐ 라이브러리 >= 패키지 >= 모듈

 

  • 파이참에서 패키지 설치하기

requests 라이브러리 - Ajax처럼 다른 서버와 통신할 때 사용.

 

  • requests 라이브러리 사용
import requests # requests 라이브러리 설치 필요 / 라이브러리 사용할 것을 선언

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json() 
rtext = r.text   
print('rjson 결과 : ' , rjson)
print('json 타입 : ', type(rjson))
print('rtext 결과 : ' + rtext)
print('rtext 타입 : ', type(r.text))


2. 웹스크래핑(크롤링)

bs4(beautifulsoup4) 패키지를 사용 
import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
👉 태그 안의 텍스트를 찍고 싶을 땐 → 태그.
👉 text 태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

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

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

 

  • 크롬 개발자도구 활용하여 선택자 얻기
  1. 원하는 부분에서 마우스 오른쪽 클릭 
  2. 원하는 태그에서 마우스 오른쪽 클릭
  3. Copy → Copy selector로 선택자를 복사할 수 있음

 

  • 예제코드
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')
# https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829 

#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img : rank
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a : title
#old_content > table > tbody > tr:nth-child(2) > td.point : star

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:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        print(rank,title,star)

3. mongoDB (NoSQL)

 

pymongo, dnspython 패키지 사용

 

  • pymongo로 mongoDB 조작
from pymongo import MongoClient

client = MongoClient('연결정보')
db = client.db명 # 기존에 없는 db일 경우 데이터를 추가하면 자동으로 만들어진다.
기능 사용 예시
추가 db.컬렉션명.insert_one(데이터) : 단일 doc = { 'name': 'park', 'age':20}
db.users.insert_one(doc(권장) 또는 { 'name': 'park'})
db.컬렉션명.insert_many(데이터) : 다중 doc = [{'name':'park'},{'name':'lee'}]
db.users.insert_many(doc 또는 직접)
조회 db.컬렉션명.find_one({조건}) : 단일
* 조건에 맞는 데이터 여러 개 시 가장 처음 하나
user = db.users.find_one({'name':'park'})
list(db.컬렉션명.find({조건},{'_id':False})) : 다중
{'_id':False} : 가져온 데이터 _id 요소 제외
all_user = list(db.users.find({}))
all_user = list(db.users.find({'name':'park'}))
수정 db.컬렉션명.update_one({조건},{'$set':{변경할 사항}}) db.users.update_one({'name':'park'},{'$set':{'age':27}})
삭제

db.컬렉션명.delete_one({조건}) : 단일
* 조건에 맞는 데이터 여러 개 시 가장 처음 하나
db.users.delete_one({'age':10})
db.컬렉션명.delete_many({조건}) : 다중
* 조건에 맞는 데이터 모두 삭제
db.users.delete_many({'age':10})

 

모든 데이터 조회 시 list()로 변환해주는 부분에 대해서 변환하지 않고 그대로 조회 시 타입이 궁금해서 테스트해봤다.
all_user = db.users.find({},{'_id':False})
all_user_list = list(db.users.find({},{'_id':False}))
print('[list변환 x]')
print(all_user)
print(type(all_user))
#print(len(all_user))
for user in all_user:
    print(user)

print('\n[list변환 o]')
print(all_user_list)
print(type(all_user_list))
#print(len(all_user_list))
for user in all_user_list:
    print(user)

list형으로 변환과 하지 않았을 때 결과 출력비교
다중 조회 시 list형으로 변환하지 않고 크기를 구하려할 시 결과
다중 조회 시 list형 변형 후 크기를 구하려할 시 결과

  • 결과
    1.반복문을 돌면서 수행하는데는 문제가 없었다.
    2.변환하지 않았을 시 타입은 class형태였다.
    3.변환하지 않고 len()함수를 사용하니 에러가 발생했다. 반면, list로 변환 시 크기를 구할 수 있었다.

💻과제


 

  • 지니뮤직 1~50위 곡을 스크래핑하여 순위 / 곡 제목 / 가수를 출력
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')

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.replace('19금','').strip()

    singer = music.select_one('td.info > a.artist.ellipsis').text.strip()
    print(rank,title,singer)

🖊 회고


3주차에서는 서버쪽 개발을 위해 파이썬 언어를 배우고 익히고 활용하기 위해서 웹 크롤링과 데이터를 저장하고 검색하기 위해  현재 트렌드인 클라우드 환경(mongoDB Atlas)에서 mongoDB를 구축하고 연결하여 사용해봤다.

 

개인적으로 mysql, oracledb와 같은 RDBMS(SQL) 관계형 데이터데이스는 사용해봤으나, NoSQL에 대표인 MongoDB는 사용해 본 적이 없었기도하고 실제로 한번쯤 배워보고 싶다는 생각도 늘 갖고있었기에 너무나 재밌고 유익한 강의였다. 이것저것 궁금증을 갖고 찾아보기도 하고 실제로 테스트도 해보면서 조금이라도 더 알아보려고 했고 성장에 많은 도움이 되었다.

 

크롤링의 경우 이전에 실제로 사용할 일이 있어서 해본 적이 있었기에 크게 부담은 없었지만, 다시한번 배우면서 잊어버린 부분들과 활용하는 방법에 대해서도 실습을 통해서 해보면서 도움이 되었다.

 

패키지를 설치하는 부분에 대해서도 전에는 anaconda prompt에서 직접 가상환경을 만들기도 하고 pip install 해서 추가하기도 했는데 파이참에서 쉽게 클릭 몇 번으로 할 수 있었다는게 편리하기도 했고, 가상환경이나 pip에 대해서도 한번 더 찾아보면서 아! 이런거였구나하면서 알아가는 재미도 쏠쏠했다. 

 

파이썬 언어에 대해서는 대학교 시절 수업시간에 배우기도 했고, 졸작으로 딥러닝을 했다보니 크게 어려움은 없었으나, 파이썬을 사용해 본 지가 꽤 지났다보니 많은 부분들을 잊어버리고 있었는데, 이번 강의로 다시한번 리마인드하는 기회가 되었다.

 

전체적으로 다시한번 리마인드하고 조금 더 능동적으로 찾아보고 공부해보는 시간이 되었고, 실제로 궁금증을 갖고 찾아보고 그러지는 않는 편인데, 이번에 이것저것 궁금한 것들도 생기고 찾아보기도 하면서 나름 유익하고 재밌었던 기회였다.