55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Node.js로 웹 크롤링하기
js 동기처리에 대해 질문드립니다
혼자 해보려고 했는데 너무 안되서 질문합니다 ㅜㅜ.. // 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이 실행될 수 있도록 하고 싶습니다.
- 해결됨Node.js로 웹 크롤링하기
ELECTRON으로 UI생성 후 퍼피티어 호출
안녕하세요 선생님 항상 강의 잘보고 있습니다. 선생님의 퍼피티어 크롤러를 일렉트론으로 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
- 미해결Node.js로 웹 크롤링하기
axios 에러 질문있습니다
혼자 해결해보려고 했는데 너무 안돼서 질문합니다. 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}®Date=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();
- 미해결Node.js로 웹 크롤링하기
제로초님 크롤링 최적화 질문 있습니다.
아무래도 네이버나 대형 포털은 이미지가 많아서 로딩 시간이 상당히 길어지는 경우가 많습니다.. 화면 전체를 스크린샷 해야하는데 이미지 때문에 시간이 오래걸리네요..(이미지는 있어야합니다) puppetteer 기능이나 관련 플러그인중에 이미지 로딩을 최적화 할 수 있는 방법이 있을까요? 현재 css와 폰트는 disable 한 상태입니다.
- 미해결Node.js로 웹 크롤링하기
Error: net::ERR_TOO_MANY_REDIRECTS at 에러 복구 불가인가요?
평소 잘 돌아가던게 프로그램을 서버이전하고 하루 돌렸는데 저 에러가 발생하고 실행할때 마다 저 에러가 계속발생하네요... 웹서버에서 아이피를 차단한거 같은데 해결방법은 없는건가요?
- 미해결Node.js로 웹 크롤링하기
throw new Error
개별적인 try...catch보다 throw new Error(...)를 쓰면 좋지 않나요?
- 미해결Node.js로 웹 크롤링하기
크롤러 요청 제한
안녕하세요 제로초님, puppteer에서 이미지 캡쳐를 요청 하면 새로운 페이지를 만들고 캡쳐후 close 하게끔 간단한 과정을 만들었습니다. 한 3~5개는 괜찮은데, 10개의 page를 한번에 캡쳐하려니, 브라우저 페이지가 먹통이 됩니다. 그래서 요청에 제한을 두려하는데 어떤 키워드로 찾아야 할지 모르겠어요.. HTTP Server 는 graphql-yoga(express) 를 붙혔고 요청이 5개 이상일때는 대기하라 라고 명하고 싶은데. 관련된 미들웨어 혹은 키워드가 있을까요?
- 미해결Node.js로 웹 크롤링하기
evaluate() 메서드 내에서 어떻게 딜레이를 적용할 수 있나요?
구글링을 통해 다양한 자료를 봤는데 명확한 답을 얻지 못하여 글을 남깁니다. page.waitFor 과 같은 함수를 evaluate() 함수 내에서 어떻게 구현할 수 있나요?
- 미해결Node.js로 웹 크롤링하기
6-1. 프록시 설명과 태그 분석 강의를 보고 질문드립니다.
안녕하세요 제로초님 [6-1. 프록시 설명과 태그 분석] 강의를 보고 궁금한 점이 생겨서 질문드립니다. 아래 코드에서 Array.from() 의 역할이 무엇인지 잘 모르겠습니다. ㅠㅠ... Array.from()을 MDN에서 찾아보니 유사 배열 객체(array-like object)나반복 가능한 객체(iterable object)를 얕게 복사해새로운Array 객체를 만든다고 하는데 Array.from() 으로 감싸기 전의 DOM API로 선택한 요소들(document.querySelectorAll('tr > td:first-of-type > .spy14'))을 왜 새롭게 Array 객체로 만드는 걸까 의문이 들어서 질문드립니다. 음 학습하면서 추론해보는 내용인데 혹시 DOM API로 선택한 유사배열 객체를 Array.from() 으로 감싸지 않으면 `map()` 함수를 쓸 수 없기 때문에 감싸는 것인가요? 아니면 혹시 다른 이유가 있는 것인지 궁금합니다. ```javascript Array.from(document.querySelectorAll('tr > td:first-of-type > .spy14')).map(v => v.textContent.replace(/document\.write\(.+\)/, '')); ``` 강의 잘 보고 있습니다. 제로초님 건강하세요
- 미해결Node.js로 웹 크롤링하기
콘솔에서 $문제
세션 2까지 수업을 들은 상태입니다. 네이버에서는 $를 이용하면 검색이 잘 되는데 카카오 페이지에서는 콘솔에서 검색을 할 때 $함수가 존재하지 않는다고 뜹니다. $$과 [0]를 이용하면 찾을 수는 있는데 그냥 경로만 찾으면 저런 것들은 문제가 없는 건가요?
- 미해결Node.js로 웹 크롤링하기
순차적으로 5개페이지 한번에
선생님 저도 이부분에서 막히네요 ㅜㅜ for of 을 써서 순차적으로 엑셀의 링크를 불러와서 크롤링하는데 한번에 5개씩 동시에 작업하고 싶어요 1,2,3,4,5 링크 쭉 가져와서 페이지 5개 한번에 열어서 크롤링하고 저장 6,7,8,9,10 링크 쭉 가져와서 페이지 한번에 열어서 크롤링 후 저장 promise all 을 써야되는걸 아는데 자세히 알수있을까요 ㅜㅜ 순차적으로 몇만개 크롤링하니까 시간이 너무걸리는것 같아서 동시에 처리하고싶어요
- 미해결Node.js로 웹 크롤링하기
puppeteer 3버전 관련
안녕하세요 제로초님 강의 잘 보고 있습니다 :) 현재 강의에서 쓰신 버전은 1점대 버전인데, 현시점 install 되는 버전은 3점대 버전이네요; 혹시 라이브러리 메소드 사용에 있어서 다른점이 많을까요?
- 미해결Node.js로 웹 크롤링하기
return 값 관련해서
return { score, img } 처럼 return 값이 중괄호로 감싸진 이유가 궁금합니다. 배움이 부족한건지 이런건 또 처음 보네요..
- 미해결Node.js로 웹 크롤링하기
프록시도 한계가 있나요?
다른 사람이 그 프록시 서버를 써서 특정 서비스에서 해당 IP를 막으면, 그 프록시 서버는 못쓰게 되나요?
- 미해결Node.js로 웹 크롤링하기
5개씩 순차적으로 크롤링도 가능한가요 ?
크롤링이 한번에 되던 문제는 덕분에 잘 해결하였습니다. 전체가 179개이다보니 강제로 시간 딜레이를 주게되어 소요시간이 오래걸려서요.. 혹시 await로 순차적으로 하긴 하지만 5개씩 묶어서 할 수 있는 효율적인 방법이 있을까요 ? 아니면 다른 방안을 찾아내어 고정 딜레이가 아닌 waitForSelector 과 같은 것을 이용해야 할까요 ?
- 미해결Node.js로 웹 크롤링하기
크롤링 순차적으로 하는방법.
지난번에 친절히 답변해주시고 좋은강의 해주셔서 크롤링을 아주 손쉽게 끝냈습니다. 이번에 DB에서 ID 값을 가지고 와서 크롤링을 돌리는 것을 하고 있습니다. 그런데 실행하니 총 179개의 id 값을 한번에 불러와서 크롬을 수십개 켜면서 작업을 하더라구요.. 물론 노트북이 버벅이고 메모리 에러가 발생해서 타임아웃으로 꺼졌지만.. 그래서 강의 부분중에 promiseall 이랑 for of 에 대해 다시 보았는데 이해가 잘 안되서요 결국 이걸 순차적으로 1부터 179까지 실행하려면 for of 를 쓰는건데 async await과 어떻게 연계해야 할지 조언 부탁드립니다. 단순히 강의 내용대로 쓰고 구글링해서 쓰니 for of 자체는 내부의 값을 차례대로 불러오기만 하더라구요 간단히 작성해보면 for( const value of cust_id) { crawler(value); } 이렇게 했는데 아마도 crawler이라는 함수가 끝나면 다음것을 해야할 것 같은데 어떤식으로 해결해야 할까요 ?
- 미해결Node.js로 웹 크롤링하기
Error: net::ERR_PROXY_CONNECTION_FAILED
제로초님 코드 그대로 따라했는데 아래와 같은 에러가 발생합니다. Error: net::ERR_PROXY_CONNECTION_FAILED at https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query=%EB%82%B4+%EC%95%84%EC%9D%B4%ED%94%BC 프록시 데이터들은 DB에 잘 저장되어어있는데 뭐가 문제일까요?
- 미해결Node.js로 웹 크롤링하기
클라이언트 단에서 puppeteer 을 사용하는 방법이 있나요 ?
puppeteer을 활용한 크롤링에 대한 강의 잘 보고 있습니다. 제가 목표로 하고 있는 것이 DB에서 ID 값을 가지고 와서 특정 페이지에 넣고 나오는 데이터를 크롤링해서 다시 DB에 넣는 것인데요 그것을 localhost:3000 번에서 하고 싶습니다. 제 서버로 접속하면 단지 버튼이 하나 있고 들어가서 버튼을 누르면 위에 목표대로 크롤링이 수행이 되도록 하는 것 인데요.. 지난번에 puppeteer로 하려고 하니 클라이언트 단 그러니까 브라우저에서는 puppeteer을 사용하지 못한다고 하더라구요. 어떤식으로 피해가거나 해결 할 수 있을까요 ?
- 미해결Node.js로 웹 크롤링하기
구글 로그인 couldn't sign you in 에러
구글 로그인 만들고 있는데요. Couldn't sign you in 구글 계정 아이디 Try using a different browser. If you’re already using a supported browser, you can refresh your screen and try again to sign in. https://www.reddit.com/r/firefox/comments/edxse8/this_browser_or_app_may_not_be_secure_when/ 이 url과 같은 에러가 나오는데, agent를 바꾸고, user profile을 추가해봐도 이 에러에서 더 넘어갈수가 없어서요 ㅠㅠ 어떻게 해야하나요?
- 미해결Node.js로 웹 크롤링하기
이미지 크롤링 질문입니다.!
https://try-puppeteer.appspot.com/ 알려주신 위 사이트에서 이미지 없이 네이버 영화 사이트 접속했는데 무한루프가 도는겁니다. 네이버 영화 사이트측에서 다운로드 실패시 다시 되도록 자동설정해놔서그런건가요? const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setRequestInterception(true); page.on('request', request => { if (request.resourceType() === 'image') request.abort(); else request.continue(); }); await page.goto('https://movie.naver.com/movie/bi/mi/basic.nhn?code=189001'); await page.screenshot({path: 'news.png', fullPage: true}); await browser.close();