在上一篇文章中已經通過請求的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](http://blog.csdn.net/dianacody/article/details/39716611)
- 前言
- 【java】微博爬蟲(一):小試牛刀——網易微博爬蟲(自定義關鍵字爬取微博數據)(附軟件源碼)
- 【java】微博爬蟲(二):如何抓取HTML頁面及HttpClient使用
- 【java】微博爬蟲(三):庖丁解牛——HTML結構分析與正則切分
- 【java】微博爬蟲(四):數據處理——jsoup工具解析html、dom4j讀寫xml
- 【java】微博爬蟲(五):防止爬蟲被墻的幾個技巧(總結篇)
- 【python】網絡爬蟲(一):python爬蟲概述
- 【python】網絡爬蟲(二):網易微博爬蟲軟件開發實例(附軟件源碼)
- 【python】網絡爬蟲(三):模擬登錄——偽裝瀏覽器登錄爬取過程
- 【python】網絡爬蟲(四):scrapy爬蟲框架(架構、win/linux安裝、文件結構)
- 【python】網絡爬蟲(五):scrapy爬蟲初探——爬取網頁及選擇器
- 打包python文件為exe文件(PyInstaller工具使用方法)