ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개발일지] 웹개발 종합반 3주
    Study/Development 2022. 7. 24. 00:49

    <스파르타코딩 웹개발종합반 수강일지>

    웹개발 종합반 3주차 수강

     

    수업내용: Python / DB(mongoDB)

     

    1. Python 기본 문법: 변수 / 자료형 / 함수 / 조건문 / 반복문

    2. Python 웹 크롤링

    3. DB: mongoDB 연결하여 data 올리기

     

    Python을 처음 배웠는데, 생각보다 훨씬 간단한 문법에 놀랐고, 크롤링 원리를 알게되어 재밌었다.

    여러 패키지를 다운받아야 하는데, 그 패키지를 잘 기억해두어야겠다.

     

    DB 연결이 잘 안되어 해멨으나, 도움을 받아 FAQ로 해결하였다.

     

    또한, 크롤링 시 원치않는 자료가 자꾸 끌어와져 제외시키는데 정말 고생했다.

     

    <과제>

    Genie 음악 순위사이트 크롤링하기: 순위 / 제목 / 가수명

     


    <기억할것들>

     

    1. Python 기초 문법

     - 변수 / 자료형 / 함수 / 조건문 / 반복문

     

    -변수&기본연산

    # 변수&기본연산
    a = 1      
    b = 2      
    print(a+b) # 3

     

    -자료형

    # 자료형
    
    # 1. 숫자, 문자형
    
    name = 'bob' # 문자열
    num = 12 # 숫자
    is_number = True # True 또는 False -> "Boolean"
    
    # 2. 리스트형
    
    a_list = []
    a_list.append(1)     # a_list = [1]
    a_list.append([2,3]) # a_list = [1,[2,3]]
    
    # a_list[0] = 1
    # a_list[1] = [2,3]
    # a_list[1][0] = 2
    
    # 3. Dictionary형
    
    a_dict = {}
    a_dict = {'name':'bob','age':21}
    a_dict['height'] = 178
    
    # 4. Dictionary형 + List형
    
    people = [{'name':'bob','age':20},{'name':'carry','age':38}]
    
    person = {'name':'john','age':7}
    people.append(person)
    
    # people = [{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38}, {'name': 'john', 'age': 7}]

     

    -함수

    def f(x):
    	return 2*x+3
        
    def sum_all(a,b,c):
    	return a+b+c
    
    def mul(a,b):
    	return a*b

     

    -조건문

    	if num % 2 == 0:
    		 return True  
    	else:            
    		 return False

     

    -반복문

    fruits = ['사과','배','감','귤']
    
    for fruit in fruits:
    	print(fruit)

     

     

     

    2. Python 패키지 설치

     - requests: json파일 등 불러오기 가능

     - bs4: BeautifulSoup - 크롤링 패키지 

     - pymongo/dnspython: mongoDB 사용 시 필수

     - certifi: 보안 관련 추가설정

     

     

    3. pymongo 기본 코드 및 사용 코드 요약

     - 기본으로 써줘야 하는 코드, 나의 경우 certifi 관련 코드가 더 들어있다.

    from pymongo import MongoClient
    import certifi
    
    ca = certifi.where()
    
    client = MongoClient('mongodb+srv://test:sparta@cluster0.dbsrmm8.mongodb.net/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca)
    db = client.dbsparta
    MongoClient

     

     - 자주쓰는 코드 요약

    # 저장 - 예시
    doc = {'name':'bobby','age':21}
    db.users.insert_one(doc)
    
    # 한 개 찾기 - 예시
    user = db.users.find_one({'name':'bobby'})
    
    # 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
    all_users = list(db.users.find({},{'_id':False}))
    
    # 바꾸기 - 예시
    db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
    
    # 지우기 - 예시
    db.users.delete_one({'name':'bobby'})

     

     

    4. Python 크롤링 

     - 크롤링 코드 작성 전 기본으로 써야하는 코드

    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')
    
    # 코딩 시작

    * 크롬브라우저에서 원하는 자료값을 우클릭 > Inspect

    *개발자도구 내에서 원하는 태그를 우클릭 > Copy > Copy Selector

    *셀렉터를 복사하여 비교한 뒤 어디까지 가져올 지 생각해본다.

     

    - 불러오기 코드

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

     

    -크롤링 시 예외처리

    # 자료값이 None인 경우 제외
        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)
    
    # strip() 자료값에 공백 제외
    	artist = music.select_one('td.info > a.artist.ellipsis').text.strip()
    
    # text[0:2] 앞에서 2글자만 끊기
    	rank = music.select_one('td.number').text[0:2].strip()
    
    # 자료값에 span값 제외 - strip()함수를 여러번 썼다
        title = music.select_one('td.info > a.title.ellipsis').text.strip().strip('19금').strip()

     

    5. 3주차 숙제

    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')
    
    # body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
    # body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
    # body-content > div.newest-list > div > table > tbody > tr:nth-child(15) > td.info > a.artist.ellipsis
    # body-content > div.newest-list > div > table > tbody > tr:nth-child(15) > td.info > a.title.ellipsis
    
    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.strip().strip('19금').strip()
        artist = music.select_one('td.info > a.artist.ellipsis').text.strip()
        # print(rank, title, artist)
        # print(music.select_one('td.info > a'))
    
        # c = music.select_one('td.point')
    
        # print(b)
    people = [{'name':'bob','age':20},{'name':'carry','age':38}]
    
    person = {'name':'john','age':7}
    people.append(person)
    
    print(people)

     

    반응형

    댓글

© 2023. titann all rights reserved