인스타그램 유저 이름을 받아서 해당 유저의 계정 정보들을 크롤링한 코드 ✨
const instagramCrawl = async (username) => {
var browser = await puppeteer.launch();
var page = await browser.newPage();
await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36");
await page.evaluate("navigator.userAgent");
var request = await page.goto(`https://www.instagram.com/${username}/channel`, {
waitUntil: 'networkidle2'
});
if (request.status == 404) {
browser.close()
console.log('This account is not exist')
return 'This account is not exist'
} else if (request.status == 429) {
browser.close()
console.log('Too many requests')
return 'Too many requests'
} else {
var page_content = await page.content();
var $ = await cheerio.load(page_content);
var content = $("body script").html();
browser.close();
getData = /window._sharedData = (.*);/g;
data = JSON.parse(getData.exec(content)[1]);
profile = JSON.parse(
JSON.stringify(data.entry_data["ProfilePage"][0]["graphql"]["user"])
);
mediaCount = profile.edge_owner_to_timeline_media["count"];
media = profile.edge_owner_to_timeline_media.edges.map((x) => ({
shortcode: x.node["shortcode"],
display_url: x.node["display_url"],
numberLikes: x.node.edge_liked_by["count"],
numberComments: x.node.edge_media_to_comment["count"],
mentions: x.node.edge_media_to_tagged_user.edges.map((y) => (y.node.user["username"])),
location: x.node["location"],
caption: x.node.edge_media_to_caption.edges.map((z) => (z.node["text"])),
}));
var userInfo = {
username: profile["username"],
full_name: profile["full_name"],
profile_picture: profile["profile_pic_url"],
profile_picture_hd: profile["profile_pic_url_hd"],
is_private: profile["is_private"],
id: profile["id"],
bio: profile.biography,
media: profile.edge_owner_to_timeline_media["count"],
followed_by: profile.edge_followed_by["count"],
follows: profile.edge_follow["count"],
website: profile.external_url,
images: media,
};
return userInfo;
}
}
파일로 저장하는 것보다 나중에 활용하기 좋게 API로 만들어서 테스트해보았다 😄
테스트 해본 결과 크롤링이 잘되는 것을 확인할 수 있다!