1. 程式人生 > >java爬取新浪微博帶有“展開全文”的完整微博文字

java爬取新浪微博帶有“展開全文”的完整微博文字

獲取新浪微博“展開全文”的完整文字

在個人主頁的響應中,這篇微博的表示形式是這樣的:

<div class=\"WB_text W_f14\" node-type=\"feed_list_content\" nick-name=\"Vista看天下\">\n                     【一堂課讓柳傳志大呼過癮,千字長文力挺湖畔大學】11月20日晚,柳傳志釋出千字長文《為湖畔大學正名》,力挺湖畔大學。他提到,在湖畔大學上課,是找到了“知音”,參加各種論壇、座談、講課30餘年,印象最深的就是在湖畔大學上課。柳傳志發自內心地認為,湖畔大學是在培養扶植真正代表中國的企業家, ​​​​...<a target=\"_blank\" href=\"//weibo.com/1323527941/Fw5poB1mb\" class=\"WB_text_opt\" suda-uatrack=\"key=original_blog_unfold&value=click_unfold:4176472908823355:1323527941\" action-type=\"fl_unfold\" action-data

=\"mid=4176472908823355&is_settop&is_sethot&is_setfanstop&is_setyoudao\">展開全文<i class=\"W_ficon ficon_arrow_down\">c</i></a>                                            </div>

在點選“展開全文”的時候,可以看到控制檯新增了這樣一條請求:

請求的格式為:"https://weibo.com/p/aj/mblog/getlongtext?ajwvr=6&"+ action-data +"&__rnd=1511181643288"

rnd代表當前時間的毫秒數,可以不做修改。

在瀏覽器中複製請求網址,得到如下的頁面:

因此利用模擬瀏覽器訪問目標網址的方式,來獲取到這段文字。在這裡利用JSONObject解析json,利用jsoup解析html。

Document doc = (Document) Jsoup.parse(s);
Elements select = doc.getElementsByClass("WB_text W_f14");//微博個人主頁的每一條博文所在的class

//遍歷每一個元素
for (Element element : select) {
	if (element.text().contains("展開全文")) {
                //獲取這個元素所在div中的action-data屬性,來拼接需要訪問的URL
               String attr = element.select(".WB_text_opt").attr("action-data");
		String longTextUrl = "https://weibo.com/p/aj/mblog/getlongtext?ajwvr=6&"+attr+"&__rnd=1511181740414";
                //建立連線
               HttpURLConnection conn = DownLoadPage.connectUrl(longTextUrl);
		// 開啟連線
		conn.connect();
		
		StringBuffer sb = new StringBuffer();
		// 開啟這個網站的輸入流
		InputStream inputStream = conn.getInputStream();
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
		String temp = null;
		while ((temp = bufferedReader.readLine()) != null) {
			sb.append(temp);
		}
                //解碼,否則會出現亂碼的情況
               String decodeUnicode = DownLoadPage.decodeUnicode(sb.toString());
		//System.out.println(decodeUnicode);
		JSONObject json = JSONObject.fromObject(decodeUnicode);
		String ss = json.getString("data");
		String sss = JSONObject.fromObject(ss).getString("html");
		Document docc = (Document) Jsoup.parse(sss);
		System.out.println(docc.text());
		
	}else{
		System.out.println(element.text());
	}	
}