인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

이재형's profile image
이재형

asked

Web Crawling with Node.js

8-4. More button and repeat crawling

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

Written on

·

428

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();
웹-크롤링nodejspuppeteerjavascript

Answer 1

1

zerocho님의 프로필 이미지
zerocho
Instructor

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

이재형's profile image
이재형

asked

Ask a question