55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨Node.js로 웹 크롤링하기
선장님 도와주십쇼!
import puppeteer from "puppeteer"; import axios from "axios"; import fs from "fs"; const botAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"; const crawlerBot = async () => { try { const browser = await puppeteer.launch({ headless: false, args: ["--window-size=1920,1080"], }); const page = await browser.newPage(); await page.setUserAgent(botAgent); await page.goto("https://unsplash.com"); await page.waitFor(2000); const result = await page.evaluate(() => { const imageArray = []; const image = document.querySelectorAll(".ripi6 img.YVj9w"); if (image.length) { image.forEach((e) => { imageArray.push(e); }); } return imageArray; }); console.log(result); await page.close(); await browser.close(); } catch (err) { console.error(err); } } crawlerBot(); 강의에서 빈값이 들어있는 이유랑 연관이 있는 거 같은데 태그를 찍어봤더니 전부 빈 객체가 들어있습니다.(다른 태그들도 빈 객체) 언스플래쉬 사이트가 철통보안을 쳐놓은 걸까요? 콘솔 태그 결과입니다.
- 미해결Node.js로 웹 크롤링하기
객체를 볼때 이런케이스가 있습니다.
위는 서버에서 websocket의 clinets 를 콘솔로그에 찍은 겁니다 ^^; 그런데 앞에 Set(1) 처럼 이름이 붙을때가 있는데 이것은 KEYWORD 라고 생각하면 되나요? 그리고 저건 <ref *1> 참조된 웹소켓 객체다 인건지 저 값들에 접근을 하려면 어떻게 해야하는건가요?
- 미해결Node.js로 웹 크롤링하기
1강부터 막히네요;;;
강의가 왠지 다른강의가 이미 진행됐던것에서 시작된 느낌이 드네요... 전 이걸 첫 강의로 듣고 있습니다.. index.js를 작성해서 npm start 돌려보면 에러가 뜹니다.. const parse = require('csv-parse/lib/sync'); const fs = require('fs'); const csv = fs.readFileSync('csv/data.csv'); console.log(csv.toString('utf-8')); Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/sync' is not defined by "exports" in C:\Users\user\Desktop\crawling\node_modules\csv-parse\package.json at new NodeError (node:internal/errors:371:5) at throwExportsNotFound (node:internal/modules/esm/resolve:453:9) at packageExportsResolve (node:internal/modules/esm/resolve:731:3) at resolveExports (node:internal/modules/cjs/loader:482:36) at Function.Module._findPath (node:internal/modules/cjs/loader:522:31) at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27) at Function.Module._load (node:internal/modules/cjs/loader:778:27) at Module.require (node:internal/modules/cjs/loader:1005:19) at require (node:internal/modules/cjs/helpers:102:18) at Object.<anonymous> (C:\Users\user\Desktop\crawling\index.js:1:15) { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' }
- 미해결Node.js로 웹 크롤링하기
페이스북 로그아웃 관련해서 문의드립니다.
안녕하세요, 페이스북 로그인 로그아웃 기능을 구현하는 예제를 학습하는 도중, 해결하지 못하겠는 문제가 생겨서 질문을 남깁니다. 현재 아래와 같이 수업을 따라 진행하고 있습니다만, 페이스북이 로그아웃 버튼을 강의 시기에는 <li> 태그 안에 두어서 lastchild로 찾을 수 있었다면, 현재는 여러 해쉬 처리된 div class로 찾기가 너무너무 어렵습니다. 요소 검사로 찾았다 싶은 class도 중복이 너무 많거나 안이 비어있습니다. 혹시 페이스북에서 로그아웃을 '태그'를 통해 할 수 있는 새로운 방법이 있을까요? await page.evaluate(()=>{ document.querySelector('.i09qtzwb.n7fi1qx3.b5wmifdl.hzruof5a.pmk7jnqg.j9ispegn.kr520xx4.c5ndavph.art1omkt.ot9fgl3s.sx5rzos5.s45kfl79.emlxlaya.bkmhp75w.spb7xbtv').click; }); 항상 강의 너무 잘 듣고 있고 좋은 강의 해주셔서 감사합니다! const puppeteer = require('puppeteer'); const dotenv = require('dotenv'); dotenv.config(); const autoLogin = async () => { try { const browser = await puppeteer.launch({ headless: process.env.NODE_ENV === 'production', args: ['--window-size=1600,900'] }); browser.userAgent( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.0 Safari/537.36' ); const page = await browser.newPage(); await page.setViewport({ width: 1080, height: 1080 }); await page.goto('https://www.facebook.com'); const id = process.env.APPLE; const pw = process.env.BANANA; /* // 방법 1: 가장 단순한 로그인 방식 await page.evaluate((id, pw)=>{ // 아이디 입력 document.querySelector('#email').value = id; // 비밀번호 입력 document.querySelector('#pass').value = pw; // 로그인 버튼 클릭 document.querySelector('._6ltg button').click(); }, id, pw); */ // 방법 2: puppeteer를 사용한 로그인 방식 // page.type(선택자, 입력값) : 실제로 해당 선택자에 입력하는 것으로 작동 await page.type('#email', process.env.APPLE); await page.type('#pass', process.env.BANANA); // hover는 특정 태그 위에 마우스를 올리는 행위를 의미 await page.hover('._6ltg button'); await page.waitFor(800); await page.click('._6ltg button'); await page.waitFor(800); // 알림 허용 등 팝업 없애기 -> esc 버튼을 한 번 누르기 // page.keyboard.press()는 인자로 들어온 키를 누르는 동작을 함 // https://github.com/wix-incubator/unidriver/blob/master/core/src/puppeteer-us-keyboard-layout.ts // ex) page.keyboard.press('Enter'); await page.keyboard.press('Escape'); await page.waitFor(1500); await page.close(); await browser.close(); } catch (err) { console.error(err); } }; autoLogin();
- 미해결Node.js로 웹 크롤링하기
db.Proxy.create 부분 질문이 있습니다.
# db.Proxy.create 부분 질문이 있습니다. 1. Promise.all 를 사용하는 이유가 무엇인가요? Promise.all 없이 foreach 만 사용해도 적상작동을 합니다. 2. map 에 async 함수를 준 이유가 무엇인가요? db.Proxy.create 가 Promise 인건가요? > 좋은 강의 감사합니다. 좋은 하루 보내세요 : )
- 미해결Node.js로 웹 크롤링하기
userAgent 질문입니다.
안녕하세요 강의 잘듣고있습니다. 한가지궁금한게 fake userAgent 를위해서 본인의 브라우저에 있는 agent 를 setup 하면된다라고하셨는데, 테스트해보니 기본 page.evaluation('navigator.userAgent') 의 결과값이 아래와같습니다. Puppeteer 의 default userAgent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3723.0 Safari/537.36 제 브라우저의 userAgent 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Mobile Safari/537.36' 위와 같이 나오긴합니다. 일반적인 브라우저와 별차이가 없는거같아 보이긴하는데... puppeteer 의 userAgent 로 userAgent 로 막는방법이있을까요??
- 미해결Node.js로 웹 크롤링하기
혹시나 newPage 에서 프리징걸리시는분들
저도.. 초보라서 강의보면서 이것저것 찾아보던중에 puppeteer newPage 에서 freezing 걸리더라고요. launch 함수에서 args:["--no-sandbox"] 하면 되긴하는데.. 찾아봐도 되는이유는 아직못찾겠더라고요. 크롬버전은 74.0.3723.0 였어요 그리고 설치된 크롬버전과 pupeteer 버전 크롬버전이 다르긴한거같아요. 꼭 테스트브라우저에서 버전 확인해봐야할거같아요~~ https://github.com/puppeteer/puppeteer/issues/6232
- 미해결Node.js로 웹 크롤링하기
readline 으로 사용자 입력을 기다린 후 puppeteer 코드 실행하기
코드 설명 : 사용자의 입력을 받아 입력 데이터를 검색하는 프로그램 11번가 주소로 이동 > 검색창 기다리기 > inputText() 로 입력받기 (inputText.js) > searchText에 저장된 입력데이터를 typing하기 > 검색버튼 누르기 첫번째 사진 15번부터 문제가 생긴듯 합니다. 문제는 입력을 기다리기 전에 밑에 코드들을 시작합니다. 이것을 해결하기 위해 readline-sync npm을 사용해 보았지만 인코딩오류(찾아봤지만 해결이 안됨)때문에 안되더라구요ㅠㅠ 1. 사용자가 입력할 때까지 기다리기 2. 입력한 데이터로 검색하기 이 기능을 구현하려면 어떻게 해야 할까요???
- 미해결Node.js로 웹 크롤링하기
첫 csv-parse 오류
강의 영상과 동일하게 진행했으나 오류가 발견되어 문의드립니다. 1. 폴더 생성 (crawler) 2. npm init 실행 및 설정 3. 해당 폴더에 npm i csv-parse 실행 4. index.js 파일에 동일한 형태로 코드 진행 5. npm start 실행 > crawler@1.0.0 start > node index node:internal/modules/cjs/loader:488 throw e; ^ Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/sync' is not defined by "exports" in /Users/imjake/Desktop/node/crawler/node_modules/csv-parse/package.json at new NodeError (node:internal/errors:371:5) at throwExportsNotFound (node:internal/modules/esm/resolve:440:9) at packageExportsResolve (node:internal/modules/esm/resolve:692:3) at resolveExports (node:internal/modules/cjs/loader:482:36) at Function.Module._findPath (node:internal/modules/cjs/loader:522:31) at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27) at Function.Module._load (node:internal/modules/cjs/loader:778:27) at Module.require (node:internal/modules/cjs/loader:1005:19) at require (node:internal/modules/cjs/helpers:102:18) at Object.<anonymous> (/Users/imjake/Desktop/node/crawler/index.js:1:15) { code: 'ERR_PACKAGE_PATH_NOT_EXPORTED' } 위와 같이 오류가 발생했습니다. 이런 저런 방법을 찾으려고 했으나 잘 모르겠네요. (버전이슈일까요?) 각 버전은 다음과 같습니다. node - v16.13.1 csv-parse - v5.0.4
- 미해결Node.js로 웹 크롤링하기
프록시 관련 질문
저번에 프록시 관련을 물어본 학생인데 그럼 궁금한게 https://www.proxysite.com/ko/ 이런 무료로 사이트를 연결해주는 곳으로 돌아서 들어가고 크롤링을 한다면 제 ip노출이 안되나요 ? 만약 다른 문제가 있다면 뭐가 문제인지 알려주시면 감사하겠습니다 !!영상 잘보고 있습니다 강사님 !
- 미해결Node.js로 웹 크롤링하기
프록시 에러
안녕하세요 강사님 프록시 ip 적용하기 강의를 보고 있는데 프록시를 적용하고 하면 밑에 에러가 나고 있습니다 ERR_PROXY_CONNECTION_FAILED 혹시 그 ip가 막혔나 하고 다른 ip도 다 해보고 있는데 되질 않더라구요 시간이 많이 흘러서 안되는 부분인지 궁금합니다 이 강의가 나오고 좀 오래 되서 그런지 조금씩 다른부분이 있어서 그건 제가 변경하고 해보고 있는데 이부분은 찾을수가 없네요 답변 기다리고 있겠습니다 !
- 미해결Node.js로 웹 크롤링하기
선택자 관련 질문 드립니다.
안녕하세요. 선택자 관련해서 잘 이해가 안가는점이 있어 문의드립니다. 크롬 console 에서 $$('tr.abc td')[1].textContent 명령어를 칠 경우 100이라는 숫자를 뽑아옵니다. 소스 코드 상에서 아래와 같이 여러 방법을 사용해봤는데요. 100 이라는 데이터를 못가져오더라고요. 관련해서 어떻게 접근해야 100 이라는 데이터를 가져올 수 있을까요? source code const text = await page.evaluate(() => { const num = document.querySelector('tr.abc td')[1]; return num.textContent;});const text = await page.evaluate(() => { const num = document.querySelectorAll('tr.abc td')[1]; return num;});const text = await page.evaluate(() => { const num = document.querySelector('tr.abc td'); return num;}); HTML 태그입니다. <tr class="abc"> <td class="text">숫자</td> <td>100</td> ... ... </tr>
- 미해결Node.js로 웹 크롤링하기
csv-parse 관련해서 질문드립니다.
안녕하세요. 이전 강의 중에, csv-parse 부분에서 csv-parse/dist/cjs/sync.cjs 를 사용하라고 얘기해주셨는데요. npm start 를 하면 const records = parse(csv.toString('utf-8')); 부분에서 에러가 발생하더라고요. 관련해서 csv-parse/dist/cjs/sync.cjs 를 인터넷에 찾아봤는데 나오는게 없습니다.. ㅠ 해당 부분은 어떻게 처리하면 될지 알 수 있을까요? SourceCode const parse = require("csv-parse/dist/cjs/sync.cjs");const fs = require('fs');const puppeteer = require('puppeteer');const csv = fs.readFileSync('csv/data.csv');const records = parse(csv.toString('utf-8'));const crawler = async () => { try { const browser = await puppeteer.launch( {headless: false} ); await Promise.all(records.map(async (r, i) => { try { const page = await browser.newPage(); await page.goto(r[1]); const scoreE1 = await page.$('.score.score_left .start_score'); if (scoreE1) { const text = await page.evaluate(tag => tag.textContext, scoreE1); console.log(text); } } catch (e) { console.error(e); } })); await browser.close(); } catch (e) { console.error(e); }};crawler(); StackTrace const records = parse(csv.toString('utf-8')); ^ TypeError: parse is not a function
- 미해결Node.js로 웹 크롤링하기
axios와 cheerio로 노래 목록 가져오기
제로초님 안녕하세요. 강사님의 'axios-cheerio 로 첫 크롤링하기 '편을 보고 직접 다뤄보고자 응용해보던 중, 원하는 결과가 나오지 않아 질문을 올리게 되었습니다. 저는 해당 사이트(네이버 바이브)에서 `.track_section .select_all .text_area .text`에 있는 총 곡 수를 받아와 `songsNum`이라는 변수에 저장하고, `songsNum`수만큼 반복문을 돌려 크롤링한 노래 제목과 아티스트 정보를 배열에 따로 저장하여, json 형식으로 제작하고자 합니다. 그러나 하단의 제가 작성한 코드에서 처럼 `$('.track_section .select_all .text_area .text').text();`나 `$('. track_section .text').text();`등을 통해 text값을 가져오려고 해도 값이 가져와지지 않습니다. 뿐만아니라, 노래 제목과 아티스트명을 `$(선택자).text()`를 이용해서 가져오려고 해도 전부 공백이 뜹니다. nodemon을 돌리면서 console.log()로 값이 제대로 가져와지는지 확인하고 있는데, 아래의 사진처럼 계속 공백이 나옵니다. 소스코드 const fs = require('fs'); const axios = require('axios'); const cheerio = require('cheerio'); let vibeUrl = fs.readFileSync('./data/vibe.txt').toString(); let title = new Array(); let artists = new Array(); const crawler = async() => { const response = await axios.get(vibeUrl); if(response.status === 200) { const html = response.data; const $ = cheerio.load(html); const songsNum = $('.track_section .select_all .text_area .text').text(); console.log(songsNum); // for(let i = 0; i < songsNum; i++) { // } } } crawler(); 혹시 선택자를 어떻게 이용해야 제가 원하는 값들을 가져올 수 있을지 여쭤보아도 될까요?
- 미해결Node.js로 웹 크롤링하기
처음부터 막힐지는 몰랐네요..
안녕하세요. 처음부터 막힐지는 몰랐네요.. 답변 부탁드립니다. 소스코드 const parse = require('csv-parse/lib/sync');console.log("Hello World"); stackTrace import { Parser } from './index.js'; ^^^^^^ SyntaxError: Cannot use import statement outside a module at Module._compile (internal/modules/cjs/loader.js:895:18) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) at Function.Module._load (internal/modules/cjs/loader.js:727:14) at Module.require (internal/modules/cjs/loader.js:852:19) at require (internal/modules/cjs/helpers.js:74:18) at Object.<anonymous> (/Users/xxx/IntelliJ/etc/nodejs-crawler/lecture/index.js:1:15) at Module._compile (internal/modules/cjs/loader.js:959:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) 원인 추정 csv-parse/lib/sync. 에서 왜 import {Parser} from ./index.js 를 호출하는지를 모르겠습니다. path 가 안맞아서 생긴 에러같은데 어떻게 처리해야할지를 모르겠네요. 시도해본 방법 1. package.json 에 type:" module" 추가
- 해결됨Node.js로 웹 크롤링하기
수업자료로 따로 올려놓은 pdf 파일은 없나요???
수업자료로 정리해놓은 pdf 파일은 없나요???
- 미해결Node.js로 웹 크롤링하기
외부 모듈을 사용하지않고 파싱할 수 있는 방법이 있나요/
제목 그대로입니다. cheerio나 jsdom말고 파싱하는 방법이 있을까요
- 미해결Node.js로 웹 크롤링하기
page.type 관련 질문이 있습니다.
안녕하세요. 이전에 멀티페이지 크로울링에 관련해서 배웠었는데요. page.type의 경우 여러 개의 탭을 열어 동시에 로그인하기 위해서는 쓸 수가 없나요? 단일 페이지에서는 잘 작동하는데 여러 개의 페이지를 열 경우 비활성화된 창에서는 입력이 작동하지 않는 것으로 보여서요. 만약 그게 맞다면, 다른 방법이 있을지도 궁금합니다. 항상 감사합니다.
- 미해결Node.js로 웹 크롤링하기
안녕하세요~ 크롤링 연습과정에서 질문드립니다~
특정 사이트를 크롤링하는 중 휴대폰번호 인증번호를 받는 부분이 있는데요해당 폰으로 전송되는 인증번호를 입력하는 액션을 해야 다음 페이지로 넘어가는 구조인데 이 부분을 어떻게 순차적으로 처리해야될지 조언을 받을수 있을까요 :)
- 미해결Node.js로 웹 크롤링하기
안녕하세요~ puppeteer 실행에 대해 질문이 있습니다!
"2-1 puppeteer 시작하기" 강좌를 보는 중에 아래와 같은 코드를 따라 실행중 오류가 나는 이슈가 있었습니다 const browser = await puppeteer.launch({ headless: false, 오류 메세지도 명확하지 않아 구글링을 해본 결과 옵션값에 executablePath을 추가하여 chrome 파일의 경로를 명시해줬는데 이부분을 제로초님처럼 따로 옵션값을 기입하지 않고 해결할수 있는 방법이 궁금합니다~ const browser = await puppeteer.launch({ headless: false, executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"});