ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <3주차> 웹 스크래핑 후, mongoDB를 이용하여 데이터베이스에 저장하기
    2021. 8. 23. 11:26

    강의를 듣기에 앞서, 

    mongoDB, ROBO3T, Python를 설치해 주었다.


     

    웹 스크래핑

    : beautifulSoup 라이브러리를 이용하여 사이트의 정보들을 스크래핑 해보자.

    아래는 기본 코드이다.

    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')

    태그 안의 텍스트를 찍고 싶을 땐 → 태그.text

    태그 안의 속성을 찍고 싶을 땐 → 태그['속성']

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

    **태그를 참고하는 방법**

    1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사

    2. 원하는 태그에서 마우스 오른쪽 클릭

    3. Copy → Copy selector로 선택자를 복사할 수 있다.

     

    #old_content > table > tbody > tr:nth-child(2) > td.title > div > a 는 영화의 제목들을 나타내는 경로 태그를 나타냄

    #select는 리스트로 들어감
    trs = soup.select('#old_content > table > tbody > tr')
    
    # movies (tr들) 의 반복문을 돌리기
    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)


    순위, 영화제목, 별점을 따로 띄워보자

    trs = soup.select('#old_content > table > tbody > tr')
    
    #old_content > table > tbody > tr:nth-child(2) >
    #old_content > table > tbody > tr:nth-child(2) > td.point
    #old_content > table > tbody > tr:nth-child(2) > td.title > div > a
    #old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
    
    for tr in trs:
    
        a_tag = tr.select_one(' td.title > div > a')
    
    
        if a_tag is not None:
            rank = tr.select_one('td:nth-child(1) > img')['alt']
            title = a_tag.text
            star = tr.select_one('td.point').text
            print(rank,title,star)


    이제 스크래핑한 데이터들을 데이터베이스에 저장해보자!

    설치해둔 mongoDB에 저장할 수 있다.

    mongoDB는 이전에 사용해왔던 MySQL등의 관계형 데이터베이스와 다르게 

    NO-SQL 형태로 테이블의 형식이 정해져있지 않다.

    예를들어, 관계형 데이터베이스의 경우 테이블을 정의하고 애트리뷰트를 정의하면 그 형식에 맞게 데이터를 삽입해야한다. 따라서 나중에 추가하고 싶은 애트리뷰트가 있으면 이전에 저장되어 있던 값들의 애트리뷰트 데이터값들은 NULL처리가 될 것이다. 데이터의 일관성/ 분석에 용이하다.

    NO-SQL은 이와 다르게 딕셔너리 형태로 지정된 형식없이 자유롭게 데이터를 저장할 수 있다. 

    이때 mongoDB의 데이터 내부를 살펴 볼수 있는 도구로 ROBO3T를 이용한다.

     

    아래는 mongoDB를 이용하는데 앞선 기본 코드이다.

    from pymongo import MongoClient # pymongo를 임포트 하기
    client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
    db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다.


    #insert / find / update / delete 4종류의 제어방법이 있다.

    insert

    # MongoDB에 insert 하기
    # 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
    db.users.insert_one({'name':'bobby','age':21})
    db.users.insert_one({'name':'kay','age':27})
    db.users.insert_one({'name':'john','age':30})
    
    혹은
    doc = {'name':'jane','age':12}
    db.users.insert_one(doc)

    find

     same_ages = list(db.users.find({'age':21},{'_id':False}))# 특정조건
     all_ages = list(db.users.find({},{'_id':False})) #다가져오는 방법
    
     for person in all_ages:
         print(person)
    
    #특정 결과값을 뽑기
     user = db.users.find_one({'name':'bobby'})
     print(user)

    update

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

    delete

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

    정리

    # 저장 - 예시
    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'})

    지니뮤직 크롤링 하기

    strip()은 파이썬 내장함수로, 공백을 없애준다.

    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 Saf
    data = requests.get('https://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)
    soup = BeautifulSoup(data.text, 'html.parser')
    trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    for tr in trs:
    	title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    	rank = tr.select_one('td.number').text[0:2].strip()
    	artist = tr.select_one('td.info > a.artist.ellipsis').text
    	print(rank, title, artist)

    '' 카테고리의 다른 글

    <4주차> Flask 를 이용한 서버 구축  (0) 2021.08.28
    <2주차> JQuery & Ajax  (0) 2021.08.21
    <1주차> CSS 기초 -2  (0) 2021.07.27
    <1주차> CSS 기초 -1  (0) 2021.07.27
    <1주차>HTML 기초  (0) 2021.07.27
Designed by Tistory.