Thumbnail
BEST 개발 ・ 프로그래밍 웹 개발
Node.js로 웹 크롤링하기
(4.8)
21개의 수강평 ∙ 394명의 수강생

55,000원

지식공유자 : 조현영
총 75개 수업˙총 13시간 36분
평생 무제한 수강
수료증 발급 강의
중급이상 대상
이 강의는 멘토링 신청이 가능합니다.
멘토링은 수강 신청과 별개로 운영되며, 수강생이 아니어도 신청할 수 있습니다.
내 목록 추가 473 공유
JY C 프로필

skt api로 받은 데이터를 DB에 저장하고 싶습니다. JY C 7일 전
안녕하세요. skt에서 제공하는 api로 데이터를 받아서 원하는 데이터를 콘솔로그까지 뿌려보는 작업까지는 성공했습니다. const getData = async() => {   try {     const response = await axios(config);       console.log(response.data['cin']['con']); }   catch (error) {     console.log('최근 데이터가 없습니다.');   } } 이 코드에서 response.data 저장된 값을 sequelize로 만들어진 mysql DB 테이블에 원하는 값만 저장하고 싶은데 예시로 짜본 코드는 다음과 같습니다. const saveData = async()=>{   try {     const response = await axios(config);     await db.db_test.create({       creator : response.data['cin']['cr'],       location : response.data['cin']['ppt']['devl'],       creat_time : response.data['cin']['ct'],       lastest_time : response.data['cin']['lt'],       expire_time: response.data['cin']['et'],       contain_data : response.data['cin']['con']        }).then(resolved,rejected);   } catch (error) {     console.log(error);     } } saveData(); 코드를 실행하면 테이블 만들어지는 화면만 나오고 데이터가 Db에 저장이 안됩니다. DB 싱크는 해놓은 상태입니다. 참고로 response.data['cin']에 들어가 있는 데이터는 다음과 같이 저장이 됩니다.

7
프랭크 프로필

쿠팡 크롤링 프랭크 18일 전
강의와 관련있는 질문을 남겨주세요.• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달에도 요령이 필요합니다.• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다.  안녕하세요!  쿠팡의 경우 puppeteer로 될 때도 있고 안 될 때도 있던 것 같더라구요. 아마 블로그에서 언급하신 rate-limit에 걸린 것 같기도 한데, 혹시 우회법을 찾으셨을까요? 혹은 rate-limit에 걸리지 않으려면 어느 시점에 딜레이를 주거나 하면 좋을까요? 감사합니다.

1
김태준 프로필

로그인 팝업창 질문드립니다. 김태준 1달 전
이러한 팝업 태그창에 input은 어떻게 해야하는지 궁금합니다. 개발자 도구의 network에도 단순히 unAthorized라고 뜰뿐 팝업창의 단서를 찾을 수 없었습니다. 해결 할 수 있는 방법이 있을까요?

1
김태준 프로필

크롤링을하는데 빈값이 들어옵니다. 김태준 1달 전
안녕하세요 지금 학교 웹사이트를 크롤링하는 중인데, 어찌 저찌 원하는 페이지까지 찾아서 태그까지 정확하게 찾은 것 같습니다. 그런데 해당 태그를 긁어오면 빈배열만 들어옵니다.  어떤 문제인지 궁금합니다.

4
퓨퓨로오1 프로필

크롤링한 내용을 html에 뿌리고 싶습니다 퓨퓨로오1 1달 전
서버방식으로 동작하는게 아니라 js처럼 함수를 호출해서 크롤링하고싶은데ㅠ 불가능할까요

1
퓨퓨로오1 프로필

인코딩문제 퓨퓨로오1 1달 전
제로초님과 똑같이 코딩했는데 한글이 깨져서 나옵니당..

1
gogosssing95 프로필

