在上一篇文章中已經通過請求的url地址把html頁面爬取下來了,這裏分別以網易微博的html和新浪微博的html爲例來分析如何提取微博數據。
一、網易微博解析
相比新浪微博的html結構,網易微博的比較容易明顯地看出來,也容易找到微博數據。查看其html結構不是網頁裏右鍵→“查看網頁源代碼”,那裏的微博正文是以html標籤形式顯示的,而程序實際請求返回得到的html的微博正文是以json格式,這個在控制檯裏輸出看的很清楚。
<script id=”data_searchTweet” type=”application/json”>
…
{
"searchTag":"",
"list": [
{
"id": "-6794651520897765848",
"content": "#數碼精選#【蘋果稱iPad屏幕進灰因中國空氣差,你怎麼看?】 近日,國內出現了一個由300名蘋果用戶組成的維權小組,控告蘋果iPad、iMac等產品屏幕太容易進灰。如果你認爲iPad屏幕易進灰是最讓人鬱悶的事,那就真是小巫見大巫了,蘋果公司的迴應簡直讓人淚奔,“中國空氣質量太差,環境因素導致屏幕進灰”。http://163.fm/OOexvkh",
"albumContent": "#數碼精選#【蘋果稱iPad屏幕進灰因中國空氣差,你怎麼看?】 近日,國內出現了一個由300名蘋果用戶組成的維權小組,…
…
其實解析就是關鍵把要解析對應位置找到,總之對網易微博的解析是個json串解析,這裏可以正則匹配回json,甚至可以直接用正則匹配相應字段,可以匹配userid、content、prettyTime等,最後寫入到txt文件裏。便於項目後期的處理,這裏直接爬取微博正文content,其它像userid、prettyTime等直接在程序裏用Vector<String>處理,這個在系列的第一篇文章裏寫的了,代碼也給出了,此處不再贅述。
最後解析出來正文的txt形式的微博數據:(已用字符串替換的方式去除”content”字段名稱,直接保留正文)
二、新浪微博解析
相比之下新浪的html就要複雜得多,這個在第一篇文章裏談到過,其微博不是以json格式展現而是以javascript形式,每條微博包含在<em>…</em>元素裏。依據關鍵字標紅快速定位:color:red。
首先把em元素及其中間的文本都匹配出來,匹配的正則表達式:<em>.+?color:red.+?</em>,然後再去掉所有<…>的標籤得到utf8,最後用.parseInt(utf8CodeStr, 16)把所有utf8的十六進制換成char。
private Vector<String> getTweet(String htmlPath) throws IOException {
File f = new File(htmlPath);
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
Vector<String> tweets = new Vector<String>();
String html = "";
Pattern p = Pattern.compile("<em>.+?color:red.+?</em>");
String tweetTemp = "";
while(br.readLine() != null) {
html += br.readLine();
}
br.close();
Matcher m = p.matcher(html);
while(m.find()) {
tweetTemp = m.group();
tweets.add(tweetTemp);
}
Vector<String> realTweets = new Vector<String>();
for(int i=0; i<tweets.size(); i++) {
//filt the <...> labels
Pattern pdel = Pattern.compile("<.+?>");
Matcher mdel = pdel.matcher(tweetTemp);
Vector<String> del = new Vector<String>();
while(mdel.find()) {
if(!del.contains(mdel.group())) {
del.add(mdel.group());
}
}
for(int j=0; j<del.size(); j++) {
tweetTemp = tweetTemp.replace(del.get(j), "");
}
StringBuilder sb = new StringBuilder();
Pattern utf8p = Pattern.compile("\\\\u[0-9a-f]{4}"); //utf8 code
Matcher utf8m = utf8p.matcher(tweetTemp);
String utf8codeStr;
while(utf8m.find()) {
utf8codeStr = utf8m.group().substring(2);
sb.append((char)Integer.parseInt(utf8codeStr, 16));//parse to chinese
}
if(!realTweets.contains(sb.toString())) {
//only save different tweets
realTweets.add(sb.toString());
}
}
return realTweets;
}
原創文章,轉載請註明出處:http://blog.csdn.net/dianacody/article/details/39716611