172만명의 커뮤니티!! 함께 토론해봐요.
해결됨
프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
좋은 강의 너무 잘 듣고 있습니다. 번외지만 배포에대해 궁금한점이 있습니다. 지금 강의 예제로 사용하는 프로젝트와 같이 서버와 클라이언트 코드가 같이 있는 경우에는 어떻게 배포해야하는지 궁금합니다. 개발할때는 npm run serve 와 같이 수동으로 서버를 켜서 작동시킬 수 있지만 그렇지 않을때는 어떻게 작동시킬 수 있나요? 실제로는 서버용 레포, 클라용 레포 따로 개발해서 배포해야하는 건가요?
jjang9
2022-04-06T17:05:51.613Z
댓글 1
좋아요 1
조회수 251
미해결
[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
안녕하세요. 먼저 기본적인 질문 드리는 것 같아서 죄송합니다.. 6:39에서 40x50x512 와 1x1x9이 연산핸서 어떻게 40x50x9가 나오는건가요? 채널이 어떻게 줄었는지 이해가 안갑니다.. 미리 감사드립니다.
머신러닝 배워볼래요? 컴퓨터-비전 딥러닝 tensorflow keras python
HAHA
2022-04-06T15:13:40.534Z
댓글 1
좋아요 0
조회수 289
미해결
파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 파일입출력 영상 코드대로 썼는데 계속 오류가 떠요 다른 질문에 답변하신거 보니까 버전이 달라서 그렇다고 하셨는데 제거는 최신버전이거든요... 3.몇이상 인데 만약에 버전이 다른거면 뭐라고 입력해야 하나요
유지원
2022-04-06T13:19:54.872Z
댓글 1
좋아요 0
조회수 222
해결됨
프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
강사님 강의자료는 어디서 받을 수 있나요?? 아무리 찾아봐도 없어서 질문드립니다.
jjang9
2022-04-06T11:12:24.482Z
댓글 2
좋아요 1
조회수 216
해결됨
[리뉴얼] React로 NodeBird SNS 만들기
안녕하세요. 제로초님의 강의에 큰 도움을 받고 있음에 감사의 말씀을 드립니다. 여러 검색결과도, 질문답변도, 해당강의 반복재생으로 찾아보았으나 해결치 못한 부분이 있어 이렇게 직접 질문을 하게 됐네요! [ 마주한 문제점 & 상황 ] 은 다음과 같습니다. 1. ( 이전 상황) 로그인폼(Id, Pwd)에 텍스트를 입력해 "로그인" 버튼을 누르면 정상적으로 로그인이 됐고, Redux 역시 정상작동해 개발자도구에서 확인이 가능했습니다. 2. ( 현재 상황) 섹션3(Redux) "더미데이터와 포스트폼 만들기" 강의를 들으며 문제에 마주했습니다. 3. ( 더미데이터와 포스트폼 만들기 강의 후 ) 잘 넘어가던 로그인 화면에서 데이터는 넘어가 콘솔에 찍히지만, 화면 페이지는 게시판으로 넘어가지 않는 상황에 직면했습니다. [ 콘솔에 찍히는 Error ] 는 다음과 같습니다. [정상적으로 넘어가는 로그인 데이터] -> 그러나 로그인이 되지 않고 화면이 넘어가질 않습니다! [ 소스코드 ] 1. package.json { " name " : " react-nodebird-front " , " version " : " 1.0.0 " , " description " : "" , " main " : " index.js " , " scripts " : { " dev " : " next -p 3060 " , " build " : " next build " }, " author " : "jj " , " license " : " ISC " , " dependencies " : { " @ant-design/icons " : " ^4.7.0 " , " antd " : " ^4.19.0 " , " next " : " ^9.5.5 " , " next-redux-wrapper " : " ^6.0.2 " , " prop-types " : " ^15.8.1 " , " react " : " ^16.14.0 " , " react-dom " : " ^16.14.0 " , " react-redux " : " ^7.2.8 " , " redux " : " ^4.1.2 " , " redux-devtools-extension " : " ^2.13.9 " , " styled-components " : " ^5.3.3 " }, " devDependencies " : { " eslint " : " ^8.10.0 " , " eslint-plugin-hooks " : " ^0.4.2 " , " eslint-plugin-import " : " ^2.25.4 " , " eslint-plugin-react " : " ^7.29.3 " } } 2. LoginForm.js 파일 import React , { useState , useCallback , useMemo } from ' react '; import { Form , Input , Button } from ' antd '; import Link from ' next/link '; import styled from ' styled-components '; import { useDispatch , useSelector } from ' react-redux '; import useInput from " ../hooks/useInput "; import { loginAction } from ' ../reducers/user '; const ButtonWrapper = styled . div ` margin-top: 10px; ` ; const FormWrapper = styled (Form) ` padding: 10px; ` ; const LoginForm = ({ setIsLoggedIn }) => { const dispatch = useDispatch () ; const [ id , onChangeId ] = useInput ( '' ) ; const [ password , onChangePassword ] = useInput ( '' ) ; const onSubmitForm = useCallback ( () => { console . log ( id , password ) ; dispatch ( loginAction ( { id , password } )) ; }, [ id , password ]) ; return ( < FormWrapper onFinish ={ onSubmitForm } > < div > < label htmlFor = " user-id " > 아이디 </ label > < br /> < Input name = " user-id " value ={ id } onChange ={ onChangeId } required /> </ div > < div > < label htmlFor = " user-password " > 비밀번호 </ label > < br /> < Input name = " user-password " type = " password " value ={ password } onChange ={ onChangePassword } required /> </ div > < ButtonWrapper > < Button type = " primary " htmlType = " submit " loading ={ false } > 로그인 </ Button > < Link href = " /signup " >< a >< Button > 회원가입 </ Button ></ a ></ Link > </ ButtonWrapper > </ FormWrapper > ) ; } export default LoginForm ; 3. index.js import React from ' react '; import { useSelector } from " react-redux "; import AppLayout from " ../components/AppLayout "; import PostForm from ' ../components/PostForm '; import PostCard from ' ../components/PostCard '; const Home = () => { const { isLoggedIn } = useSelector ( ( state ) => state . user ) ; const { mainPosts } = useSelector ( ( state ) => state . post ) ; return ( < AppLayout > { isLoggedIn && < PostForm /> } { mainPosts . map ( ( post ) => < PostCard key ={ post . id } post ={ post } /> ) } </ AppLayout > ) ; } export default Home ; 4. configureStore.js import { createWrapper } from ' next-redux-wrapper '; import { applyMiddleware , compose , createStore } from ' redux '; import { composeWithDevTools } from ' redux-devtools-extension '; import reducer from ' ../reducers '; const configureStore = () => { const middlewares = [] ; const enhancer = process . env . NODE_ENV === ' production ' ? compose ( applyMiddleware ( ... middlewares )) : composeWithDevTools ( applyMiddleware ( ... middlewares )) ; const store = createStore ( reducer , enhancer ) ; return store ; }; const wrapper = createWrapper ( configureStore , { debug : process . env . NODE_ENV === ' development ' , } ) ; export default wrapper ; 5. post.js // [ initialState ] export const initialState = { mainPosts : [ { id : 1 , User : { id : 1 , nickname : ' jj ' , }, content : ' 첫 번째 게시글 #해시태그 #익스프레스 ' , Images : [ { src : ' https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAxNjExMjFfMjM2%2FMDAxNDc5NjY5MjEyOTEz.13R8uiaA0T8rJnLPJICAib4oVtrAzA424jbDMC9a3ckg.m0QoHt-5MdR0MH501npcL8aJof3Eu1h_9Zp0ceNm8e4g.PNG.guri4you%2F%25BB%25F6%25B1%25F2_%25BD%25C9%25B8%25AE%25C5%25D7%25BD%25BA%25C6%25AE1.png&type=sc960_832 ' , }, { src : ' https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAxNjExMjFfMjM2%2FMDAxNDc5NjY5MjEyOTEz.13R8uiaA0T8rJnLPJICAib4oVtrAzA424jbDMC9a3ckg.m0QoHt-5MdR0MH501npcL8aJof3Eu1h_9Zp0ceNm8e4g.PNG.guri4you%2F%25BB%25F6%25B1%25F2_%25BD%25C9%25B8%25AE%25C5%25D7%25BD%25BA%25C6%25AE1.png&type=sc960_832 ' , }, { src : ' https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAxNjExMjFfMjM2%2FMDAxNDc5NjY5MjEyOTEz.13R8uiaA0T8rJnLPJICAib4oVtrAzA424jbDMC9a3ckg.m0QoHt-5MdR0MH501npcL8aJof3Eu1h_9Zp0ceNm8e4g.PNG.guri4you%2F%25BB%25F6%25B1%25F2_%25BD%25C9%25B8%25AE%25C5%25D7%25BD%25BA%25C6%25AE1.png&type=sc960_832 ' , } ] , Comments : [ { User : { nickname : ' jj4 ' , }, content : ' redux를 학습 중입니다. ' , }, { User : { nickname : ' jj3 ' , }, content : ' 다음은 sage를 학습 예정임. ' , } ] } ] , imagePaths : [] , postAdded : false , } const ADD_POST = ' ADD_POST ' ; export const addPost = { type : ADD_POST , } const dummyPost = { id : 2 , content : ' 더미데이터입니다. ' , User : { id : 1 , nickname : ' jj1 ' , }, Images : [] , Comments : [] , }; const reducer = ( state = initialState , action ) => { switch ( action . type ) { case ADD_POST : return { ... state , mainPosts : [ dummyPost , ... state . mainPosts ] , postAdded : true , }; default : return state ; } }; export default reducer ; 6. PostForm.js import React , { useCallback , useState , useRef } from ' react '; import { Form , Input , Button } from ' antd '; import { useSelector , useDispatch } from ' react-redux '; import { addPost } from ' ../reducers/post '; const PostForm = () => { const { imagePaths } = useSelector ( ( state ) => state . post ) ; const dispatch = useDispatch () ; const imageInput = useRef () ; const [ text , setText ] = useState ( '' ) ; const onChangeText = useCallback ( ( e ) => { setText ( e . target . value ) ; }, []) ; const onSubmit = useCallback ( () => { dispatch ( addPost ) ; setText ( '' ) ; }, []) ; const onClickImageUpload = useCallback ( () => { imageInput . current . click () ; }, [ imageInput . current ]) ; return ( < Form style ={{ margin : ' 10px 0 20px ' }} encType = " multipart/form-data " onFinish ={ onSubmit } > < Input.TextArea value ={ text } onChange ={ onChangeText } maxLength ={ 140 } placeholder = " 어떤 신기한 일이 있었나요? " /> < div > < input type = " file " multiple hidden ref ={ imageInput } /> < Button onClick ={ onClickImageUpload } > 이미지 업로드 </ Button > < Button type = " primary " style ={{ float : ' right ' }} htmlFor = " submit " > 짹짹 </ Button > </ div > < div > { imagePaths . map ( ( v ) => ( < div key ={ v } style ={{ display : ' inline-block ' }} > < img src ={ v } style ={{ width : ' 200px ' }} alt ={ v } /> < div > < Button > 제거 </ Button > </ div > </ div > )) } </ div > </ Form > ) }; export default PostForm ; 7. PostCard.js import React from ' react '; const PostCard = () => { return ( < div > PostCard </ div > ) ; }; export default PostCard ; 8. user.js import { HYDRATE } from ' next-redux-wrapper '; // initialState 부분 const initialState = { user : { isLoggedIn : false , user : null, signUpData : {}, loginData : {}, }, post : { mainPosts : [] , } }; // [로그인] action creator export const loginAction = ( data ) => { return { type : ' LOG_IN ' , data , } }; // [로그아웃] action creator export const logoutAction = ( data ) => { return { type : ' LOG_OUT ' , } }; // reducer const rootReducer = ( state = initialState , action ) => { switch ( action . type ) { case HYDRATE : console . log ( ' HYDRATE ' , action ) ; return { ... state , ... action . payload }; case ' LOG_IN ' : return { ... state , user : { ... state . user , isLoggedIn : true , user : action . data , }, }; case ' LOG_OUT ' : return { ... state , user : { ... state . user , isLoggedIn : false , user : null, }, }; default : return state ; } }; export default rootReducer ; 다소 많은 양의 글 내용이지만, 시간이 허락되실 때 답변 주시면, 참 감사할 것 같습니다! 오늘 하루도 고생많으셨고, 이번 한 주도 파이팅입니다! 늘 양질의 강의 감사합니다 ^^
react redux nodejs express Next.js
2022-04-06T08:12:23.176Z
댓글 1
좋아요 0
조회수 567
미해결
파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요? 1.이전에는 됐는데, 왜 다시할때는 안되는건지 모르겠네요 ㅠㅠ 11분경에 보내시는 메일이 발송이 되지 않습니다. 다음과 같이 1이 출력되면 메일이 발송성공한 것으로 알고 있는데, 기다려 보아도 메일이 오지를 않네요 강의 후반부에 회원가입과 동시에 메일을 보내는 부분도 메일이 발송되지가 않습니다 ㅠㅠ 2. 14분경에 views.py에서 signup함수 내부에 form.save()를 signed_user = form.save()로 바꿔주시는데, form.save()라는 함수가 값들을 실질적으로 db에 저장하는 것으로 알고 잇습니다. 그러면 signed_user = form.save()로 받아주는 부분은 해당 데이터를 db에 저장하는 동시에 저장된 그 유저 인스턴스(데이터 한행)를 변수에 담는 것인가요? 좋은 강의 감사합니다
김영빈
2022-04-06T07:35:37.907Z
댓글 3
좋아요 0
조회수 536
미해결
비전공자를 위한 진짜 입문 올인원 개발 부트캠프
버전이 달라서 그런지 인터페이스도 다르고 메뉴도 다른 것 같아요 AVD Manager도 보이지 않고요 ㅠ 어떻게 해야 할지 모르겠습니다
tensorflow javascript HTML/CSS react nodejs express 머신러닝 배워볼래요? react-native
LeeGunWoo
2022-04-06T06:40:24.006Z
댓글 2
좋아요 0
조회수 248
해결됨
한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
add 후에 List페이지로 이동하면, 흰화면으로 에러가 출력됩니다. Home.js 의 프로퍼티에 대해 undefind 가 출력됩니다. [Uncaught TypeError: Cannot read properties of undefined (reading 'length') at Home.js:15:1] [ diaryList.length >= 1 ] : 에러 발생하는 부분 useEffect (() => { if ( diaryList . length >= 1 ) { //에러발생부분 const firstDay = new Date ( curDate . getFullYear (), curDate . getMonth (), 1 ). getTime (); const lastDay = new Date ( curDate . getFullYear (), curDate . getMonth () + 1 , 0 ). getTime (); setData ( diaryList . filter (( it ) => firstDay <= it . date && it . date <= lastDay ) ); } }, [ diaryList , curDate ]);
Home.js property javascript nodejs undefind react length
gwi01304
2022-04-06T00:51:06.426Z
댓글 2
좋아요 0
조회수 417
해결됨
풀스택 리액트 토이프로젝트 - REST, GraphQL (for FE개발자)
안녕하세요 선생님! 질문 드릴게 있습니다. 처음부터 setState에서 로직을 처리하는게 아닌 아래와 같이 onUpdate 함수에서 msgs를 splice를 하여 updateMsg에 할당해주고 setMsgs((msgs) => [updateMsg, ...msgs]) 수정된 updateMsg를 바꾸어주고 기존의 존재했던 state값을 스프레드 연산자로 코드를 작성하였습니다! 해당 리스트가 삭제되긴 하지만 msgItem이 계속 쌓이고 있는 부분이 있습니다. 어떤 부분이 문제인지 알고싶습니다!
bj2525
2022-04-05T14:59:42.106Z
댓글 2
좋아요 0
조회수 229
미해결
비전공자를 위한 진짜 입문 올인원 개발 부트캠프
<질문1> Products.js에서 sequelize.define로 테이블 정의시 복수형태로 Products된다고 들었는데 models.Product.create도 Product 단수 형태로 테이블 이름에서 s를 빼주는건가요??? <질문2> result를 log찍어 봤을떄는 또 Product라고 나오고 위에는 Products 테이블로 insert into 됐다고 나오는데 테이블을 만들어주는건 models/products.js 에서하는건데 model.Product.create 이말은 사실 테이블 생성이아니라 데이터 삽입이라고 보면 될까요? models . Product . create ( { name , description , price , seller , } )
express react javascript react-native HTML/CSS tensorflow 머신러닝 배워볼래요? nodejs
2022-04-04T17:11:43.721Z
댓글 1
좋아요 1
조회수 317
해결됨
비전공자를 위한 진짜 입문 올인원 개발 부트캠프
React로 웹 개발하기 - 2 수강후 에러 메시지 문의입니다. npm start 하여 로컬호스트 화면에 아래의 메시지가 나오는데 해결이 안됩니다. 어디에 문제가 있는건지 문의드립니다. × TypeError: Cannot read properties of undefined (reading 'map') MainPage C:/Users/hanthene/Documents/github/grab-market-web/src/main/index.js:33 30 | < img src = "images/banners/banner1.png" / > 31 | < / div > 32 | < h1 > 판매되는 상품들 < / h1 > > 33 | < div id = "product-list" > | ^ 34 | {products . map( function (product , index) { 35 | return ( 36 | < div className = "product-card" > View compiled ▶ 18 stack frames were collapsed. (anonymous function) C:/Users/hanthene/Documents/github/grab-market-web/src/main/index.js:15 12 | . then( function (result){ 13 | console . log(result) ; 14 | const products = result . data . products ; > 15 | setProducts(products) ; | ^ 16 | }) 17 | . catch ( function (error){ 18 | console . error( '에러 발생 : ' , error) ; View compiled This screen is visible only in development. It will not appear if the app crashes in production. Open your browser’s developer console to further inspect this error. 에러가 나는 상태의 파일 그대로 GITHUB에 퍼블릭으로 올려놓았습니다. https://github.com/ucoder-git/grab-market-client 아래는 package.json 입니다. { "name" : "grab-market-web" , "version" : "0.1.0" , "private" : true , "dependencies" : { "@testing-library/jest-dom" : "^5.16.3" , "@testing-library/react" : "^12.1.4" , "@testing-library/user-event" : "^13.5.0" , "axios" : "^0.26.1" , "react" : "^17.0.2" , "react-dom" : "^17.0.2" , "react-scripts" : "^2.1.3" , "web-vitals" : "^2.1.4" }, 아래는 src폴더의 index.js 파일입니다. import React from 'react' ; import './index.css' ; import axios from "axios" ; function MainPage () { const [ products , setProducts ]= React . useState ([]); React . useEffect ( function () { axios . get ( "https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js" ) . then ( function ( result ){ console . log ( result ); const products = result . data . products ; setProducts ( products ); }) . catch ( function ( error ){ console . error ( '에러 발생 : ' , error ); }); }, []); return ( < div > < div id = "header" > < div id = "header-area" > < img src = "images/icons/logo.png" /> </ div > </ div > < div id = "body" > < div id = "banner" > < img src = "images/banners/banner1.png" /> </ div > < h1 > 판매되는 상품들 </ h1 > < div id = "product-list" > { products . map ( function ( product , index ) { return ( < div className = "product-card" > < div > < img className = "product-img" src = { product . imageUrl } /> </ div > < div className = "product-contents" > < span className = "product-name" > { product . name } </ span > < span className = "product-price" > { product . price } 원 </ span > < div className = "product-seller" > < img className = "product-avatar" src = "images/icons/avatar.png" /> < span > { product . seller } </ span > </ div > </ div > </ div > ); }) } </ div > </ div > < div id = "footer" ></ div > </ div > ); } export default MainPage ;
jsx react react-native react express tensorflow nodejs 머신러닝 배워볼래요? javascript HTML/CSS
o2cornholdings
2022-04-04T05:17:08.280Z
댓글 1
좋아요 0
조회수 530
해결됨
풀스택 리액트 토이프로젝트 - REST, GraphQL (for FE개발자)
강의를 듣다가.. 제 수준에 당황에서 글을 남깁니다.. 혹시 이번강의(routes의 정의)가 이해가 되지 않는다면 어느파트를 집중해서 공부해야하는지 여쭤보고 싶습니다. 처음에는 막연하게 리액트, 타입스크립트를 공부하고 서버쪽 기초를 배우고 싶어, 그래프 큐엘과 아폴로등을 공부하기 위해 강의를 신청햇는데 기본적인 개념조차 안잡혀있는 제자신을 확인 할 수 있는 기회가 되었습니다 ㅠㅠ.. 수업과 관련이 없는 내용이지만 노드js를 공부한 후 듣는 편이 좋을까요 .. 아니면 어디를 공부하여야 할까요.. 답변 기다리겠습니다.
ezdar
2022-04-03T16:38:17.066Z
댓글 2
좋아요 0
조회수 276
해결됨
한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
강의 15분 대에 객체 프로퍼티 속성을 delete하면 결국 삭제가 된 상태이고, 브라우저에서는 더이상 콘솔 로그를 찍어도 알 수가 없습니다. 그러나 왜 여전히 메모리가 삭제 되지 않았는지 그 의미가 이해되지 않아 질문을 드립니다.
JINSUNG LEE
2022-04-01T15:22:17.077Z
댓글 1
좋아요 0
조회수 245
해결됨
한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
안녕하세요 강의 듣는 중 궁금한점이 생겨서 질문을 드리게 됩니다. 영상 24:32 부분에서 const copyList = JSON.parse(JSON.stringify(diaryList)); 으로 하셧는데 원본 배열을 정렬을 하게되어 불변성 문제 때문에 Json.stringify 로 문자열로 바꿧다가 다시 JSON.parse로 새로운 배열을 만들어 값을 받았는데 혹시 그럼 스프레드 연산자인 const copyList = [...diaryList] 이렇게 하게 된다면 위 코드와 다르게 동작이 될까요..?
정준영
2022-04-01T08:29:59.248Z
댓글 1
좋아요 1
조회수 336
해결됨
풀스택 리액트 토이프로젝트 - REST, GraphQL (for FE개발자)
안녕하세요! 선생님! params와 query에 대해서 질문이 있습니다. delete 해줄때 client단에서는 params안에 id를 담아서 보내주고 server단에서는 query로 id를 받아야한다고 말씀하셨는데 params로 보내고 params로 받는건 안되는건가요???
bj2525
2022-03-31T17:02:02.923Z
댓글 1
좋아요 0
조회수 203
미해결
[리뉴얼] React로 NodeBird SNS 만들기
10:00분에서 useEffect(() => { if (!(me && me.id) { Router.push('/'); } }, [me &&.id]); if (!me) { return null; }; 이 코드를 if (!me) { Router.push('/'); return null; }; 이렇게 코드 바꿔도 오류는 없던데 밑에 껄로해도 별 차이 없는건가요?
react express redux nodejs Next.js
dsfsdf
2022-03-31T10:59:39.154Z
댓글 1
좋아요 4
조회수 229
미해결
작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
run-edit configurations 왼쪽 상단+ 눌러서 python 체크- 스크립트 패스 프래그매틱 -venv-scripts 파라미터 runserver 한다음 매니지파이 우클릭 디버깅(무당벌레) 누르면 원래 python manage.py runserver 한것처럼 127:0:0:1:8000 이런거 터미널 창에 안뜨는데. 사이트는 들어가지긴 해요 여기서 빈칸에 test 입력한다음 post 누르면 3:34초 처럼 디버그 창에 아무것도 안뜨네요 ㅠㅠ 그리고 디버깅 실행 눌르면 무담벌레 점 잠깐 찍혔다가 사라지네요
coding corgi
2022-03-31T09:06:45.297Z
댓글 0
좋아요 0
조회수 304
미해결
제가 작성한 코드는 아닙니다 크롤링 하는 와중에 list index of range 에러가 나오는데 해결법을 못 찾아서 질문드립니다.. from urllib.request import urlopen from bs4 import BeautifulSoup from xml.dom.pulldom import END_DOCUMENT import pandas as pd import requests from bs4 import BeautifulSoup from datetime import datetime import re from tqdm import tqdm from tqdm.contrib.concurrent import process_map import math from time import sleep from multiprocessing.dummy import Pool import multiprocessing as mp from multiprocessing.pool import MaybeEncodingError start_date = "y1=2019&m1=09&d1=25" end_date = "y2=2019&m2=09&d2=30" url = "https://find.mk.co.kr/new/search.php?pageNum={}&cat=&cat1=&media_eco=&pageSize=10&sub=all&dispFlag=OFF&page=news&s_kwd=%BB%EF%BC%BA%C0%FC%C0%DA&s_page=news&go_page=&ord=1&ord1=1&ord2=0&s_keyword=%BB%EF%BC%BA%C0%FC%C0%DA&period=p_direct&s_i_keyword=%BB%EF%BC%BA%C0%FC%C0%DA&s_author=&{}&{}&ord=1&area=ttbd" def get_list(idx) : #idx = 검색했을때 page 번호 req = requests.get(url.format(idx, start_date, end_date)) #한글깨져서 인코딩 soup = BeautifulSoup(req.content.decode('euc-kr','replace'), 'html.parser') div_list = soup.find_all('div', {'class' : 'sub_list'}) art_list = [i.find('span', {'class': 'art_tit'}) for i in div_list] #db에 저장할거 title, href, body, date df = pd.DataFrame(columns = {'title','href', 'date','body'}) for article in art_list: append_flag = True title = str(article.find("a").contents[0]) href = str(article.find("a")["href"]) body_text = None date = None try: req = requests.get(href, timeout=2) except requests.exceptions.Timeout as errd: print("Timeout Error : ", errd) except requests.exceptions.ConnectionError as errc: print("Error Connecting : ", errc) except requests.exceptions.HTTPError as errb: print("Http Error : ", errb) # Any Error except upper exception except requests.exceptions.RequestException as erra: print("AnyException : ", erra) try: soup = BeautifulSoup(req.content.decode('euc-kr','replace'), 'html.parser') except: print("parser error") date_text = soup.find('li', {'class' : 'lasttime'}) if not date_text : date_text = soup.find('li', {'class' : 'lasttime1'}) if date_text : match = re.search(r'\d{4}.\d{2}.\d{2}', date_text.string) if match : date = datetime.strptime(match.group(), '%Y.%m.%d').date() else : print("match none") else : append_flag = False #print("mssing date text") art_text = soup.find('div', {'class' : 'art_txt'}) if not art_text : art_text = soup.find('div', {'class' : 'article_body'}) if not art_text : art_text = soup.find('div', {'class' : 'view_txt'}) if art_text : body_text = art_text.get_text() else : append_flag = False #print("mssing body text") #print("link : " + href) if append_flag : temp = pd.DataFrame({'title' : [ title ], 'href' : [ href ], 'date' : [ date ], 'body' : [body_text]}) df = df.append(temp) return df def get_count() : req = requests.get(url.format(1, start_date, end_date)) #한글깨져서 인코딩 soup = BeautifulSoup(req.content.decode('euc-kr','replace'), 'html.parser') count_text = soup.find('span', {'class' : 'class_tit'}).get_text().replace(",","") art_count = re.search("\d+",count_text) "y1=2019&m1=03&d1=15" print(start_date[3:7]+"년 "+start_date[11:13]+"월 "+start_date[17:]+"일 부터 " +end_date[3:7]+"년 "+end_date[11:13]+"월 "+end_date[17:]+"일 까지 총 " +art_count.group(0)+"개의 기사") return art_count.group(0) if __name__ == "__main__": count = get_count() tasks_count = math.ceil(float(count)/20) + 1 #tasks = range(1,10) tasks = range(1,tasks_count) result_list = process_map(get_list, tasks,max_workers=4) df = pd.concat(result_list) #df = pd.concat(parmap.map(get_list, tasks, pm_pbar = True, pm_processes = 4)) print(df) file_name = start_date[5:7]+start_date[11:13]+start_date[17:]+"_"+end_date[5:7]+end_date[11:13]+end_date[17:] df.to_csv(file_name+'.csv', index = False, encoding='utf-8-sig') ------------------------------------------------------------------------------------------------------------------------------------------------------ 코드는 이렇구요 _RemoteTraceback Traceback (most recent call last) _RemoteTraceback : """ Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/process.py", line 175, in _process_worker r = call_item.fn(*call_item.args, **call_item.kwargs) File "/home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/process.py", line 153, in _process_chunk return [fn(*args) for args in chunk] File "/home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/process.py", line 153, in <listcomp> return [fn(*args) for args in chunk] File "<ipython-input-7-167ab35f9166>", line 22, in get_list title = str(article.find("a").contents[0]) IndexError: list index out of range """ The above exception was the direct cause of the following exception: IndexError Traceback (most recent call last) <ipython-input-7-167ab35f9166> in <module> () 96 #tasks = range(1,10) 97 tasks = range ( 1 , tasks_count ) ---> 98 result_list = process_map ( get_list , tasks , max_workers = 4 ) 99 df = pd . concat ( result_list ) 100 #df = pd.concat(parmap.map(get_list, tasks, pm_pbar = True, pm_processes = 4)) /home/ubuntu/anaconda3/envs/python3/lib/python3.6/site-packages/tqdm/contrib/concurrent.py in process_map (fn, *iterables, **tqdm_kwargs) 128 tqdm_kwargs = tqdm_kwargs . copy ( ) 129 tqdm_kwargs [ "lock_name" ] = "mp_lock" --> 130 return _executor_map ( ProcessPoolExecutor , fn , * iterables , ** tqdm_kwargs ) /home/ubuntu/anaconda3/envs/python3/lib/python3.6/site-packages/tqdm/contrib/concurrent.py in _executor_map (PoolExecutor, fn, *iterables, **tqdm_kwargs) 74 map_args . update ( chunksize = chunksize ) 75 with PoolExecutor ( ** pool_kwargs ) as ex : ---> 76 return list ( tqdm_class ( ex . map ( fn , * iterables , ** map_args ) , ** kwargs ) ) 77 78 /home/ubuntu/anaconda3/envs/python3/lib/python3.6/site-packages/tqdm/notebook.py in __iter__ (self) 255 def __iter__ ( self ) : 256 try : --> 257 for obj in super ( tqdm_notebook , self ) . __iter__ ( ) : 258 # return super(tqdm...) will not catch exception 259 yield obj /home/ubuntu/anaconda3/envs/python3/lib/python3.6/site-packages/tqdm/std.py in __iter__ (self) 1183 1184 try : -> 1185 for obj in iterable : 1186 yield obj 1187 # Update and possibly print the progressbar. /home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/process.py in _chain_from_iterable_of_lists (iterable) 364 careful not to keep references to yielded objects . 365 """ --> 366 for element in iterable : 367 element . reverse ( ) 368 while element : /home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/_base.py in result_iterator () 584 # Careful not to keep a reference to the popped future 585 if timeout is None : --> 586 yield fs . pop ( ) . result ( ) 587 else : 588 yield fs . pop ( ) . result ( end_time - time . monotonic ( ) ) /home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/_base.py in result (self, timeout) 430 raise CancelledError ( ) 431 elif self . _state == FINISHED : --> 432 return self . __get_result ( ) 433 else : 434 raise TimeoutError ( ) /home/ubuntu/anaconda3/envs/python3/lib/python3.6/concurrent/futures/_base.py in __get_result (self) 382 def __get_result ( self ) : 383 if self . _exception : --> 384 raise self . _exception 385 else : 386 return self . _result --------------------------------------------------------------------------------------------------------------------- 이렇게 에러가 뜹니다 title = str(article.find("a").contents[0]) 이 부분에서 contents가 존재하지 않는데 인덱스로 접근하려고 해서 오류가 난 것 같은데 contents가 무조건 존재 하는게 아니라면 존재하지 않는 경우의 예외처리를 추가하려면 어떻게 해야될까요? 어느 위치에 뭐라고 작성해야 할지 몰라서 막막해서 질문드립니다
Co Di
2022-03-30T04:43:53.330Z
댓글 0
좋아요 0
조회수 633
해결됨
프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
안녕하세요. 웹 최적화 파트1,2 수강자입니다. 수강을 하면서 웹에 대해 최대한 성능 좋게 개발을 꾸준히 하려고 노력하고 있습니다. 이에 따라 여러 가지 고민이 되는 부분이 생겨서 해당 카테고리와는 크게 관련성은 없지만 여기에 글을 올려봅니다. 궁금증 1. useMemo, useCallback 관련하여 질문드리고 싶습니다. memoization을 통해 불필요한 렌더링을 줄일 수 있는 장점을 가지고 있어 위와 같은 훅을 잘 사용해보려합니다. 하지만 효율적으로 사용을 해야 메모리 적으로 봤을 때 문제가 되지 않을거같아 고민을 하는 찰라에 많은 개발자분들이 단순히 useState에서 set하는 부분만을 useCallback에 담아서 사용하는거 같더라구요. 예를 들어 const [ isOpen, setIsOpen = useState<boolean>(false); const callback = useCallback( () => {setIsOpen(true)}, []); 이런 식으로요. 하지만 제 생각에는 이렇게 작은 것도 다 넣으면 모든게 메모리에 올라가게 되어 메모리 낭비인가 라는 생각이들었습니다. 이러한 작은 것들도 다 useMemo나 useCallback 을 적용하는 것이 메모리적인 관점에서 보는 것보다 렌더링에 이점을 주는 것이 더 큰가라는 생각이 듭니다. 혹시 이 부분에 대해 피드백 해주시면 감사하겠습니다. 궁금증 2. 많은 input에서의 onChange에 따른 렌더링 회원가입 폼과 같이 input 굉장히 많은 경우 여기에 onChange Event에 따라 회원정보가 set이 되고 타이핑할 때마다 리렌더링이 된다는 생각이 과하다는 생각이들어서 질문 드립니다. 그래서 제가 생각해본건 useRef로 모든 input에 접근하고 회원가입 버튼 눌렀을 때 한번에 input value 를 가져와서 한번만 set을 하는게 낫지않을까 라는 생각도 들었습니다. 위와 같은 생각이 잘못되었는지, 혹은 onChange에 따라 set을 다해도 가상돔으로 비교해서 전체 다 그려주는게 아니기 때문에 큰 이슈는 되지않아 그냥 사용해도 될지에 대해 궁금합니다. 답변해주시면 정말 감사하겠습니다.
유상원
2022-03-30T02:23:33.740Z
댓글 1
좋아요 2
조회수 1478
미해결
[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. import requests from bs4 import BeautifulSoup import openpyxl fpath = r'C:\Users\Lenovo\Desktop\content\참가자_data.xlsx' wb = openpyxl.load_workbook(fpath) ws=wb.active #현재 활성화된 시트 선택 codes = ["000660","035720","005930"] row=2 for code in codes: url=f"https://finance.naver.com/item/sise.naver?code={code}" response = requests.get(url) html=response.text soup=BeautifulSoup(html,'html.parser') price=soup.select_one("#_nowVal").text price=price.replace(',','') print(price) ws=[f'B{row}']=int(price) row=row+1 wb.save(fpath) cannot assign to f-string expression 이런 에러가 뜨면서 작동이 안됩니다 ㅜㅜ
2022-03-29T13:05:59.592Z
댓글 1
좋아요 1
조회수 305