微博模拟登录获取cookis,配置采集深度,采集一条微博转发关系页面,同时解析页面,生成一条微博的传播图,数据集可做微博影响力分析和传播分析

gitthub:https://github.com/czeze/WeiboCrwlZEZE

package main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.MalformedURLException;
import java.util.List;
import java.util.Random; import org.apache.http.client.CookieStore;
import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.util.Cookie;
import com.sun.jna.Native.ffi_callback; import Util.FileWriteUtil;
import Util.Id2MidUtil; /**
*
* @ClassName: SourceWeiboCrawler
* @Description: 一条微博信息采集,输入微博URL
* @author Zeze
* @date 2016年4月10日 上午10:39:50
*
*/
public class WeiboCrawler2 { private static String Url = "http://weibo.com/5892492312/DpsRXpOyG?from=page_1005055892492312_profile&wvr=6&mod=weibotime&type=comment";
private static int CrawlDeep = 18;// 采集深度
private static int SleepTime = 1000;// 采集间隔时间
private static int NumCookies=7;//cookies数目 private static Logger logger = Logger.getLogger(WeiboCrawler2.class);
private static String cookiePath = "F:/WeiBo/cookie/cookie.file";// cookie目录
private static String outputpath = "F:/WeiBo/Data/";// 输出目录
private static String destfile = "F:/WeiBo/Data/";// 采集保存目录
private static int cnt = 0; public static void main(String[] args) { String mid = GetMid(Url);// D8hxnrQdM
String uid = GetUid(Url);// outputpath = outputpath + mid + "/";// 输出目录
destfile = destfile + mid + "/msg" + mid + ".csv";// 采集保存目录 File file2 = new File(outputpath);
if (!file2.exists())
file2.mkdirs();
String wString = "tzmid,zid,zname,zmid,mid,ztext,zurl,zsource,zzan,ztime,deep";
StringBuffer sBuilder = new StringBuffer();
sBuilder.append(wString + "\r\n");
FileWriteUtil.WriteDocument(destfile, sBuilder.toString()); // 获得页数
int PageNum = GetPageNum(mid, uid, 0, CrawlDeep); for (int i = 1; i <= PageNum; i++) {

(mid, uid, Integer.toString(i), 0, CrawlDeep);
try {// 采集间隔
Thread.sleep(SleepTime);
} catch (InterruptedException e) {
logger.error(e);
return;
}
}
} webClient.closeAllWindows();
return Num;
} //转发内容
if (info.select("span[class=cmt]").text().equals("")) {// 不是转发的内容
text = info.select("span[class=ctt]").text();// 正文 }
// 时间
Elements time = info.select("span[class=ct]");
//转发
Elements rt = doc.select("div").select("span[id=rt]");
//评论
Elements ct = doc.select("div").select("span:contains(评论)");
//赞
Elements zan = doc.select("div").select("span:contains(赞)"); text = text.trim();
name = BoZhu.get(0).text().trim();
timeStr = time.text().trim();
ZhuanFaNum = rt.text().trim().substring(2).replace("[", "").replace("]", "");
PinlunNum = ct.text().trim().substring(3).replace("[", "").replace("]", "");
zanNum = zan.get(0).text().trim().substring(2).replace("[", "").replace("]", ""); if (!rt.text().contains("["))//判断是否有转发
ZhuanFaNum = "0";
if (!ct.text().contains("["))
PinlunNum = "0"; System.out.println("英文消息ID: " + mid);
System.out.println("数字消息ID: " + Nummid);
System.out.println("用户ID: " + uid);
System.out.println("博主: " + name);
System.out.println("正文内容: " + text); String zname = null;// 转发的用户名
String zid = null;// 转发的用户ID
String zzan = null;// 点赞数
String zmid = null;// 转发的消息id
String ztime = null;// 转发时间
String zsource = null;// 来源
String ztext = null;// 转发的内容
String zurl = null; if (!rt.text().contains("[")) {
System.out.println("没有转发");
try {// 采集间隔1s
Thread.sleep(SleepTime);
} catch (InterruptedException e) {
logger.error(e);
}
return;
} if (doc.select("[id=pagelist]").text().contains("页")) {//转发页数
String pnum = doc.select("[id=pagelist]").get(0).text();
pnum = pnum.substring(pnum.indexOf("/") + 1).replace("页", "");
System.out.println("转发页数:" + pnum);
} for (Element result : RTList) {// 解析列表
// 点赞数
zzan = result.select("span[class=cc]").text();
if (zzan.equals("")) {// 过滤没有点赞标签
continue;
} zzan = zzan.trim().substring(1).replace("[", "").replace("]", ""); if (result.select("a").size() > 0) {
zname = result.select("a").get(0).text();// 转发的用户名
zid = result.select("a").get(0).toString();// 转发的用户id
if (zid.indexOf("u") == 10) {// 正常的用户id
zid = zid.substring(zid.indexOf("\">") - 10, zid.indexOf("\">"));
} else {
zid = zid.substring(zid.indexOf("/") + 1, zid.indexOf("\">"));
}
}
if (result.text().contains("查看更多热门"))
continue; // 转发时间和来源
String tmp = result.select("span[class=ct]").text();
ztime = tmp.substring(0, tmp.indexOf("来自"));
zsource = tmp.substring(tmp.indexOf("来自") + 2);
text.indexOf("赞"));
} zurl = "http://weibo.cn/repost/" + zmid + "?uid=" + zid;
String tzmid = new Id2MidUtil().Uid2Mid(zmid); // 消息ID,用户ID,用户名,屏幕名,转发消息ID,消息内容,消息URL,来源,赞数,发布时间,层数
// tzmid,zid,zname,zmid,mid,ztext,zurl,zsource,zzan,ztime,deep
cnt++;
String wString = tzmid + "," + zid + "," + zname + "," + zmid + "," + Nummid + "," + ztext + "," + zurl + ","
+ zsource + "," + zzan + "," + ztime + "," + deep;
System.out.println(cnt + ":" + wString); StringBuffer sBuilder = new StringBuffer();
sBuilder.append(wString + "\n");
FileWriteUtil.WriteDocument(destfile, sBuilder.toString()); }
} }
System.out.println("采集到的转发数目:" + cnt);
return;
} // 解析第二页开始
public static void parserPage(HtmlPage page, String mid, String uid, int deep, int crawldeep) {
String html = page.getWebResponse().getContentAsString();
Document doc = Jsoup.parse(html); String zname = null;// 转发的用户名
String zid = null;// 转发的用户ID
String zzan = null;// 点赞数
String zmid = null;// 转发的消息id
String ztime = null;// 转发时间
String zsource = null;// 来源
String ztext = null;// 转发的内容
String zurl = null; mid = new Id2MidUtil().Uid2Mid(mid);// 消息ID
Elements RTList = doc.select("div[class =c]");
for (Element result : RTList) {
// 点赞数
zzan = result.select("span[class=cc]").text();
if (zzan.equals("")) {// 过滤没有点赞标签
continue;
} zzan = zzan.trim().substring(1).replace("[", "").replace("]", ""); if (result.select("a").size() > 0) {
zname = result.select("a").get(0).text();// 转发的用户名
zcontinue; // 转发时间和来源
String tmp = result.select("span[class=ct]").text();
ztime = tmp.substring(0, tmp.indexOf("来自"));
zsource = tmp.substring(tmp.indexOf("来自") + 2); // 转发的消息id
zmid = result.select("span[class=cc]").toString();
zmid = zmid.substring(zmid.indexOf("attitude") + 9, zmid.indexOf("attitude") + 18); // 转发的内容
ztext = result.text();
if (ztext.contains("//@")) {
ztext = ztext.substring(ztext.indexOf(":") + 1, ztext.indexOf("//@"));
} else if(ztext.contains(":")&&ztext.contains("赞")){
ztext = ztext.substring(ztext.indexOf(":") + 1, ztext.indexOf("赞"));
}
deep;
System.out.println(cnt + ":" + wString); StringBuffer sBuilder = new StringBuffer();
sBuilder.append(wString + "\n");
FileWriteUtil.WriteDocument(destfile, sBuilder.toString()); if (deep < crawldeep) {// 采集深度
int PageNum = GetPageNum(zmid, zid, deep + 1, crawldeep);
for (int i = 1; i <= PageNum; i++) {
System.out.println("当前采集深度"+deep);
(zmid, zid, Integer.toString(i), deep + 1, crawldeep);
try {// 采集间隔1s
Thread.sleep(SleepTime);
} catch (InterruptedException e) {
logger.error(e);
return;
}
} }
}
System.out.println("采集到的转发数目:" + cnt);
return;
} // 写入文件
public static void SavePage(HtmlPage page, String path) { File file2 = null;
file2 = new File(path); if (file2.exists())
logger.warn("outfile exit!");
else {
FileOutputStream outputStream;
try {
outputStream = new FileOutputStream(file2);
outputStream.write(page.getWebResponse().getContentAsString().getBytes());
outputStream.close();
} catch (FileNotFoundException e) {
logger.error(e);
} catch (IOException e) {
logger.error(e);
}
}
} // 随机获取cookies
public static CookieStore GetCookieStore() {
CookieStore cookieStore = null;
File file = new File(cookiePathAppendRandom());
if (file.exists()) {
FileInputStream fin = null; ObjectInputStream in;
try {
in = new ObjectInputStream(fin);
cookieStore = (CookieStore) in.readObject();
in.close();
} catch (IOException e) {
logger.error(e);
} catch (ClassNotFoundException e) {
logger.error(e);
}
} else {
logger.warn("CookiePath doesn`t exit !!!");
}
return cookieStore;
} private static String cookiePathAppendRandom() {
Random random = new Random();
return cookiePath + random.nextInt(NumCookies);
} // http://weibo.com/1713926427/D8hxnrQdM?type=repost#_rnd1460261627854
public static String GetUid(String url) {
int index = url.indexOf("weibo.com") + 10; } public static String GetMid(String url) {
int index = url.indexOf("weibo.com") + 21;
return url.substring(index, index + 9);
} }

