[Node.js] puppeteer와 cheerio로 Instagram 크롤링

Jungyeon·2022년 1월 18일
4

인스타그램 유저 이름을 받아서 해당 유저의 계정 정보들을 크롤링한 코드 ✨

가져올 정보

  • 프로필 : 계정이름, 이름, 프로필 사진, 비공개 계정 여부, id, bio, 게시글 수, 팔로워 수, 팔로잉 수, 웹 사이트
  • 게시글 : 게시글코드, 게시글 이미지, 좋아요수, 댓글 수 , 태그한 유저들, 위치, 캡션

코드


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로 만들어서 테스트해보았다 😄
테스트 해본 결과 크롤링이 잘되는 것을 확인할 수 있다!

profile
나무가 모여 숲을 이룰 때까지 🌱

0개의 댓글