网络爬虫--庖丁解牛,html的结构分析和正则切分

在上一篇文章中已经通过请求的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形式,每条微博包含在元素里。依据关键字标红快速定位:color:red。

首先把em元素及其中间的文本都匹配出来,匹配的正则表达式:.+?color:red.+?,然后再去掉所有<…>的标签得到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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值