• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

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

19.05.06 17:50 작성 조회수 353

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 걸러냈던 것처럼 저기 태그 특징을 찾아서 걸러내보세요.