메뉴 건너뛰기

프로그래밍


페이스북 개인 담벼락에 올라가 있는 포스트들의 좋아요 수를 크롤링 하는 예제 코드입니다.


개인적인 연구(?)를 위해 작성해 보았고 관련된 글은 이곳에서 보실 수 있습니다.

이 코드는 해당 글의 2탄을 위해 작성되었습니다. ㅋ


* 직접 해 보신분들은 아시겠지만 facebook graph API는 개인 담벼락의 포스트나 좋아요 수등을 제공해주지 않습니다.

이에, 크롤링을 통해 개인 담벼락에 있는 포스트들의 좋아요 수를 수집하는 코드입니다.


<사용하기>

먼저, Selenium과 webdriver 의 설치가 필수 입니다.

이를 위해 이 링크를 참고해 주세요.


그리고, 아래 코드에서 주석의 설명을 따라 수정해 주시면 됩니다.

수집된 좋아요 수는 out.txt 파일에 페북 개인 아이디와 함께 기록됩니다.


package org.airpage.facebook.scrap;

import java.util.List;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class FacebookPostScrapper {
	public static String fbID = "FACEBOOK ID";
	public static String fbPW = "FACEBOOK PW";	
			
	public static int maxCount = 50; //gathering 'Like' count for each ID
	public static ArrayList<String> fbIDList = new ArrayList<String>();
	
	public static void main(String[] args) {		
		
		System.setProperty("webdriver.chrome.driver", "D:\\DEVTOOLS\\chromedriver.exe"); //path for chromedriver
		WebDriver _driver = new ChromeDriver();
		_driver.get("https://www.facebook.com/");
				
		WebElement loginID = _driver.findElement(By.id("email"));		
		WebElement loginPassword = _driver.findElement(By.id("pass"));
		
		loginID.sendKeys(fbID);
		loginPassword.sendKeys(fbPW);
		loginPassword.submit();		
		
		//수집하고자 하는 담벼락 id
		fbIDList.add("airpage");
		
								
		for(String fbid : fbIDList) {			
			startScrap(_driver, fbid);			
		}
							
		System.out.println("드라이버 종료");
		_driver.close();
	}
	
	public static void startScrap(WebDriver _driver, String fbid) {
		_driver.get("https://www.facebook.com/" + fbid); 
		
		JavascriptExecutor jse = (JavascriptExecutor) _driver;
		jse.executeScript("scrollBy(0,2500);");		
		jse.executeScript("scrollBy(0,2500);");		

		int tryCount = 0;
		int allCount = 0;
		int retCount = 0;
		
		ArrayList<String> likeIDList = new ArrayList<String>();
		
		while (true) {
			retCount = getPosts(_driver, fbid, allCount, likeIDList);
			if (retCount == 0) {
				tryCount++;
				System.out.println("tryCount :" + tryCount);
				
				if (tryCount >= 5) //더이상 새로운 post가 없음
					break;
			} else {
				tryCount = 0;
			}

			allCount += retCount;							
			System.out.println("allCount :" + allCount);
			
			if(allCount >= maxCount) break;
			
			jse.executeScript("scrollBy(0,2500);");					
			jse.executeScript("scrollBy(0,2500);");
		}
	}

	public static void writeLikecount(String fbid, String likecount) {
		BufferedWriter out;
		try {
			out = new BufferedWriter(new FileWriter("out.txt", true));
			String s = fbid + ":" + likecount;
			out.write(s);
			out.newLine();						
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public static int getPosts(WebDriver _driver, String fbid, int currentCount, ArrayList<String> likeIDList) {
		int count = 0;
		List<WebElement> posts = null;			

		try {
			posts = _driver.findElements(By.cssSelector("span[data-tooltip-uri^='/ufi/reaction/tooltip/?ft_ent_identifier']"));			

			for (WebElement post : posts) {			
				String likeAttribute = post.getAttribute("data-tooltip-uri");

				//if (likeAttribute != null && likeAttribute.contains("/ufi/reaction/tooltip/?ft_ent_identifier=")) {
					if (likeIDList.contains(likeAttribute) == false) {
						String likeCount = post.getText();
						if (likeCount != null) {
							System.out.println("==> Like Count:  " + likeCount);																				
							count++;																				
							writeLikecount(fbid, likeCount);
							
							if ((currentCount + count) >= maxCount) break;
						}
						likeIDList.add(likeAttribute);
					}
				//}
			}
		}
		catch (StaleElementReferenceException e) {
			System.out.println("EXCEPTION");		
		}

		return count;
	}
}





번호 제목 글쓴이 날짜 조회 수
공지 [TIP] PYTHON 에서 "UnicodeDecodeError: 'cp949' codec can't decode byte 0xe2 in position 6987: illegal multibyte sequence" 오류 날때... [48] 파이팅건맨 2016.02.20 108619
공지 [TIP] R에서 페이스북 페이지 정보 크롤링 하기 [6] 파이팅건맨 2017.02.11 15769
공지 [TIP] TensorFlow를 윈도우에서 사용하기 (A way to use TensorFlow on Windows) [3] 파이팅건맨 2016.04.16 14700
145 [TIP] The function size must be used with a prefix when a default namespace is not specified 오류 해결하기 파이팅건맨 2017.08.02 2240
» [TIP] 페이스북 개인 담벼락의 좋아요수 크롤링하기 파이팅건맨 2017.07.15 1291
143 [TIP] 자바스크립트와 PHP코드간에 암호화 통신하기 (Encrypt with Javascript, Decrypt with PHP) [2] 파이팅건맨 2017.03.16 3649
142 [TIP] GUNMAN의 영화 점수 테이블을 이용한 딥러닝 예제 파이팅건맨 2017.02.15 876
141 [TIP] R에서 페이스북 페이지 정보 크롤링 하기 [6] 파이팅건맨 2017.02.11 15769
140 [TIP] 네이버 영화 정보와 전문가 평점 얻어오기 파이팅건맨 2017.02.10 6159
139 [TIP] 네이버 오픈 API를 로컬 PC에서 호출하기 파이팅건맨 2017.02.01 2846
138 [TIP] php로 기상청에서 제공하는 기상정보 API 호출하기 파이팅건맨 2017.01.17 8367
137 [TIP] node 에서 Basic authentication 인증과 함께 http, https 요청하기 파이팅건맨 2016.09.01 1023
136 [TIP] node의 lambda-local 테스트 팁 파이팅건맨 2016.08.19 700
135 [TIP] 데이터를 Node에서 암호화하고 PHP에서 복호화 하기 파이팅건맨 2016.08.19 742
134 [TIP] Docker상의 Syntaxnet 결과 포맷을 수정하기 파이팅건맨 2016.08.07 1867
133 [TIP] SyntaxNet을 Windows에서 실행하기 [1] 파이팅건맨 2016.05.25 891
132 [TIP] TensorFlow를 윈도우에서 사용하기 (A way to use TensorFlow on Windows) [3] 파이팅건맨 2016.04.16 14700
131 [TIP] 파이선으로 TED에서 가장많이 사용된 단어들 줄세우기 파이팅건맨 2016.04.03 1692
130 [TIP] 파이선에서 구글 스프레드시트 사용하기 [5] 파이팅건맨 2016.03.27 4765
129 [TIP] 파이선에서 리스트를 사용하는 재미있는 예제 파이팅건맨 2016.03.15 884
128 [TIP] PYTHON 에서 "UnicodeDecodeError: 'cp949' codec can't decode byte 0xe2 in position 6987: illegal multibyte sequence" 오류 날때... [48] 파이팅건맨 2016.02.20 108619
127 [TIP] 퍼포먼스를 높여주는 몇가지 코딩 예 파이팅건맨 2016.01.22 591
126 [TIP] JQuery와 PHP로 이미지 파일을 업로드 하는 간단한 소스 (How to upload image file on PHP server by using JQuery) 파이팅건맨 2015.04.03 11709
위로