강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

이재형님의 프로필 이미지
이재형

작성한 질문수

Node.js로 웹 크롤링하기

8-4. 더보기 버튼과 반복 크롤링

반복 크롤링이 2개까지만 되고 시행이 되지 않습니다.

작성

·

449

0

강의 중 내용과 다른것은 다음처럼 친구 추천이 뜨는데 혹시 이문제로 작동이 되지 않는 걸까요? 친구 추천 다음 게시글부터 크롤링 되지 않습니다.

중간에 다음과 같이 회원님을 위한 추천이 뜨고,

 

크롤링 콘솔창에는 이런 오류가 뜨는데요.

Error: Evaluation failed: TypeError: Cannot read property 'querySelector' of null

    at __puppeteer_evaluation_script__:4:19 입니다.

코드는 다음과 같습니다.

const puppeteer = require("puppeteer");
const dotenv = require("dotenv");

const db = require("./models");
dotenv.config();

const crawler = async () => {
try {
await db.sequelize.sync();
const browser = await puppeteer.launch({
headless: false,
args: ["--window-size=1920,1080", "--disable-notifications"],
userDataDir: "/Users/fullyalive/Project/userData"
});
const page = await browser.newPage();
await page.setViewport({
width: 1920,
height: 1080
});
await page.goto("https://instagram.com");
if (await page.$(`a[href="/${process.env.IN_ID}/"]`)) {
console.log("✅ 이미 로그인 되어 있습니다.");
} else {
await page.waitForSelector("button.L3NKy"); // instagram 내 페이스북 로그인버튼
await page.click("button.L3NKy");
await page.waitForNavigation(); // facebook 로그인 창 리다이렉트를 기다린다.
await page.waitForSelector("#email"); // 해당 태그의 존재 여부를 확인
await page.type("#email", process.env.FB_ID);
await page.type("#pass", process.env.FB_PW);
await page.waitForSelector("#loginbutton");
await page.click("#loginbutton");
console.log("🙆🏻‍ 로그인 완료");
}
let result = [];
let prevPostId = "";
while (result.length < 10) {
const moreButton = await page.$("button.sXUSN"); // 더보기 버튼 클릭
if (moreButton) {
await page.evaluate(btn => btn.click(), moreButton);
}
const newPost = await page.evaluate(() => {
const article = document.querySelector("article:first-child");
const postId =
article.querySelector(".c-Yi7") &&
article.querySelector(".c-Yi7").href;
const name = article.querySelector("h2").textContent;
const img =
article.querySelector(".KL4Bh img") &&
article.querySelector(".KL4Bh img").src;
const content =
article.querySelector(".C4VMK > span") &&
article.querySelector(".C4VMK > span").textContent;
return {
postId,
name,
img,
content
};
});
if (newPost.postId !== prevPostId) {
console.log(newPost);
if (!result.find(v => v.postId === newPost.postId)) {
result.push(newPost);
}
}
prevPostId = newPost.postId;
await page.waitFor(1000);
await page.evaluate(() => {
window.scrollBy(0, 800);
});
}

await page.waitFor(3000);
await page.close();
await browser.close();
} catch (e) {
console.error(e);
}
};

crawler();

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아, 저기 친구 추천 부분때문에 에러가 나는게 맞습니다. sponsored 걸러냈던 것처럼 저기 태그 특징을 찾아서 걸러내보세요.

이재형님의 프로필 이미지
이재형

작성한 질문수

질문하기