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
在點選“展開全文”的時候,可以看到控制檯新增了這樣一條請求:
請求的格式為:"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()); } }