3週目


Pythonの言語コマンドでコンピュータがサーバの役割を果たす.

[復習]


小鬼手帳API

ロード直後にコードを実行

$(document).ready(function(){
    listing();
});

function listing() {
    console.log('화면 로딩 후 잘 실행되었습니다');
}

Ajaxベーススケルトン

$.ajax({
    type: "GET",
    url: "http://spartacodingclub.shop/post",
    data: {},
    success: function (response) {
      console.log(response)
    }
})

データを個別に出力

let rows = response['articles']
            for (let i = 0; i < rows.length; i++) {
              let comment = rows[i]['comment']
              let desc = rows[i]['desc']
              let image = rows[i]['image']
              let title = rows[i]['title']
              let url = rows[i]['url']

HTMLの作成と貼り付け

let temp_html = `<div class="card">
 		     <img class="card-img-top"
    			  src="${image}"
                  	  alt="Card image cap">
  		     <div class="card-body">
  			  <a href="${url}" class="card-title">${title}</a>
		     	  <p class="card-text">${desc}</p>
   			  <p class="card-text comment">${comment}</p>
                     </div>
                  </div>`
$('#cards-box').append(temp_html)

前のカードを削除

$(document).ready(function () {
    $('#cards-box').empty();
    listing();
});

【Python】


PythonをインストールするとPython翻訳パッケージがインストールされます.

✔変数

a = 3
b = 2
print(a+b)  //5출력
first_name = 'HH'
num = 2
print(first_name+num)  //에러
print(first name+num)/エラー位置
TypeError:str/「int」ではなくstrをstr//エラーに接続できる説明
=>Pythonで文字と数字を付けるとエラーになります.
  • エラーを修正するため、2を文字列にします.
    =>num="2"またはnum=str(2)
  • インベントリ

    a_list = ['사과','배','감']
    
    print(a_list[0]) //사과 출력
    a_list = ['사과','배','감']
    a_list.append('수박')
    
    print(a_list) //['사과','배','감','수박'] 출력

    専制的

    a_dict = {'name':'bob','age':27}
    
    print(a_dict['age'])  //27 출력
    a_dict = {'name':'bob','age':27}
    a_dict['height'] = 178
    
    print(a_dict)  //{'name':'bob','age':27,'height':178} 출력

    ✔関数


    プログラミングでは、関数が指定した変数を受け入れない操作を実行します.
  • JavaScriptはPythonではなく括弧を使用する.
  • def sum(num1,num2):
        return num1+num2
    
    result = sum(2,3)
    
    print(result)  //5 출력

    条件文

    age= 25
    
    if age > 20:
        print('성인입니다')
    else:
        print('청소년입니다')
        
    //성인입니다 출력
    def is_adult(age):  # is_adult라는 age라는 변수를 받는 함수를 만든다.
        if age > 20:
            print('성인입니다')
        else:
            print('청소년입니다')
    
    is_adult(30)
    is_adult(15)
    
    //성인입니다, 청소년입니다 출력

    くりかえし文


    リストの例
    fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
    
    for fruit in fruits:  #fruits를 하나씩 돌면서 그걸 빼가지고 변수(fruit)에 넣고
        print(fruit)      #변수를 내용물에 넣어 출력
        //사과,,,,수박,,딸기,사과,,수박 출력
    fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
    
    count = 0
    for fruit in fruits:
        if fruit == '사과':
            count += 1
    
    print(count) //2 출력
    ディクシャナリーの例
    people = [{'name': 'bob', 'age': 20}, 
              {'name': 'carry', 'age': 38},
              {'name': 'john', 'age': 7},
              {'name': 'smith', 'age': 17},
              {'name': 'ben', 'age': 27}]
              
    print(person)
    people = [{'name': 'bob', 'age': 20}, 
              {'name': 'carry', 'age': 38},
              {'name': 'john', 'age': 7},
              {'name': 'smith', 'age': 17},
              {'name': 'ben', 'age': 27}]
    
    for person in people:
        print(person['name'],person['age'])
        
     //bob 20, carry 28, john 7, smith 17, ben 27 출력
    people = [{'name': 'bob', 'age': 20}, 
              {'name': 'carry', 'age': 38},
              {'name': 'john', 'age': 7},
              {'name': 'smith', 'age': 17},
              {'name': 'ben', 'age': 27}]
    
    for person in people:
        if person['age'] < 20:
            print(person)
            
      //{'name': 'john', 'age': 7}
        {'name': 'smith', 'age': 17} 출력

    ▶Pythonコース


    Pythonはそのライブラリが非常に膨大で有名です.
    パッケージは人によって作成されたライブラリです
    仮想環境(virtualenvironment):リポジトリのフォルダ
    import requests # requests 라이브러리 설치 필요
    
    r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
    rjson = r.json()
    
    print(rjson['RealtimeCityAir']['row'][0]['MSRSTE_NM'])
    
    //중구 출력
    繰り返し文の使用
    import requests # requests 라이브러리 설치 필요
    
    r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
    rjson = r.json()
    
    gus = rjson['RealtimeCityAir']['row']
    
    for gu in gus:
        gu_name = gu['MSRSTE_NM']
        gu_mise = gu['IDEX_MVL']
        print(gu_name,gu_mise)
        
    //중구 52.0, ~~~, 강동구 51.0 출력
    if文の使用
    import requests # requests 라이브러리 설치 필요
    
    r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
    rjson = r.json()
    
    gus = rjson['RealtimeCityAir']['row']
    
    for gu in gus:
        gu_name = gu['MSRSTE_NM']
        gu_mise = gu['IDEX_MVL']
        if (gu_mise > 100) :
            print(gu_name, gu_mise)
            
    //미세먼지가 100을 넘는 곳만 출력

    [Webスクリプト]


    NAVERムービーページ

    デフォルトのスクロール

    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)
    # headers는 코드단에서 요청했을 때 기본적인 요청을 막아두는 사이들이 많다.
    # 그래서 브라우저에서 엔터친 것 마냥 효과를 내주는 것이다.
    
    soup = BeautifulSoup(data.text, 'html.parser')
    # 데이터로 요청 후 BeautifulSoup 형태로 솎아내는 것이다.
    
    # 코딩 시작
    スクロール時に要求し、BeautifulSoup(bs 4)を使用して必要な情報をだまし取る.
  • タグ内でテキストを撮影する場合:タグ.text
  • タグ内属性の場合:タグ[属性]
  • ✔select one(一つ)

    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')
    
    title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
    
    print(title.text)
    //그린 북, 가버나움, ~~~ 등 출력
    
    print(title['href'])
    //  /movie/bi/mi/basic.naver?code=171539 출력
    

    ✔select(複数)

    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')
    
    # #old_content > table > tbody > tr:nth-child(2)
    # #old_content > table > tbody > tr:nth-child(3)
    # =>  겹치는 부분인 #old_content > table > tbody > tr만 가져오기
    
    trs = soup.select('#old_content > table > tbody > tr')
    
    for tr in trs:
        print(tr)
        
    //해당 코드들 출력			
        <tr>
           <td class="ac"><img src="https://ssl.pstatic.net/imgmovie/2007/img/common/bullet_r_r01.gif" alt="01" width="14" height="13"></td>
           <td class="title">
            <div class="tit5">
            <a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
            </div>
           </td>
        <!-- 평점순일 때 평점 추가하기  -->
           <td><div class="point_type_2"><div class="mask" style="width:96.00000381469727%"><img src="https://ssl.pstatic.net/imgmovie/2007/img/common/point_type_2_bg_on.gif" width="79" height="14" alt=""></div></div></td>
           <td class="point">9.60</td>
           <td class="ac"><a href="/movie/point/af/list.naver?st=mcode&amp;sword=171539" class="txt_link">평점주기</a></td>
        <!----------------------------------------->  
           <td class="ac"><img src="https://ssl.pstatic.net/imgmovie/2007/img/common/icon_na_1.gif" alt="na" width="7" height="10" class="arrow"></td>
           <td class="range ac">0</td>
        </tr>
  • tr内でtitleを検索
  • 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')
    
    trs = soup.select('#old_content > table > tbody > tr')
    
    # #old_content > table > tbody > tr:nth-child(2) > td.title > div > a
    # => 중복 제외 나머지 td.title > div > a로 title 가져오기
    for tr in trs:
        a_tag = tr.select_one('td.title > div > a')
        print(a_tag)
    
    //None
    <a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a> 등 출력
    =>出力されたnoneは、次の画像で直線を表します.
    上のコードに印刷(a tag.text)すると、エラーが発生します.
    いいえ.メールを送るな!
    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')
    
    trs = soup.select('#old_content > table > tbody > tr')
    
    for tr in trs:
        a_tag = tr.select_one('td.title > div > a')
        if a_tag is not None:
            print(a_tag)
    
    //none을 제외하고 출력됨
    <a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
    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')
    
    trs = soup.select('#old_content > table > tbody > tr')
    
    for tr in trs:
        a_tag = tr.select_one('td.title > div > a')
        if a_tag is not None:
            title = a_tag.text
            print(title)
    
    //그린 북, 가버나움, ~~~ 등 출력

    ▶Q.スクロール練習

    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')
    
    
    trs = soup.select('#old_content > table > tbody > tr')
    
    for tr in trs:
        a_tag = tr.select_one('td.title > div > a')
        if a_tag is not None:
        # #old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
            rank = tr.select_one('td:nth-child(1) > img')['alt']
            title = a_tag.text
        # #old_content > table > tbody > tr:nth-child(2) > td.point    
            star = tr.select_one('td.point').text
            print(rank,title,star)
    
    //01 그린 북 9.60, 02 가버나움 9.59 등 출력

    [DB]


    MongoDBはデータベースで、パソコンで動いていますが、目には見えません.
    Robo 3 Tでは、MongoDBのデータを表示できます.
    データベースを使用するのは、データをよりよく使用するためです.
    RDBMS(SQL)
    行/列の外観を固定したExcelにデータを格納するのと同じです.
    1万個のデータがロードされている場合、真ん中に突然列を追加しやすくなります.
    固定されているため、データの一貫性や分析が容易です.
    ex)MS-SQL、My-SQL等
    No-SQL
    バイナリ形式のDB
    フリーフォームのデータ・マウントには便利ですが、一貫性が欠けている可能性があります.
    ex) MongoDB

    ▶ pymongo


    pymongoは、MongoDBを操作するためのライブラリです.

    pymongoデフォルトコード

    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)  #내 컴퓨터에 돌아가고 있는 MongoDB에 접속
    db = client.dbsparta  #dbsparta라는 DB 이름으로 접속
    
    # 코딩 시작

    ✔insert(保存)

    doc = {'name':'bobby','age':21}  #딕셔너리 하나를 만듦
    db.users.insert_one(doc)  #딕셔너리를 db 안에 users라는 collection에 insert해라
    Robo 3 Tで確認すると追加されていることがわかります.
    挿入を続行すると、下に追加を続行します.

    ✔find(複数検索)

    same_ages = list(db.users.find({'age':21},{'_id':False}))
    print(same_ages)
    
    //[{'name': 'bobby', 'age': 21}, {'name': 'jane', 'age': 21}] 출력
    
    
    # 리스트 안에 딕셔너리 값이 있는대로 출력이 되었으니 따로따로 출력해보자!
    same_ages = list(db.users. find({'age':21},{'_id':False}))
    
    for person in same_ages:
        print(person)
    
    //{'name': 'bobby', 'age': 21}
    {'name': 'jane', 'age': 21} 출력

    すべてのファイルを無条件に見つける

    same_ages = list(db.users. find({},{'_id':False}))
    
    for person in same_ages:
        print(person)
    
    //{'name': 'bobby', 'age': 21}
    {'name': 'John', 'age': 27}
    {'name': 'smith', 'age': 30}
    {'name': 'jane', 'age': 21} 출력

    ✔find one(一つ検索)

    user = db.users.find_one({'name':'bobby'})  #name이 bobby인 애의 정보만 가지고 와라
    print(user)
    
    //{'_id': ObjectId('610cf38dadc8ef7e5f910951'), 'name': 'bobby', 'age': 21} 출력
    
    
    #id값은 빼고 가져올 때
    user = db.users.find_one({'name':'bobby'},{'_id':False})
    print(user)
    
    //{'name': 'bobby', 'age': 21} 출력
    
    
    #그 중 나이만 출력하고 싶다면!
    user = db.users.find_one({'name':'bobby'},{'_id':False})
    print(user['age'])
    
    //21 출력

    ✔update one(置き換え)

    db.users.update_one({'name':'bobby'},{'$set':{'age':19}})  #name이 bobby인 애를 가져와서 age를 19로 바꿔라
    
    
    #update_many도 있음. 이걸 쓰면 name이 bobby인 애를 모두 찾아서 age를 19로 바꾸게 됨
    하지만, 한번에 다 바꾸는 것이기 때문에 위험해서 잘 사용안함

    ✔delete one(クリア)

    db.users.delete_one({'name':'bobby'})  #name이 bobby인 애를 찾아서 delete해라
    
    
    #delete_many도 있지만 update_many와 같은 이유로 사용안함

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

    [スクロール結果をDBに保存する]

    import requests
    from bs4 import BeautifulSoup
    
    #DB를 사용하기 위해 pymongo 임포트 코드 가져오기
    from pymongo import MongoClient  
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    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')
    
    
    trs = soup.select('#old_content > table > tbody > tr')
    
    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
         # insert하기
            doc = {
                'rank':rank,
                'title':title,
                'star':star
            }
            db.movies.insert_one(doc)

    ▶Quiz Webスクリプトの使用結果


    1)映画祭目録『マトリックス』の採点を獲得
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    movie = db.movies.find_one({'title':'매트릭스'})
    print(movie['star'])
    
    //9.39 출력
    2)『マトリックス』の採点と同じ採点映画タイトルを獲得
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    movie = db.movies.find_one({'title':'매트릭스'})
    movie_star = movie['star']
    
    movie_A = list(db.movies.find({'star':movie_star}))
    
    for movie_name in movie_A:
        print(movie_name['title'])
        
    //인생은 아름다워
      매트릭스
      라이언 일병 구하기
      사운드 오브 뮤직
      헬프
      포레스트 검프
      안녕 베일리
      글래디에이터 출력
    3)『マトリックス』映画を0に採点する
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    db.movies.update_one({'title':'매트릭스'},{'$set':{'star':0}})

    [Q.ジョブ]


    Genieランキング2020年4月3日
    Genie音楽サイトを使用してランキング/曲名/歌手を閲覧
    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=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:
        rank = tr.select_one('td.number').text[0:2].strip()
        title = tr.select_one('td.info > a.title.ellipsis').text.strip()
        singer = tr.select_one('td.info > a.artist.ellipsis').text.strip()
    
        print(rank,title,singer)
    文字列の余白を削除 .strip()
    クリップ文字列関数テキスト[0:2]を使用