자바 스크립트의 동작원리


-자바스크립트는 싱글쓰레드 언어이다. (머리가 하나) 
-한번에 한가지 일 밖에 처리할수 없다. 멀티케스팅이 불가함 (Call stack 콜스텍)
-실행하고있는 함수가 있는경우 다른 일을 할 수가 없고 다른 일들이 블락된다
-브라우저에서 오래걸리는 작업이 실행될경우 웹 페이지 UI는 멈춰버리고 사용자는 아무것도 못하게된다.

 

자바 스크립트 엔진


비동기 콜백
*JS Engine 은 js 코드를 이해하고 실행을 도와줌 대표적인 JS Engine으로 V8엔진 (Chrome, Node.js)이 있으며 이외에도 각 브라우저 별로 여러가지 엔진이 존재함 js 엔진은 크게 
*Memory Heap: 데이터를 임시 저장하는 공간, 함수와 변수, 함수를 싱핼할때 사용하는 값들을 저장함 
*Call Stack: 코드가 실행되면코드 내부의 실행순서를 기록후 하나씩 순차적으로 진행되게 도와줌

 

런타임

js engine 싱글 스레드 기반 언어이기 때문에 다른 작업을 수행하려면 현재 수행중인 작업이 끝날때까지 기다려야하는

문제점이 있음 


능동적으로 일하기
*Callback Function: 함수 실행이 끝나면 다음에 실행할 일을 알려주는 함수
*Browser Web APIs: 브라우저 안에 DOM event, AJAX request, setTimeout 등 비동기 이벤트를 처리함 
(js는 싱글쓰레드의 영향을 받지않고, 독립적으로 이벤트 처리가 가능함)
*Callback Queue: Browser Web API에 있는 event가 실행되고 나면 js에서 실행할 Callback 저장하고있는 저장소
*Event Loop: Call Stack이 비어있는지를 주기적으로 확인해 Callback Queue에서  Callback Fumction을 가져와 
Call Stack에서 js코드가 실행될수록 돕는 역활을 한다.

 


{ js는 기본적으로 단일 스레드에 동기식 언어, 웹 브라우저나 런타임들의 도움을 받아서 비동기 작업들을 처리 할 수 있고, 멀티 스레드인 것처럼 동작할 수 있는 언어이다. }


React 1일차

 

컴포넌트의 필수 props를 지정하거나 props의 타입을 지정할떄는 propTypes를 사용

import { Component } from 'react';
import PropTypes from 'prop-types';

class MyComponent extends Component {
    render(){
    const {name, favoriteNumber, children} = this.props; {/*비구조화 할당*/}
    return (
    <div>안녕하세요, 제 이름은 {name}입니다. <br />
    childern 값은 {children} 입니다. <br />
    제가 좋아하는 숫자는 {favoriteNumber} 입니다.
    </div>
    );
}
}
MyComponent.defaultProps = {
    name: "기본 이름"
};
MyComponent.propTypes = {
    name: PropTypes.string,
    favoriteNumber: PropTypes.number.isRequired
};

export default MyComponent;

 

버튼을 클릭했을때 숫자 카운팅과 Console에서 개수와 메시지 출력시키기

import { Component } from "react";


class Counter extends Component{
    state = {
            number: 0,
            fixedNumber: 0
        };
    /* state의 초기값 설정*/
    render(){
        const {number, fixedNumber} = this.state; 
        /*state를 조회할때는 this.state로 조회*/
        return(
            <div>
                <h1>{number}</h1>
                <h2>바뀌지 않는 값: {fixedNumber}</h2>
                <button
                /*onClick를 통해서 버튼이 클릭되었을때의 호출할 함수를 지정함*/
                onClick={() => {
                /*this.setState를 사용하여 state에 새로운 값을 넣을수있음*/
                    this.setState(
                        {
                            number: number + 1
                        },
                        () => {
                        	/*버튼을 누를때 메시지와 값을 출력함*/
                            console.log('방금 setState가 호출됨');
                            console.log(this.state);
                        }
                    );
                }}>+1 </button>
            </div>
        );
    }
}
export default Counter;

 

