ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 개발일지 Week 3 / Python 웹스크래핑, MongoDB
    예대 출신의 코딩 도전기 2021. 8. 10. 23:48

    예대출신의 코딩 도전기 3주차

    공부하며 정리한 내용입니다. 틀린 사항이 있으면 덧글로 알려주시면 감사하겠습니다.

    1) 파이썬 기초 문법

    파이썬에서 indent(들여쓰기)는 가독성을 위함이 아닌 ***문법적 필수 사항**이다.

     

     

    2)파이썬 패키지 설치하기

    패키지, 라이브러리란?

    모듈 < 패키지 < 라이브러리. 일종의 기능들 묶음을 모듈이라하며, 모듈의 모음을 패키지 →이런 패키지의 묶음을 라이브러리라고 부름.

    외부 라이브러리 사용을 위해 패키지를 설치한다.

    virtual environment (가상환경)

    파이썬 사용자와 응용 프로그램이, 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않으면서, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는, 협력적으로 격리된 실행 환경.

    (출처:파이썬 공식 용어집)

     

    #파이참에서 파이썬 패키지 설치하는 법

     

    1. 파이참 상단 File> New Projects Settings> Preferences.. 클릭

    2. Python Interpreter를 찾아 '+'버튼 혹은 Cmd+N을 눌러 패키지 검색 후 설치

     

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

    requests + beautifulsoup4 패키지를 사용한 웹스크래핑

    웹스크래핑은 기본적으로 다음 두가지 단계를 거쳐 진행한다고 보면 된다.

    1. HTTP 요청을 하는 것 (requests)
    2. 받아온 정보(HTML 등)를 솎아내는 것 (bs4)

    크롤링을 위한 기초 세팅 (코드 스니펫)

    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 Safari/537.36'}
    data = requests.get('필요한 url')
    
    # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
    # soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
    # 이제 코딩을 통해 필요한 부분을 추출하면 된다.
    soup = BeautifulSoup(data.text, 'html.parser')
    
    #############################
    # (입맛에 맞게 코딩)
    #############################

     

    bs4 기초

    select / select_one 메소드
    • select : 결과가 list형식으로 나온다.
    • select_one : 하나만 갖고 오고 싶은 경우
    # 선택자를 사용하는 방법 (copy selector)
    soup.select('태그명')
    soup.select('.클래스명')
    soup.select('#아이디명')
    
    soup.select('상위태그명 > 하위태그명 > 하위태그명')
    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
    
    # 태그와 속성값으로 찾는 방법
    soup.select('태그명[속성="값"]')
    
    # 한 개만 가져오고 싶은 경우
    soup.select_one('위와 동일')

    #HTML의 내가 원하는 정보를 가진 부분을 확인하기 위해 크롬 개발자 도구를 활용할 수 있다.

    1. (크롬에서) 원하는 정보가 있는 부분 우클릭-> 검사
    2. 원하는 태그에서 우클릭 -> Copy -> Copy Selector로 선택자 복사 가능
    select와 select_one의 사용법 더 찾아보기.
    http://hleecaster.com/python-web-crawling-with-beautifulsoup/ 
    이곳의 글이 잘 정리되어있어 도움이 되었다.

     

    4) DB 개념

    DB는 왜 쓰는 것인가?

    데이터를 쌓아두기 위해(X), 데이터를 잘 찾아 쓰기 위해(O)

     

    DB종류

    1) RDBMS (SQL)  e.g.) MS-SQL, My-SQL 등

    행/열의 생김새가 정해진 엑셀과 유사한 데이터 저장 방식. 하지만 중간에 열을 하나 더하는 식의 수정이 어려움. 정형화되어 있는 데이터의 형태만큼 데이터의 일관성이 우수, 분석에 용이하다.

     

    2) NoSQL (Not Only SQL)  e.g.) MongoDB

    딕셔너리 형태로 데이터를 저장해두는 DB. 고로 데이터 마다 같은 값을 가질 필요가 없다. 자유로운 형태의 데이터 적재가 유리하지만 일관성이 부족할 수 있다.

     

    MongoDB설치 및 확인

    • Terminal에서 Homebrew를 이용해 설치한다. 
    • 설치코드는 다음과 같다.
    # 다음 코드를 '한줄씩' 차례대로 입력한다
    brew tap mongodb/brew
    
    brew install mongodb-community
    
    #mongoDB 실행하기
    brew services start mongodb-community

    설치한 mongoDB가 잘 돌아가는지 확인하는 법 : 

    크롬 창에 localhost:27017을 입력해서 다음 화면이 나오면 mongoDB 작동 중인 것.

     

    MongoDB와 Robo3T
    • MongoDB는 데이터베이스이다. 하지만 GUI(Graphic User Interface)가 없어서 보이지 않음.
    • Robo3T는 DB내부를 살펴볼 수 있게 만들어주는 프로그램

     

    pymongo로 DB조작하기

    mongoDB 조작을 위한 라이브러리 pymongo를 사용해 서버의 DB를 제어한다.

     

    • pymongo 임포트 및 시작
      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
      client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
      db = client.myFirstDB                      # 'myFirstDB'라는 이름의 db를 만듭니다.
    • 기초 사용법 - Insert/ Find/ Update/ Delete
      member = {'name':'bobby', 'age':22}
       
      # insert 사용법
      db.users.insert_one(member) #user라는 컬렉션에 {'name':'bobby', 'age':22} 넣는다
      db.users.insert_one({'name':'kevin','age':22}) 
      
      # find 사용법 (with 조건)
      same_ages = list(db.users.find({'age':21},{'_id':False})) #id는 출력하지 않기 위해 False값을 준다
      print(same_ages)#나이 21의 DB만 출력
      
      #조건 없이
      # MongoDB에서 데이터 모두 보기
      all_users = list(db.users.find({})) # 혹은
      all_users = list(db.users.find({},{'_id':False})
      
      print(all_users[0]['name']) #첫번 째 결과값의 name만 보기
      
      #반목문 돌며 모든 결과값 보기
      for user in all_users :   
      		print(user)
      
      # update 사용법
      db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
      # update_many 도 존재한다. 잘 안 씀 (위험도)
      db.users.update_many({'name':'bobby'},{'$set':{'age':19}})
      
      # delete 사용법
      db.users.delete_one({'name':'bobby'})
      # delete_many도 존재하지만 잘 안 쓴다.

     


     

    3주차 개발일지를 마무리하며...

    사실 정리해둔지 꽤 되었지만 업로드를 제때 맞추지 못하고 노션에만 남겨두었다. 늦어버렸지만 better late than never의 마음으로 밀린 주차는 금주에 다 올려볼 것이다.

     

    requests 패키지를 보면서 든 생각은 아직 내가 'HTTP 요청'에 대한 정의 등, 기본 지식이 부족하다는 점이다. 글너 부분을 보완해나가면 이해에 더 도움이 될 것 같다.

    댓글

Designed by Tistory.