app.use() 문법에서 next메서드 사용 질문드립니다. gogosssing95 1달 전
nodejs 유료강의중에 올라왔던 부분입니다. express 사용법 부분이요.! app.use()를 사용하여 어떤 라우트 요청이 들어와도 무조건 실행하고 싶은 코드를 최상단에 use 메서드를 사용해서 처리할 수 있다고 하셨었는데, 그러면서 동시에 next() 함수를 인자로 받아와서 작성해줘야지만 아래 코드가 순차적으로 실행된다고 배웠습니다. 그런데 뒤에 강의를 듣다보니 아래와같이 코드 최상단에 이렇게 작성하셨는데  next()함수 없이도 이렇게 작성하여도 아래 코드가 실행됩니다.  next() 함수를 사용해야되는때가 미들웨어를 설정해주었을때만 그러니까 콜백함수라고 해야되나요? 정확한 명칭은 미들웨어라고 아는데 (req, res, next) => { } 이러한 미들웨어를 작성했을때만 next() 함수를 사용해주면 되는것인가요? 그리고 한가지 더 궁금한점이 있습니다. app.get('./user', (req, res, next)=>{ }) 이부분의 코드를 라우터라고 부르는게 맞을까요? 아니면 미들웨어라고 칭하는게 맞는것인가요? 좋은강의 해주셔서 매번 감사드립니다.

1
비단뱀 프로필

배포하는 방법이 궁금합니다. 비단뱀 2달 전
안녕하세요. 이제부터 강의를 듣고 있는데요. 나중에 나오는 강의중에 aws나 netliy등에 올려서 자동화 하는 것도 배울 수 있나요? 만약에 강의 내용중에 없다면, 어디에 배포하는 것이 좋나요? 되도록 쉽게 할 수 있는 곳을 추천해주시면 감사하겠습니다ㅜㅜ

3
유상준 프로필

무한 스크롤을 할 때, 새로운 내용이 없을 경우 중단하는 방법이 궁금합니다. 유상준 2달 전
회사에서 사용하는 카카오톡 채널(구 옐로 페이지)의 대화 목록을 크롤링해서 자체 DB로 옮기는 작업을 하고 있는데요, 대화 목록이나 대화 내용을 크롤링 할 때 새로운 내용이 나올 때까지만 자동 스크롤 해서 대화 내용을 받으려고 합니다. 더 이상 스크롤 되지 않을 때까지 스크롤 하는 방법이 있을까요?

3
주홍철 프로필

node.js 싱글코어 주홍철 4달 전
node.js는 싱글코어라 fs pipe stream을 사용한다고 핫겼는데 node.js가 싱글코어인가요?

1
new code 프로필

puppeteer 는 GUI 환경에서만 실행할수있나요? new code 5달 전
headless = true 라면 일반 커멘드라인 리눅스환경에서도 작동이 될까요? 클라우드환경에서 작동시키고 싶어서요

1
감사합니다 프로필

js 동기처리에 대해 질문드립니다(2) 감사합니다 5달 전
여전히 같은 문제가 발생하여 다시 질문합니다 말씀해주신대로 'end' 이벤트 부분에서 resolve를 해주었지만 실제로 then 부분에서 promise가 resolve되지 않는것 같습니다... 정말 죄송한데 코드 한번만 확인해주실수 있나요??ㅠㅠ..  실제로 resolve하는 부분은 ./js/index.js 파일에 있고, promise 함수는 ./js/downloader.js 파일에 있습니다 (retry 함수는 에러가 발생했을 때, 30번 까지 다시 시도해주는 함수입니다. 이부분 역시 promise로 만들었습니다)

3
감사합니다 프로필

js 동기처리에 대해 질문드립니다 감사합니다 5달 전
혼자 해보려고 했는데 너무 안되서 질문합니다 ㅜㅜ.. // downloader.js const downloader = (url ,title) => {     ytdl(url).pipe(fs.createWriteStream(`./${title}.mp4`));     ffmpeg(`./${title}.mp4`)     .pipe(fs.createWriteStream(`./${title}.mp4`), {end: true})     } // changeMetadata.js function changeMetadata(path, title) {     let data = nodeID3.read(path);     let tags = {}     nodeID3.write(tags, path); } 위에서 downloader(); changeMetadata(); 를 실행했을 때, downloader의 모든 실행이 완벽하게 완료된 후 changeMetadata를 실행하고 싶습니다. 위 두함수 모두 Promise 형태로 바꾸어서 await를 붙이거나, async.waterFall .. 을 해봤는데 제가 문법을 못쓰는건지, 아니면 다른 방법으로 해야되는건지 전부 안되더라구요.. 위와 같은 상황에서 동기식으로 처리하는 방법과 간단하게 코드 스케치정도 부탁드립니다!!! 위 처럼 함수 두개가 있고 firstFunction의 모든 작업이 완전히 끝난 다음에 secondFunction이 실행될 수 있도록 하고 싶습니다.

1
JY C 프로필

