[Week 3] Python 크롤링 mongoDB

Resta·2022년 1월 25일
0

WIL

목록 보기
3/3
  1. Python, Pymongo, Robo3T 설치
  2. Python 기초 문법
  3. 웹스크래핑(크롤링)

Python 기초 문법

  • 변수&기본연산
a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

# 변수의 이름은 마음대로 지을 수 있음!
# 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?
  • 자료형
    - 숫자, 문자형
    - 리스트형(Javascript의 벼열형과 동일)

    a_list = []
    a_list.append(1)     # 리스트에 값을 넣는다
    a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다
    a_list의 값은? [1,[2,3]]
    a_list[0]의 값은? 1
    a_list[1]의 값은? [2,3]
    a_list[1][0]의 값은? 2

    - dictionary 형 (Javascript의 dictionary형과 동일)

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

    - Dictionary 형과 List형의 조합

    people = [{'name':'bob','age':20},{'name':'carry','age':38}]
    people[0]['name']의 값은? 'bob'
    people[1]['name']의 값은? 'carry'
    + person = {'name':'john','age':7}
    people.append(person)
    people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
    people[2]['name']의 값은? 'john'
  • 함수

    def sum_all(a,b,c):
    return a+b+c
    def mul(a,b):
    return a*b
    result = sum_all(1,2,3) + mul(10,10)
  • 조건문
    -if / else로 구성

def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
	 return True   # True (참)을 반환한다.
else:            # 아니면,
	 return False  # False (거짓)을 반환한다.
def is_adult(age):
if age > 20:
	print('성인입니다')    # 조건이 참이면 성인입니다를 출력
else:
	print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력

Python 패키지 설치

= 외부 라이브러리 설치
패키지 : 모듈을 모아놓은 단위
라이브러리 : 패키지의 묶음

  • 가상 환경(virtual environment) 'venv' - 프로젝트별 패키지들을 담음
  • 패키지 설치는 pycharm - settings - project interpeter

기본적으로 설치하는 패키지

  • requests
  • bs4

웹스크래핑(크롤링) 기초

import - 타겟 url을 읽어서 HTML을 받아오고, (requests)

html을 검색하기 용이한 상태로 만듦 (BeautifulSoup)

select / select_one 을 통해 원하는 정보 가져오기

beautifulsoup 내 select에 미리 정의된 다른 방법

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

크롬 개발자도구 활용
개발자도구 - 원하는 부분 Copy - Copy selector

DB

mongoDB는 눈으로 보이지 않음 = 그래픽인터페이스(GUI)를 제공하지 않음
-->DB 내부를 살펴보기 위한 프로그램을 별도로 설치해줌 = Robo3T

RDBMS(SQL)
: 행/열의 생김새, 정형화되어 있음
ex)MS-SQL,My-SQL 등

No-SQL
: 딕셔너리 형태, 자유로운 형태로 데이터 적재에 유리
ex)MongoDB

  • pymongo로 DB 조작
    - pymongo 패키지 설치
    - DB연결, 데이터 넣기 / 결과 값 보기 / 수정하기 / 삭제하기

    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)

    • insert

      db = client.dbsparta
      db.users.insert_one({'name':'bobby','age':21})

    • find

      all_users = list(db.users.find({})) <---데이터 모두 보기--->
      same_ages = list(db.users.find({'age':21},{'_id':False})) <--- 특정 조건 데이터 보기 --->

    • find_one

      user = db.users.find_one({'name':'bobby'}) <---특정 결과값--->

    • update_one ({앞 : 찾을 조건} / {뒤 : $바꿀 내용})

      db.users.update_one({'name':'bobby'},{'$set':{'age':19}}

    • delete_one

      db.users.delete_one({'name':'bobby'})

pymongo 코드 요약

  • 저장 - 예시
    doc = {'name':'bobby','age':21}
    db.users.insert_one(doc)

  • 한 개 찾기 - 예시
    user = db.users.find_one({'name':'bobby'})

  • 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
    same_ages = list(db.users.find({'age':21},{'_id':False}))

  • 바꾸기 - 예시
    db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

  • 지우기 - 예시
    db.users.delete_one({'name':'bobby'})


후기

예전 회사에서 데이터를 가공하는 과정에서, 불가피하다고 생각했던 수공업이 불가피하지 않았다는 걸.. 어떻게든 방법이 있었을 거라는 생각이 들었다.
아직 공부해야할 부분이 많지만 더 알아가면서 내가 일을 할 수 있는 바운더리를 넓혀간다고 생각해야지..
점점 스스로에게 느슨해진다. 긴장감을 유지하자 =.=

이대로나가지말까

profile
개발 입문자, 전직하고 싶은 사람

0개의 댓글