ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 스크래핑과 MongoDB
    Python 2020. 11. 1. 01:22
    반응형

    웹 스크래핑(Web Scraping)

    1. 파이썬에서 웹 스크래핑은 주로 'Beautiful Soup'를 이용해서 이루어진다.

     

    2. 웹 스크래핑을 할 때는 크롬 개발자도구로 html 구조를 파악해야 한다.

     

    3. Beautiful Soup 패키지를 설치할 때는 beautifulsoup4 패키지를 설치해야 한다.

    그냥 beautifulsoup 패키지는 옛날 버전이므로 최신 버전과 호환이 되지 않기 때문.

     

    4. 기본 구조는 다음과 같다.

    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.nhn?sel=pnt&date=20200303', headers = headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')

    헤더를 설정해준 후, 타겟 URL의 데이터를 requests 라이브러리로 받아온다.

    그리고 해당 URL의 html 데이터를 text로 파싱해서 soup 변수에 담아줬다.

     

    5. Beautiful Soup의 기본 메서드는 select()select_one()이 있다.

    select()는 선택자에 해당하는 요소를 전부 리스트에 담아서 return하고

    select_one()은 선택자에 해당하는 첫 번째 요소를 return한다.

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

     

    몽고디비(MongoDB)

    NoSQL

    NoSQL은 딕셔너리 형태로 데이터를 저장해두는 데이터베이스이다. 데이터 하나하나마다 같은 필드값을 가질 필요가 없어서 자유로운 형태의 데이터를 적재하는 데에 유리한 대신, 데이터들끼리의 일관성이 다소 부족할 수 있다는 단점이 있다.

     

    1. MongoDB는 하나의 딕셔너리를 의미하는 Document가 모여서 Collection을 이루고, 그 Collection들이 모여서 Database를 이룬다. 이전에 사용했던 Firebase의 Firestore 또한 동일한 형식을 가지는 NoSQL이었다.

     

    2. 윈도우에 MongoDB 설치

    • C 드라이브에 data/db 디렉토리를 만든다.
    • MongoDB Community Server를 설치한다. 이 때, OS는 Windows x64 / Package는 MSI를 선택.
    • Setup Type은 Custom으로 해서 C:\data\db\ 로 경로를 설정해준다.
    • 제어판 > 시스템 환경변수 설정에서 Path 변수에 C:\data\db\bin을 추가시켜준다.
    • 명령 프롬프트 창에다가 다음과 같이 입력 후, localhost:27017로 접속했을 때 'It looks like you are trying to access MongoDB over HTTP on the native driver port.' 문구가 뜨면 올바르게 설치가 된 것.

     

    mongod --install --serviceName MongoDB --serviceDisplayName MongoDB --dbpath C:\\data\\db --logpath C:\\data\\db\\log\\mongoservice.log --logappend

     

    3. MongoDB에 있어서, 오라클 SQL Developer와 같은 역할을 하는 GUI 프로그램들이 많이 있는데, 이들을 설치하면 CLI보다 훨씬 편하게 작업을 할 수가 있다. MongoDB에서 공식적으로 밀고 있는 MongoDB Compass도 좋지만, Robo 3T를 사용하였다. Robo 3T 역시 홈페이지에서 설치해주면 된다.

     

    4. 파이썬에서 MongoDB를 조작하기 위해서는 pymongo 패키지를 설치해야한다.

     

    5. 기본 세팅, 데이터 조작 코드

    # DB 연결 세팅
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbnameanything
    
    # 데이터 삽입 하기(insert)
    # (dbnameanything 데이터베이스의 people collection에 데이터 insert)
    db.people.insert_one({ 'name' : 'david', 'age' : 20 })
    db.people.insert_one({ 'name' : 'chris', 'age' : 18 })
    db.people.insert_one({ 'name' : 'charles', 'age' : 19 })
    
    # 데이터 모두 보기(find)
    all_people = list(db.people.find({}))
    print(all_people)
    
    # 특정 조건의 데이터 모두 보기
    some_people = list(db.people.find({ 'age' : 20 }))
    print(some_people[0]) # 첫번째 결과값 보기
    print(some_people[0]['name']) # 첫번째 결과값의 'name' 보기
    
    for person in people: # 반복문으로 모든 결과값 출력하기
        print(person)
    # 특정 결과 값 하나만 뽑아 보기
    david_info = db.people.find_one({ 'name' : 'david' })
    print(david_info)
    
    # 결과값에서 특정 키 값 제외하고 보기(_id 값을 제외)
    david_info = db.people.find_one({ 'name' : 'david' }, { '_id' : False })
    print(david_info)
    
    # 여러 항목 수정하기(update)
    db.people.update_many('찾을 조건', { '$set' : '어떻게 바꿀지' })
    
    # 하나의 항목 수정하기
    db.people.update_one({ 'name' : 'david' }, { '$set' : { 'age' : 30 }})
    
    # 하나의 항목 변경하기
    db.people.replace_one({ 'name' : 'chris' }, { 'name' : 'sarah', 'age' : 25 })
    
    # 데이터 삭제하기
    db.people.delete_one({ 'name' : 'charles' })

    6. update는 RDBMS의 'update' 연산과 동일하게, 데이터를 갱신하는 연산이다.

    존재하는 데이터 항목의 값을 변경하는 연산인데, 값이 존재하지 않으면 추가하는 'upsert'라는 옵션이 존재한다.

     

    7. update와 replace의 차이는, replace는 무조건 한 번에 하나만 replace 할 수 있다는 것.

    또한, update는 데이터를 '갱신'하고, replace는 데이터 자체를 완전히 '변경'하기 때문에,

    (update는 document의 특정 field만 바꾸지만, replace는 document 자체를 완전히 바꿔버림)

    replace를 할 때는 '$set'으로 감싸줄 필요가 없다. 

    # 기존의 데이터
    {
       "_id" : ObjectId("0123456789abcdef01234567"),
       "test_key3" : 3333
    }
    
    db.example.replace_one({ "_id" : ObjectId("0123456789abcdef01234567") }, { "test_key4" : 4 })
    
    # replace_one의 결과
    {
       "_id" : ObjectId("0123456789abcdef01234567"),
       "test_key4" : 4.0
    }
    
    db.example.update_one({ "_id" : ObjectId("0123456789abcdef01234567") }, { $set: { "test_key4" : 4 }})
    
    # update_one의 결과
    {
       "_id" : ObjectId("0123456789abcdef01234567"),
       "test_key3" : 3333.0,
       "test_key4" : 4.0
    }

    그렇다고 합니다.

     

     

    참고

     

    What's the difference between replaceOne() and updateOne() in MongoDB?

    MongoDB bulk operations have two options: Bulk.find.updateOne() Adds a single document update operation to a bulk operations list. The operation can either replace an existing document or update

    stackoverflow.com

     

    [MongoDB] db.collection.update() 정리 | 내가 다시 보려고 만든 블로그

    db.collection.updateOne(filter, update, options)db.collection.updateMany(filter, update, options)db.collection.replaceOne(filter, replacement, options)Syntax...

    jhleeeme.github.io

     

    반응형

    'Python' 카테고리의 다른 글

    리스트의 중복 요소 카운트  (0) 2020.10.31
    파이썬 시작하기  (0) 2020.10.31

    댓글

Designed by Tistory.