useState사용해보기

import { useState } from "react";

const Say = () => {
	/*useState 함수 인자에 상태의 초기값을 넣어줌(값의 형태는 자유)
    함수 호출시 배열이 반환됨 첫 번째 원소는 '현재상태' 두 번째 원소는 상태를 바꾸어주는 함수
    이 함수를 세터(setter)함수라 부름*/
    const [message, setMessage] = useState('');
    const onClickEnter = () => setMessage('안녕하세요!');
    const onClickLeave = () => setMessage('안녕히 가세요!');
	
    /*기본 칼라는 블랙*/
    const [color, setColor] = useState('black');
    return (
        <div>
            <button onClick={onClickEnter}>입장</button>
            <button onClick={onClickLeave}>퇴장</button>
            <h1 style={{color}}>{message}</h1>
            /*각각 버튼 클릭시 setMessage색이 변함 */
            <button style={{color: 'red'}} onClick={()=> setColor('red')}>빨간색</button>
            <button style={{color: 'green'}} onClick={()=> setColor('green')}>초록색</button>
            <button style={{color: 'blue'}} onClick={()=> setColor('blue')}>파란색</button>
        </div>
    );
};

export default Say;

 

 

props, state는 둘다 컴포넌트에서 사용하거나 렌더링 할 데이터를 담고있어서 서로 비슷해 보일 수 있지만 역할은 다름

 

부모 컴포넌트의 state를 자식 컴포넌트의 props로 전달하고, 자식 컴포넌트에서 특정 이벤트가 발생할 때 부모 컴포넌트의 메서드를 호출하면 props도 유동적으로 사용가능하다.

 

새로운 컴포넌트 만들때는 "useState" 사용할 것을 권장!!

*function키워드 대신 () => {} (화살표함수)사용가능

D-Day 날짜에 맞춰서 남은시간 카운터하기!

D-day는 2022년 11월 19일 10시 30분 00초로 설정했다.

 

HTML

<div id="clock"></div>

