facebook评论采集开发

facebook有复杂的请求机制,在实际开发爬虫的过程中非常的麻烦,对其http的构造,有N个动态参数,让人很难摸清,因此使用模拟的方式采集是很好的一个选择

在事先知道facebook帖子连接的情况下,我设计了如下的评论采集代码:

package com.fb.ajax;import net.sf.json.JSONObject;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.bean.header;
import com.util.pageDown;
import com.util.redis.JedisUtil;public class CrawlerTask implements Runnable{public final static byte[] redisKey_wemedia = "quene_facebookajax_task".getBytes();public final static byte[] redisKey_wemedia2 = "quene_facebookajax_task_zb".getBytes();JedisUtil ju=new JedisUtil();private final static Logger logger = LoggerFactory.getLogger(CrawlerTask.class);CloseableHttpClient httpClient = HttpClients.createDefault();public void run() {ChromeOptions options=new ChromeOptions();//options.addArguments("--headless");options.addArguments("--no-sandbox");Map<String, Object> prefs = new HashMap<String, Object>();prefs.put("profile.managed_default_content_settings.images", 2);//options.addArguments("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36");options.setExperimentalOption("prefs", prefs);WebDriver driver= new ChromeDriver(options);for(int i=0;;i++){byte[] bytes = ju.rpop(redisKey_wemedia);if(bytes!=null){String msg=new String(bytes);JSONObject json=JSONObject.fromObject(msg);String url=json.getString("url");//手机端System.out.println(url);ArrayList<header> list=new ArrayList<header>();list.add(new header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"));String mhtml=pageDown.Pageinfo(url, list, "utf-8");String zbtxt=Jsoup.parse(mhtml,url).select("div.story_body_container").text();if(zbtxt.indexOf("直播了视频")!=-1){System.out.println("该帖子是直播视频,跳过处理!");ju.lpush(redisKey_wemedia2, bytes);continue;}url=url.replace("m.facebook.com", "www.facebook.com");driver.get(url);try {Thread.sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}String html=driver.getPageSource();if(html==null||html.length()<1){}else{if(html.indexOf("需要安全验证")!=-1){System.out.println("需要安全验证!");{ju.lpush(redisKey_wemedia, bytes);try {Thread.sleep(15000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}continue;}}if(Jsoup.parse(html,url).select("#contentArea").text().indexOf("直播了视频")!=-1){continue;}((JavascriptExecutor) driver).executeScript("window.scrollTo(0,document.body.scrollHeight)");sleep(1500L);// 获取 moveToElement 方法 ,元素定位到想要移上去的元素上 //expanding_cta_close_buttonWebElement cwe= driver.findElement(By.xpath("//*[@id=\"expanding_cta_close_button\"]"));if(cwe!=null){cwe.click();}sleep(2000L);String formpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form";WebElement targetElement= driver.findElement(By.xpath(formpath));((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", targetElement);sleep(1000L);html=driver.getPageSource();Document doc=Jsoup.parse(html,url);Elements es=doc.select("form.commentable_item.collapsed_comments>div>div>div>div>div>span>span._1n9k>a");//判断是否有用户表情,如果有就进行触发System.out.println("用户表情有:"+es.size()+"个");for(int k=0;k<es.size();k++){String xpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[2]/div[1]/div/div[1]/span/span["+(k+1)+"]/a";WebElement ftargetElement= driver.findElement(By.xpath(xpath));Actions action=new Actions(driver);action.moveToElement(ftargetElement).perform();sleep(1500L);}//处理点赞,评论,转发的各个ajax请求,让鼠标指针悬停//点赞数Elements dzes=doc.select("form.commentable_item.collapsed_comments>div>div>div>div>div>a");if(dzes.size()==1){String dzxpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[2]/div[1]/div/div[1]/a/span[2]/span/span";WebElement ftargetElement= driver.findElement(By.xpath(dzxpath));Actions action=new Actions(driver);action.moveToElement(ftargetElement).perform();sleep(1500L);}//评论数String txt=doc.select("form.commentable_item.collapsed_comments>div>div>div>div").text().trim();if(txt.indexOf("条评论")!=-1){String plsxpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[2]/div[1]/div/div[3]/span[1]/a";WebElement ftargetElement= driver.findElement(By.xpath(plsxpath));Actions action=new Actions(driver);action.moveToElement(ftargetElement).perform();sleep(1500L);}boolean s1=txt.indexOf("次分享")!=-1;boolean s2=txt.indexOf("条评论")!=-1;//转发数if(s1&&!s2) //有转发没评论{String zfsxpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[2]/div[1]/div/div[3]";WebElement ftargetElement= driver.findElement(By.xpath(zfsxpath));Actions action=new Actions(driver);action.moveToElement(ftargetElement).perform();sleep(1500L);}//转发数if(s1&&s2) //有转发有评论{String zfsxpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[2]/div[1]/div/div[3]/span[2]/a";WebElement ftargetElement= driver.findElement(By.xpath(zfsxpath));Actions action=new Actions(driver);action.moveToElement(ftargetElement).perform();sleep(1500L);}//翻评论操作if(txt.indexOf("条评论")!=-1){//出来评论栏处的数据,进行点击操作String clickpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[2]/div[1]/div/div[3]/span[1]/a";//点击System.out.println("执行点击操作!");WebElement we= driver.findElement(By.xpath(clickpath));if(we!=null){((JavascriptExecutor) driver).executeScript("arguments[0].click();", we);}//通过设置让数据显示为全部评论//_21iq uiPopover _6a openToggler selectedhtml=driver.getPageSource();for(int j=0;j<100;j++){sleep(2000L);//  //*[@id="u_0_1e"]/div/div[3]/div[2]/div/a/div/spanString shtml=driver.getPageSource();String stxt=Jsoup.parse(shtml).select("div._4sxd").text();if(stxt.indexOf("更多评论")!=-1)// if(stxt.indexOf("more comments")!=-1){System.out.println(j+"有更多的评论需要点击!");String fxpath="/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]/div[2]/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div[2]/form/div/div[3]/div[2]/div/a/div/span";boolean fcf=check(driver, fxpath);if(fcf){WebElement fwe= driver.findElement(By.xpath(fxpath));if(fwe!=null){((JavascriptExecutor) driver).executeScript("arguments[0].click();", fwe);}}else{break;}}else{break;}}}}}else{try {Thread.sleep(1300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("账户采集任务队列无数");}}}/*** 判断元素是否存在* @param driver* @param xpath* @return*/public Boolean check(WebDriver driver,String xpath) {try {driver.findElement(By.xpath(xpath));return true;} catch (Exception e) {// TODO: handle exceptionreturn false;}}public static void MouseHoverByJavaScript(WebElement targetElement,WebDriver driver){Actions action=new Actions(driver);action.moveToElement(targetElement).perform();}public static String getAjaxPage(String url,WebDriver dr){dr.get(url);dr.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}String html=dr.getPageSource();if(html==null||html.length()<1){logger.error("phantomjs请求失败:"+url);}return html;}public void sleep(long time){try {Thread.sleep(time);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

代码中,quene_facebookajax_task队列是存储的facebook帖子连接,例如:https://m.facebook.com/story.php?story_fbid=1001222893371130&id=379819005511525&tn=-R

可以仔细研究上述代码,非常简单,代码能自动的对评论进行翻页

目前我研究了Facebook采集有一段时间了,收集了境外Facebook账户数据几十亿条,准备进行国外的社交数据研究,也开始对这些账号的历史帖子进行采集,有兴趣的伙伴可以一起研究,有需要数据的研究机构可以发邮件到:lotenr@foxmail.com

facebook评论采集开发相关推荐

  1. Python 采集 Facebook 评论插件、留言外挂程序

    实现时间:2021-05-30 实现难度:★★★☆☆☆ 实现目标:采集 Facebook 评论插件.留言外挂程序的所有评论. 完整代码:https://github.com/TRHX/Python3- ...

  2. Java+MySQL实现评论功能设计开发

    Java+MySQL实现评论功能设计开发 一.背景 项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这个项目学习了很多,要写下来的有很多,先从评论功能开始吧.由于项目需要增加评论功能,之 ...

  3. 如何删除Facebook评论

    Facebook拥有海量的用户,越来越的商家借助其平台进行业务营销,也取得了很多骄人的成绩,但是也许你借助此平台仅仅是为了业绩获取销量而已并不想要要一些列的客户评论,有好评也有差评,可是这些是差评,你 ...

  4. Python爬虫大众点评字体加密评论采集!听说这个网站很难?

    前序 最近在研究反爬虫策略,写了一个大众点评评论采集的程序,途中遇到了一些坑有感而发分享给大家, 大众点评是基于css机制实现的字体加密技术来阻碍我的进行准确数据的抓取 正文 图1 根据图1我们可以看 ...

  5. # JAVA实现评论功能设计开发

    JAVA实现评论功能设计开发 实现类似微信朋友圈的评论楼层 思路: 1.嵌套型的评论方式所需要的数据结构是树状型的,评论多起来的话层级结构会变得很复杂 实现原理为在评论表之中添加一个[parent_i ...

  6. 覃超:Facebook的项目开发流程和工程师的绩效管理机制

    覃超:Facebook的项目开发流程和工程师的绩效管理机制 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992350&am ...

  7. 最牛ks短视频评论采集软件

    简介: 最牛ks视频评论采集软件可以帮助用户快速采集ks视频的评论,提供支持自定义采集视频评论,支持导出女或男,同时支持导出指定评论内容UID或抖音号,而且还可以自定义搜索指定用户,继而采集该用户作品 ...

  8. 大数据信息资料采集:网易云音乐QQ音乐歌曲基本信息及评论采集爬虫

    大数据信息资料采集:网易云音乐QQ音乐歌曲基本信息及评论采集 数据采集满足多种业务场景:适合产品.运营.销售.数据分析.政府机关.电商从业者.学术研究等多种身份职业. 舆情监控:全方位监测公开信息,抢 ...

  9. 抖音评论采集接口_抖音接口

    抖音评论采集 {"msg": "","code": 200,"data": {"log_pb": { ...

最新文章

  1. java什么是函数式编程,Java 函数式编程(一)初识篇
  2. ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包
  3. 兰州谋定百合品牌-农业大健康·万祥军:功能性农业产业脱贫
  4. 人生影响最大的三位老师
  5. android 8.0 调系统拍照_Android通知栏微技巧,8.0系统中通知栏的适配
  6. 正确使用计算机说课稿,《初识计算机》说课稿
  7. 修改了模板文件tpl如何立即生效_Views视图与模板
  8. 深入理解redux之从redux源码到react-redux的原理
  9. Hyperledger Fabric CA的命令行用法
  10. 个人vscode插件配置全记录
  11. 迈特斯机器人_WIE-R红外热像视频内窥镜
  12. tensorflow之train.get_checkpoint_state
  13. jpress连接不上mysql_win10+jdk+mysql+tomcat+jpress环境搭建与部署
  14. 推荐一些高质量的自学网站
  15. 使用python把txt文件转为csv文件并且利用自己想要的分割符号
  16. python强制删除文件夹_对Python各种删除文件失败的处理方式-强制删除文件
  17. 【学英语】老友记S1E1
  18. linux系统使用宝塔来搭建内部gitlab教程
  19. 《深入理解计算机系统》实验四Architecture Lab
  20. TOC制约理论的本质及其在生产、项…

热门文章

  1. mapbox 天地图 底图切换组件
  2. 如何从CDN加载jQuery?
  3. Vuex状态管理-mapState、mapMutations、mapActions
  4. 电脑桌面的图标都像被选中了,变蓝的处理方法
  5. 魔兽服务器重置稀有刷新,魔兽世界8.0重制阿拉希稀有坐标和分布图 重制阿拉希稀有坐标...
  6. 2019 腾讯数据分析实习生提前批笔试题
  7. 纸鸢|工业路由器的定位功能有什么作用
  8. 【C语言】C语言三角形打印
  9. 如何做好一个扁平化的ppt
  10. win server修改网卡MAC地址