묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Node.js로 웹 크롤링하기
puppeteer waitFor 이제 못쓰나요?
puppeteer waitFor 이제 못쓰나요? 자동완성어로도 안 만들어지고, 예제처럼 반영도 안돼요waitForTimeout 이걸 써야 반영되는데, 이것도 이제 지원안한다는 문구가 뜨네요
-
미해결Node.js로 웹 크롤링하기
cheerio deprecated
const crawler = async() => { await Promise.all(records.map( async(r) => { const response = await axios.get(r.링크) if(response.status === 200){ const html = response.data const $ = cheerio.load(html) const text = $('.score.score_left .star_score').text() console.log(r.제목,'평점',text) } } )) }1-4 axios-cheerio로 첫 크롤링하기 강의중 const $ = cheerio.load시 cheerio에 빗금이 처지며 deprecated라는 표시가 뜹니다. 무시하고 그냥 해도 결과는 나오지만 구글링을 해봐도 deprecated대신 사용할수있는게 없어 그냥 해야하나 아니면 다른 방법으로 대체해야하나 궁금합니다.package.json은 아래와 같습니다."dependencies": { "axios": "^1.1.3", "cheerio": "^1.0.0-rc.12", "nodemon": "^2.0.20" }
-
미해결Node.js로 웹 크롤링하기
for of와 Promise.allSettled 질문
exports.test = async () => { const work = xlsx.readFile(path.join(__dirname, "youtuber.xlsx")); const workData = work.Sheets.url; const result = xlsx.utils.sheet_to_json(workData); let array = []; for (const [i, e] of result.entries()) { array.push(e) } try { const browser = await puppeteer.launch({ headless: false, args: ["--window-size:1920,1080"], }); await Promise.allSettled(array.map(async (e) => { try { const page = await browser.newPage(); await page.setUserAgent(agent); await page.setViewport({ width: 1080, height: 1080, }); await page.goto(e.url, { waitUntil: "networkidle2", }); await page.waitForSelector("#channel-header-container img"); const result = await page.evaluate(() => { const channelName = document.querySelector("#text-container yt-formatted-string").textContent; const image = document.querySelector("#channel-header-container img").getAttribute("src"); const subscriber = document.querySelector("#meta yt-formatted-string[id=subscriber-count]").textContent; const activity = document.querySelector("#items ytd-grid-video-renderer:first-child #metadata-line span:nth-child(2)").textContent; return { channelName, image, subscriber, activity, } }); console.log(result); } catch (err) { console.log(err); } })); } catch (err) { console.error(err); } } for of 반복문은 처음과 끝의 코드가 종료가 돼야 다음 반복문을 돌고 Promise.allSettled는 모든 작업을 동시에 처리해서 둘의 차이는 순서 보장되냐 안되냐의 차이로 배웠습니다. 위 코드는 Promise.allSettled로 동시에 10개의 사이트에 접속하여 태그들을 긁고 리턴하는 함수입니다. 태그의 textContent는 모두 긁는데 img 태그의 src 값은 array.map에 가장 처음(0) 사이트만 긁어옵니다. waitForSelector를 사용하여 기다렸는데도 비동기라서 그런지 원인을 잘 모르겠습니다.(for of 문은 됩니다)
-
미해결Node.js로 웹 크롤링하기
readline 으로 사용자 입력을 기다린 후 puppeteer 코드 실행하기
코드 설명 : 사용자의 입력을 받아 입력 데이터를 검색하는 프로그램 11번가 주소로 이동 > 검색창 기다리기 > inputText() 로 입력받기 (inputText.js) > searchText에 저장된 입력데이터를 typing하기 > 검색버튼 누르기 첫번째 사진 15번부터 문제가 생긴듯 합니다. 문제는 입력을 기다리기 전에 밑에 코드들을 시작합니다. 이것을 해결하기 위해 readline-sync npm을 사용해 보았지만 인코딩오류(찾아봤지만 해결이 안됨)때문에 안되더라구요ㅠㅠ 1. 사용자가 입력할 때까지 기다리기 2. 입력한 데이터로 검색하기 이 기능을 구현하려면 어떻게 해야 할까요???
-
미해결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"});