JS

	var date = new Date("November 19, 2022, 10:30:00").getTime();
     /*D-Day데이터 가져오기 목표(월 일 년도 시간 분 초)
     .getTime = 지정되 날짜의 시간에 해당하는 숫자 값을 반환해줌*/
     
    setInterval(function(){
        //setInterval 주기적으로 업데이트 해줘야하는 경우 사용
        var today = new Date().getTime();
        var gap = date - today; 	//설정한 시간 - 현재시간 계산
        var day = Math.ceil(gap / (1000 * 60 * 60 * 24)); //일 계산
        var hour = Math.ceil((gap % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); //시간 계산
        var min = Math.ceil((gap % (1000 * 60 * 60)) / (1000 * 60)); //분 계산
        var sec = Math.ceil((gap % (1000 * 60))/1000); //초 계산
        //Math.ceil = 항상 반올림하여 주어진 숫자보다 크거나 같은 정수를 반환
        document.getElementById("clock").innerHTML = `${day}일 ${hour}시${min}분${sec}초`;
    },1000);
	//1000은 1초를 뜻함

innerHtml을 사용할땐 getElementById 메서드 같이사용

const clock = document.querySelector("clock")를 사용해서 html에서 id = clock를 가져와서 clock를 만들어 놓으면 const document.getElementById("clock").innerHTML 을 clock.innerHTML = 으로 사용가능하다.

오늘은 전에 하던 입력창에 데이터 입력시 데이터가 자동으로 저장되고 삭제버튼 마무리단계와

날씨 온도 지역 만들기

 

function saveToDos(){
    localStorage.setItem("TODOS_KEY", JSON.stringify(toDos));
    //JSON.stringify() 자바스크립트의 값을JSON문자열로 변환
} //toDos가 여기에 저장

 

*삭제버튼을 눌렀을시에 button의 부모인 li와 같이 삭제되는 코드

HTML

<ul id="todo-list"></ul>

JS

function deleteToDo(event){
    const li = (event.target.parentElement);
    li.remove(); //button의 부모인 li를 삭제
    toDos = toDos.filter(toDo => toDo.id !== parseInt(li.id)); 
    //li > id를 삭제함
    saveToDos();
    
}

li에 id를 부여하고 li가 생성될때마다 새로운id생성

const li = document.createElement("li"); //li만듬
    li.id = newTodo.id;
const span = document.createElement("span");//span만듬
    span.innerText = newTodo.text;
const button = document.createElement("button"); //html에 button만듬

 li.appendChild(span); //span을 li에 집어넣음(자식)
 li.appendChild(button); //button을 li에 집어넣음(자식)

paintToDo({text:"a", id:random}) 이렇게 텍스트와 랜덤한 아이디를  object에 저장시켜주는 코드이다

const savedToDos = localStorage.getItem(TODOS_KEY);

if(savedToDos !== null){
    const parsedToDos = JSON.parse(savedToDos);
    toDos = parsedToDos;
    parsedToDos.forEach(paintToDo);
    //(item) => console.log("this is the turn", item)
    //function을 사용하지않고 간단히 사용가능한 방법
}
//sayHello("h"); 배열추가

 

날씨 표시하기 (날씨, 온도, 지역)

API-KEY를 API홈페이지에서 가져온다

const API_KEY = "19777beab672c364eabbcda6461de192";

 

navigator.geolocation.getCurrentPosition(onGeoOk, onGeoError);
//navigator 네비게이터 (브라우저에 대한 정보를 가지고있는 객체)
//geolocation.getCurrentPosition 장치의 현재위치를 가져옴

위치확인을 거절할시 문구를 표시해준다

function onGeoError(){
    alert("Can't find you. No weather for you.");
}

HTML

<div id="weather"> <!-- 날씨데이터 -->
    <span></span>
    <span></span>
  </div>

JS

날씨데이터는 꼭 세 변수의 값이 있어야한다, API-key, lat, log 세 변수 데이터를 API사이트에서 가져오고

변수 데이터를 적용시켜준다 (${lat}, ${log}, ${API_KEY}) fetch(url)을 사용해 URL을 얻는다

weather 데이터와 city데이터를 받아온후 3가지(날씨, 온도, 위치)를 표시한다.

function onGeoOk(position){
    const lat = position.coords.latitude; //경도
    const log = position.coords.longitude; //위도
    console.log("You live it", lat ,log);
    const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${log}&appid=${API_KEY}&units=metric`; 
    fetch(url)
    .then((response) => response.json())
    .then((data) => {
            const weather = document.querySelector("#weather span:first-child") //첫번째 자식 span 출력
            const city = document.querySelector("#weather span:last-child") //마지막 span 출력
        city.innerText  = data.name;
        weather.innerText = `${data.weather[0].main} /${data.main.temp}` ; //현재 날씨데이터를 텍스트로 변환
    }); 
    //fetch 원격 API호출하기
}

00:00:00 현재시간을 데이터로 받아서 출력시킨 코드

 

HTML

<h2 id="clock">00:00:00</h2>

JS

const clock = document.querySelector("h2#clock");
//html h2에 id clock를 불러와서 저장시킴

function getClock(){
    const date = new Date(); 
    const hours = String(date.getHours()).padStart(2, "0");
    const minutes = String(date.getMinutes()).padStart(2, "0");
    const seconds = String(date.getSeconds()).padStart(2, "0");
    //date.get()을 사용하면 해당되는 데이터를 가져옴
    //padStart(2, "0") 표시되는 숫자가 2가 아닌 1일때 앞에 문자열 0을 붙임
    
    clock.innerText = `${hours}:${minutes}:${seconds}`;
    //시간 분 초 를 화면에 표시
}

getClock(); //코드가 실행되고 화면에 바로 현재값을 표시해줌
setInterval(getClock, 1000); //1초마다 화면에 표시된 시간이 갱신됨

 

배열에 저장해둔 명언을 화면에 랜덤으로 출력시키는 코드

 

HTML

<div id="quote"> <!-- 명언가져오기 -->
    <span></span>
    <span></span>
  </div>

JS

const quotes = [
    {quote:"삶이 있는 한 희망은 있다", author:"키케로"
    },
    {quote:"산다는것 그것은 치열한 전투이다.", author:"-로망로랑"
    },
    {quote:"하루에 3시간을 걸으면 7년 후에 지구를 한바퀴 돌 수 있다.", author:"사무엘존슨"
    },
    {quote:"언제나 현재에 집중할수 있다면 행복할것이다.", author:"파울로 코엘료"
    },
    {quote:" 진정으로 웃으려면 고통을 참아야하며 , 나아가 고통을 즐길 줄 알아야 해", author:"찰리 채플린"
    },
    {quote:"직업에서 행복을 찾아라. 아니면 행복이 무엇인지 절대 모를 것이다.", author:"엘버트 허버드"
    },
    {quote:"신은 용기있는자를 결코 버리지 않는다.", author:"켄러"
    },
    {quote:"피할수 없으면 즐겨라", author:"로버트 엘리엇"
    },
    {quote:"단순하게 살아라. 현대인은 쓸데없는 절차와 일 때문에 얼마나 복잡한 삶을 살아가는가?", author:"이드리스 샤흐"
    },
    {quote:"먼저 자신을 비웃어라. 다른 사람이 당신을 비웃기 전에", author:"엘사 맥스웰"
    },   
];
//quotes에 명언 배열을 작성했다.

const quote = document.querySelector("#quote span:first-child");
//html에 id가 quote이고 자식이 span의 첫번째 자식을 js quote에 저장한다.

const author = document.querySelector("#quote span:last-child");
//html에 id가 quote이고 자식이 span의 마지막 자식을 js author에 저장한다.

const todaysQuote = quotes[Math.floor(Math.random() * quotes.length)];
//quotes배열의 값을 랜덤으로 만들어서 todaysQuote에 저장

quote.innerText = todaysQuote.quote;
author.innerText = todaysQuote.author;
//innerText텍스트를 바꿈, quotes배열 quote값과 author값을 출력함

배열에 저장해놓은 이미지를 화면에 랜덤으로 출력시켜주는 코드

 

HTML

<ul id="todo-list"></ul>

JS

const images = ["IMG_0720.JPG", "IMG_0721.JPG", "IMG_0747.JPG", 
"IMG_0752.JPG", "IMG_0764.JPG", "IMG_0793.JPG", "IMG_0795.JPG"]
//이미지 파일을 images에 저장

const chosenImage = images[Math.floor(Math.random() * images.length)];
//images에 저장된 이미지를 floor 1or2 (1.9여도 1) Math.random을 이용해서 랜덤이미지
*images.length로 배열의 길이조정

const bgImage = document.createElement("img");
//createElement html에 <img>를 생성

bgImage.src = `img/${chosenImage}`;
//HTML <img src="img/이미지이름"> html src 생성 랜덤이미지 넣어주기 

document.body.appendChild(bgImage);

 

html에 일일이 코드를 만들지 않아도 js에서 작성한 코드가 실행될때 html에 코드가 적용되게 만든 코드

 

HTML

<form id="todo-form">
    <input type="text" placeholder="Write a To Do and Press Enter" required/>
    //placeholder 내용 입력가능한 창을 만들고 기본 텍스트를 삽입함
  </form>

JS

const toDoForm = document.getElementById("todo-form");
//변수 toDoForm에 html에 선언한 id todo-form를 적용시킨다.

const toDoInput = toDoForm.querySelector("#todo-form input");
//toDoForm(todo-form)의 값을 바꾸기위해 toDoForm.querySelector 사용
//todo-form 안에있는 Input를 값을 toDoinput에 적용

const toDolist = document.getElementById("todo-list");


function painToDo(newTodo) {
    const li = document.createElement("li"); 	//html에 li만듬
    const span = document.createElement("span");	//span만듬
    li.appendChild(span);	 //span을 li에 집어넣음(자식)
    span.innerText = newTodo; 	//newTodo 텍스트를 span에 넣음
    toDolist.appendChild(li); 	// li를 html에 적용
}

function handleToDoSubmit(event){
    event.preventDefault();
    const newTodo = toDoInput.value;	 //창에 입력후 엔터쳐도 새로고침안되게
    toDoInput.value = "";	 //검색창 비우기
    //console.log(newTodo, toDoInput.value);	 //검색창 비우기전 데이터 저장
    painToDo(newTodo); 	//새로 입력한 값을 표시시켜줌
}

toDoForm.addEventListener("submit", handleToDoSubmit);	 
// addEventListener(이벤트명, 실행할함수)-이벤트가 발생할때 특정함수 호출

 

import React, {useEffect} from 'react'
import {View,Text,StyleSheet,Image, TouchableOpacity, Linking, Button} from 'react-native'
import {StatusBar} from 'expo-status-bar';

export default function AboutPage({navigation,route}){
  useEffect(()=>{
    navigation.setOptions({
      title:"소개 페이지",
        headerStyle: {
            backgroundColor: '#1F266a',
            shadowColor: "#1F266A",},
            headerTintColor: "#fff",})  },[])
  return(

    <View style={styles.container}>
        <StatusBar style="light" />
      <Text style={styles.title}>HI! 스파르타 코딩 앱개발반에 오신것을 환영합니다.</Text>
     
   
      <View style={styles.textContainer}>
        <Image style={styles.aboutImage} source={{uri:aboutImage}} resizeMode={"cover"}/>
       
        <Text style={styles.desc01}>많은 내용을 간결하게 담아내려 노력했습니다!.</Text>
        <Text style={styles.desc02}>꼭 완주 하셔서 꼭 여러분 것으로 만들어 가시길 바랍니다.</Text>
                         
        <TouchableOpacity style={styles.button}>
          <Text style={styles.buttonText}>여러분의 인스타계정</Text>
          {/* 링크 다는 방법을..모르겟습니다..ㅠ */}
 
*검색해서 링크다는법을 찾아서 적용시켜봐도 오류만 계속떴다,
a태그 button태그 등등 여러가지 태그를 사용해봤지만 무리였다!!*
 
        </TouchableOpacity>
      </View>
    </View>)
}

const styles = StyleSheet.create({ /*스타일시트*/
      container:{
        flex:1,     /*flex-start, center, flex-end*/
        /*flex는 영역을 차지하는 속성*/
        backgroundColor:"#1F266A", /*배경색*/
        alignItems:"center" /*항목정렬 중앙*/
      },
      title:{
        fontSize:30,
        fontWeight:"700", /*폰트굵기*/
        color:"#fff",
        paddingLeft:30, /*여백*/
        paddingTop:100, /*여백*/
        paddingRight:30}, /*여백*/
        /*margin-> border-> padding-> content 여백 순서*/

      textContainer:{
        width:300,
        height:500,
        backgroundColor:"#fff",
        marginTop:50,
        borderRadius:30,
        justifyContent:"center",/*가로축 중심*/
        alignItems:"center"},/*세로축 중심*/

      aboutImage:{
        width:150,
        height:150,
        borderRadius:30}, //테두리를 둥글게만듬

      desc01:{
        textAlign:"center",
        fontSize:20,
        fontWeight:"700",
        paddingLeft:22,
        paddingRight:22},

      desc02:{
        textAlign:"center",
        fontSize:15,
        fontWeight:"700",
        padding:22},

      button:{
        backgroundColor:"orange",
        /*배경색 주황색, 직접적으로 색코드를 입력해도 되지만 색자체를
        입력함으로써 표준색 가능 */
        padding:20,
        borderRadius:15},

      buttonText:{
        color:"#fff",
        fontSize:15,
        fontWeight:"700"}
      })

 

 

 

 

꿀팁 페이지 만들기 

import React,{useState, useEffect} from 'react';
import {ScrollView, Text, StyleSheet} from 'react-native';
import LikeCard from '../components/LikeCard';
import Card from '../components/Card';

export default function LikePage({navigation,route}){
   
    const [tip, setTip] = useState([{
            "idx":3,
            "category":"재테크",
            "title":"잠자는 내 돈을 찾아라",
            "desc":"‘새는 돈’에는 미처 몰랐던 카드 포인트, 휴면예금이나 환급금도 포함됩니다. 확실히 파악하지 못한 잠자는 돈을 찾아보고 자투리 돈들을 모으는 것도 중요합니다. 케이블방송, 위성방송 서비스를 이용하면서 중복 납부한 요금, 셋톱박스 보증금 등 돌려받지 않은 돈이 있는지 확인 해보세요. 또, 카드 포인트 통합 조회 서비스를 이용해 여러 개의 카드 포인트가 모두 얼마인지 체크해두는 것이 좋습니다. 보험해약 환급금, 휴면 보험금이나 휴면 예금을 찾아보고 돌려받는 일도 요즘에는 어렵지 않습니다.",
            "date":"2020.09.09"
        },
        {
            "idx":4,
            "category":"재테크",
            "title":"할인행사, 한정할인판매 문구의 함정 탈출!",
            "desc":"‘안 사면 100% 할인’이라는 말 들어보셨나요? 견물생심, 좋은 물건을 보면 사고 싶기 마련입니다. 특히 대대적인 ‘할인 행사’ 중인 대형 마트에 갔을 때는 말할 것도 없겠죠. 따라서 생필품을 살 때, 한꺼번에 사서 사용하는 것보다 필요할 때 조금씩 구매하는 편이 좋습니다. 장을 보면서 대형마트에 자주 가다 보면 지금 필요한 것뿐 아니라 앞으로 필요할 것까지 사게 되어 지출이 커지기 때문입니다. 특히 할인 품목을 보면 뜻하지 않은 소비를 하는 경우도 많아진다. 홈쇼핑, 대형마트 등의 ‘할인행사’, ‘한정할인판매’ 등의 문구를 조심하세요. ",
            "date":"2020.09.09"
    }])

    useEffect(()=>{
        navigation.setOptions({
            title:'꿀팁 찜'
        })
    })

    return (
        <ScrollView style={styles.container}>
           {
               tip.map((content,i)=>{
                   return(<LikeCard key={i} content={content} navigation={navigation}/>)
               })
           }
        </ScrollView>
    )
}

const styles = StyleSheet.create({
    container:{
        backgroundColor:"#fff"
    }
})

 

 

import React from 'react'
import {View,Text,StyleSheet,Image, TouchableOpacity} from 'react-native'

export default function AboutPage(){
  return(
    <View style={styles.container}> //컨테이너 블럭
      <Text style={styles.title}>HI! 스파르타 코딩 앱개발반에 오신것을 환영합니다.</Text> /*타이틀 제목*/
      /*외부상자*/

      <View style={styles.textContainer}> //텍스트 컨테이너
        <Image style={styles.aboutImage} source={{uri:aboutImage}}resizeMode={"cover"}/>
        /*위에 const aboutImage에서 이미지불러옴*/
        <Text style={styles.desc01}>많은 내용을 간결하게 담아내려 노력했습니다!.</Text>
        <Text style={styles.desc02}>꼭 완주 하셔서 꼭 여러분 것으로 만들어 가시길 바랍니다.</Text>
        <TouchableOpacity style={styles.button}> //리엑트 네이티브 버튼기능
          <Text style={styles.buttonText}>여러분의 인스타계정</Text>
        </TouchableOpacity>
        /*내부상자*/
      </View>
    </View>)
}

const styles= StyleSheet.create({ /*스타일시트*/
      container:{
        flex:1,     /*flex-start, center, flex-end*/
        /*flex는 영역을 차지하는 속성*/
        backgroundColor:"#1F266A", /*배경색*/
        alignItems:"center" /*항목정렬 중앙*/
      },
      title:{
        fontSize:30,
        fontWeight:"700", /*폰트굵기*/
        color:"#fff",
        paddingLeft:30, /*여백*/
        paddingTop:100, /*여백*/
        paddingRight:30}, /*여백*/
        /*margin-> border-> padding-> content 여백 순서*/

      textContainer:{
        width:300,
        height:500,
        backgroundColor:"#fff",
        marginTop:50,
        borderRadius:30,
        justifyContent:"center",/*가로축 중심*/
        alignItems:"center"},/*세로축 중심*/

      aboutImage:{
        width:150,
        height:150,
        borderRadius:30}, //테두리를 둥글게만듬

      desc01:{
        textAlign:"center",
        fontSize:20,
        fontWeight:"700",
        paddingLeft:22,
        paddingRight:22},

      desc02:{
        textAlign:"center",
        fontSize:15,
        fontWeight:"700",
        padding:22},

      button:{
        backgroundColor:"orange",
        /*배경색 주황색, 직접적으로 색코드를 입력해도 되지만 색자체를
        입력함으로써 표준색 가능 */
        padding:20,
        borderRadius:15},

      buttonText:{
        color:"#fff",
        fontSize:15,
        fontWeight:"700"}
      })

숙제로 앱 메인화면을 만들어야 했는데 정말 막막했다 배운걸 되돌아보며 하나하나 해봤을때도 에러가 계속 떴고

결국 나는 답안을 보며 하나하나 이해하는것 부터 시작하자고 생각해서 코드 하나하나 검색과 수업영상을 보며 

다시 공부했다 코드를 보면 조금은 이해할수있는 정도 까지 된거같다!

아직 링크다는법은 모르겠지만 현재 진행형으로 공부중이다

[데이터분석]

☆select_one은 가장 첫 번째 요소 하나를 가져온다

select 조건안에 해당하는 모든 태그를 가져와서 리스트에 담겨준다

음원차트에서 제목, 가수, 순위를 1~50위까지 리스트작성하기

 

import requsests 

import pandas as pd

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('주소 복사', headers=headers)

 

[HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색용이한 상태로 만듬]

soup = BeautifulSoup(data.text, 'html.parser')

 

[select를 이용해 rt 불러오기]

T = soup.select('# body_content > table > tbody > tr')

 

[rt의 반복문 돌리기]

for T in t

 (이름) 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)

 

[어려웠던점]

처음 숙제를 받았을때 막막했고 어떻게 해야할지 몰라서 숙제해설 영상을 보면서 하나하나 차근차근 배워갔다.

해설영상에서는 기본틀을 만들어놓고 복사 붙여넣기를 통해서 코드를 불러와서 작성했을때 생각보다 쉽다는걸 깨닳았다

가장 오래걸렸던 부분은 마지막에  print 부분이 줄을 안맞추고 맨 왼쪽에 붙여놔서 마지막 출력인 50위밖에 출력이 되지않아서 해결법을 찾아 하나하나 코드를 만져보다가 for 문과 같은 열에 있으면 안된다는걸 깨닳고 수정해서 해결했다.

+ Recent posts