메뉴 건너뛰기

프로그래밍


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


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

이 코드는 해당 글의 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;
	}
}


profile
제목 날짜
[TIP] PYTHON 에서 "UnicodeDecodeError: 'cp949' codec can't decode byte 0xe2 in position 6987: illegal multibyte sequence" 오류 날때... 2 2016.02.20
[TIP] JQuery와 PHP로 이미지 파일을 업로드 하는 간단한 소스 (How to upload image file on PHP server by using JQuery) 2015.04.03
[TIP] TensorFlow를 윈도우에서 사용하기 (A way to use TensorFlow on Windows) 3 2016.04.16
홈페이지 주인님 소스에 대한 질문입니다 1 2009.05.12
필요한 모든 파일 합쳐서 하나의 .exe 파일 만들기 2003.08.27
프로세스간 통신을 위한 간단한 팁 2000.08.14
타이머 관련해서 질문 드립니다. 1 2005.10.20
클라이언트에서 서버에 접속시 버전체크후 다운받는루틴 1 2005.10.12
추가질의좀...VESA 확장 바이오스 함수로 화면 전화은 어떻게... 1 2005.06.08
질문]winCE Platformbuilder에관하여 1 2005.05.16
제로보드에 GUNCLIENT 컨트롤 적용하는 방법 2003.12.30
전처리기(Preprocessor) 갖고 놀기 2000.08.03
자작 커널을 위한 인터럽트 벡터 수정 (EZ-2410보드 대상) 2013.05.04
인터넷 익스플로러 툴바(툴밴드) 관련 소스링크 2003.07.23
인터넷 가능한지 알아보기 2004.05.12
위치추적 1 2013.04.06
온라인게임에서 CRC check 차단하는법, 1 2005.12.18
어디에 있는지... 1 2003.07.30
알고리즘 구현...(1) 1999.06.05
시리얼통신관련 질문..(응답속도에 관해..) 1 2006.04.03
시리얼 통신 DCB 셋팅 1 2005.10.05
소스코드에 대한 추가질문입니다^^ 1 2009.05.26
비주얼 C++과 MASM 사용하기 2000.09.07
태그 목록
위로