微博转发关系采集,可拓展关键字采集,评论采集(Java版)的更多相关文章

  1. HipHop算法:利用微博互动关系挖掘社交圈

    /* 版权声明:可以任意转载,转载时请务必标明文章原始出处和作者信息 .*/                  CopyMiddle: 张俊林 TimeStamp:2012年3 月 在微博环境下,如何 ...

  2. PAT Basic 1069. 微博转发抽奖(20)

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  3. PAT 乙级 1069 微博转发抽奖(20) C++版

    1069. 微博转发抽奖(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 小明PAT考了满分,高兴之余决定 ...

  4. PAT 1069 微博转发抽奖(20)(代码+思路+测试点4)

    1069 微博转发抽奖(20 分) 小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行 ...

  5. PAT 1069 微博转发抽奖

    https://pintia.cn/problem-sets/994805260223102976/problems/994805265159798784 小明 PAT 考了满分,高兴之余决定发起微博 ...

  6. PAT——1069. 微博转发抽奖

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  7. PAT 1069. 微博转发抽奖(20)

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  8. PAT(B) 1069 微博转发抽奖(Java)

    题目链接:1069 微博转发抽奖 (20 point(s)) 题目描述 小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包.请你编写程序帮助他确 ...

  9. PAT Basic 1069 微博转发抽奖 (20 分)

    小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数 M(≤ 1000). ...

随机推荐

  1. MySQL学习笔记——多表连接和子查询

    多表连接查询 # 返回的是两张表的乘积 SELECT * FROM tb_emp,tb_dept SELECT COUNT(*) FROM tb_emp,tb_dept # 标准写法,每个数据库都能这 ...

  2. OC-id、构造方法

    id 简介 万能指针,能指向任何OC对象,相当于NSObject * id类型的定义 typedef struct objc_object { Class isa; } *id; 使用 // 注意:i ...

  3. iOS 加急申请每个开发者必须会

    加急申请原来做过很多次,有成功,有拒绝(最终还是成功,一次不行,被拒绝后多来几下即可,直到成功).但是听朋友说了一件事情,很是不解:他们希望能快速审核上线,在淘宝里面找加速商店,首次上线12000元, ...

  4. 关于IOC的思考

    SOLID面向对象的五个设计原则对于开发人员非常重要,其身影在任何大中型软件项目中随处可见,建议必须掌握并灵活应用.此五原则分别为:     单一职责原则(Single Resposibility P ...

  5. 自定义列表dl的使用原因和场合

    为什么要使用自定义列表? dl和ol, ul的区别? 要正确理解dl的意图, 理解 dl的 "语义" ! 才能知道为什么要使用dl, 以及在什么时候/ 什么情况下使用 dl? dl ...

  6. [整理]VS2013常用插件

    VS2013常用插件 (工欲善其事,必先利其器.VS2013全攻略(技巧,快捷键,插件)[http://developer.51cto.com/art/201404/437282_all.htm] 代 ...

  7. JavaScript-也来谈--闭包

    闭包,以前研究过,可能是当初理解的不够透彻,现在又忘了,(给自己一个台阶下`-...)毕竟js一直没怎么用, 为了防止自己过段时间再忘了,写篇重要的闭包重点, 这样时不时也能温习下知识,不用每次想了解 ...

  8. C# 添加excel批注

    public bool AddComent(object coment, int row, int column) { try { Excel.Range range = myExcel.get_Ra ...

  9. XML理解

    XML:页面之间传递数据,跨平台传递,核心标签 HTML:超文本标记语言,核心标签 <xml version='1.0'>版本1.0<Nation> <one> & ...

  10. linux下svn命令使用大全

    最近经常使用svn进行代码管理,这些命令老是记不住,得经常上网查,终于找了一个linux下svn命令使用大全:1.将文件checkout到本地目录 svn checkout path(path是服务器 ...