ELECTRON으로 UI생성 후 퍼피티어 호출 JY C 5달 전
안녕하세요 선생님 항상 강의 잘보고 있습니다. 선생님의 퍼피티어 크롤러를 일렉트론으로 UI를 생성후 실행해보고있는데 그냥 코드 실행하면 되는데 일렉트론에서 실행을 하면  Error passed function is not well serializable이라는 오류가 뜹니다. 이 에러를 어떻게 해결할수 있을까요? JSON.stringfy로 ""를 달고 evaluate에 문자열로 넘겨주면 되긴하는데 너무불편하고 다른 함수들이 작동하지 않습니다(waitfor등) "puppeteer-in-electron": 모듈을 사용하는 방법외에 해결할 방법이 궁금합니다. https://www.google.com/search?q=Error+passed+function+is+not+well+serializable&oq=err&aqs=chrome.0.69i59j69i57j0l3j69i61l2j69i60.3880j0j7&sourceid=chrome&ie=UTF-8

3
감사합니다 프로필

axios 에러 질문있습니다 감사합니다 6달 전
혼자 해결해보려고 했는데 너무 안돼서 질문합니다. axios를 사용해서 다음 뉴스기사를 크롤링하고 있는데 이게 url이 적을때는 잘 작동을 하는데 많아지면 계속 아래와 같은 에러가 발생합니다. (동일한 요청을 request로 했을 때는 정상작동합니다) Error: read ECONNRESET  at TLSWrap.onStreamRead (internal/stream_base_commons.js:205:27) 검색해보니 axios로 요청을 한번에 많이 보내면 발생할 수 있다고 하는데 솔직히 정확한 원인과 해결방법을 잘 모르겠습니다.. 처음에는 setInterval로 1분 단위로 나누어서 보내기도 했는데 너무 느리고 맞는 해결법이 아닌것 같더라구요.. 혹시 해결할 수 있는 방법이 있을까요??.. 전체 코드는 아래와 같습니다 const axios = require('axios'); const cheerio = require('cheerio'); let count=0; const findOutNewsLink = async () => {     const categories = ['society', 'politics', 'economic', 'foreign', 'culture', 'digital'];          let urlArray = [];     for(let i=0; i<categories.length; i++) {         for(let day=1; day<=5; day++) {             for(let page=1; page<=20; page++) {                 // await getSome(categories[0], page, day);                 urlArray.push(`https://news.daum.net/breakingnews/${categories[i]}?page=${page}&regDate=202006${pad(day, 2)}`)             }         }     }     getSome(urlArray, categories[0]);     } const getSome = async (urlArray, category) => {     try {         await Promise.all(urlArray.map(async (url) => {             const res = await axios.get(url);             if(res.status === 200) {                 const $ = cheerio.load(res.data);                 const aArr = $('a');                                  let newsArr = [];                                  for(let i=0; i<aArr.length; i++)                      if(aArr[i].attribs.href.includes('https://v.daum.net/v/')) newsArr.push(aArr[i].attribs.href);                 newsArr = Array.from(new Set(newsArr));                 // for(let i=0; i<newsArr.length; i++)                 //     findOutContent(newsArr[i], category);                 findOutContent(newsArr, category);             }         }));     }     catch (err) {         console.error(err);     } } const findOutContent = async (newsArr, category) => {     try {         await Promise.all(newsArr.map( async(newsURL) => {             const res = await axios.get(newsURL);             const $ = cheerio.load(res.data);             const title = $('.tit_view')[0].children[0].data;             let contentArr = $('#harmonyContainer p');             let content = "";             for(let i = 0; i < contentArr.length; i++) {                 if(contentArr[i].children[0] === undefined || contentArr[i].children[0].data === undefined) continue;                 content += contentArr[i].children[0].data + " ";             }                          const newsObject = {                 title,                 content,                 category             }             console.log(count);             count++;         }))     }     catch(err) {         console.error(err);     } } const pad = (n, width, z) => {     z = z || '0';     n = n + '';     return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } findOutNewsLink();

1

55,000원

내 목록 추가 473 공유
지식공유자 : 조현영
총 75개 수업˙총 13시간 36분
평생 무제한 수강
수료증 발급 강의
중급이상 대상
이 강의는 멘토링 신청이 가능합니다.
멘토링은 수강 신청과 별개로 운영되며, 수강생이 아니어도 신청할 수 있습니다.
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스