在上一篇文章中已经通过请求的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

【网络爬虫】【java】微博爬虫(三):庖丁解牛——HTML结构分析与正则切分的更多相关文章

  1. 【网络爬虫】【java】微博爬虫(二):如何抓取HTML页面及HttpClient使用

    一.写在前面 上篇文章以网易微博爬虫为例,给出了一个很简单的微博爬虫的爬取过程,大概说明了网络爬虫其实也就这么回事,或许初次看到这个例子觉得有些复杂,不过没有关系,上篇文章给的例子只是让大家对爬虫过程 ...

  2. 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫

    python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...

  3. 【网络爬虫】【java】微博爬虫(五):防止爬虫被墙的几个技巧(总结篇)

    爬虫的目的就是大规模地.长时间地获取数据,跟我们正常浏览器获取数据相比,虽然机理相差不大,但总是一个IP去爬网站,大规模集中对服务器访问,时间一长就有可能被拒绝.关于爬虫长时间爬取数据,可能会要求验证 ...

  4. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)

    一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...

  5. 【网络爬虫】【java】微博爬虫(四):数据处理——jsoup工具解析html、dom4j读写xml

    之前提到过,对于简单的网页结构解析,可以直接通过观察法.手工写正则解析,可以做出来,比如网易微博.但是对于结构稍微复杂点的,比如新浪微博,如果还用正则,用眼睛一个个去找,未免太麻烦了. 本文介绍两个工 ...

  6. 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)

    一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账 ...

  7. Golang 网络爬虫框架gocolly/colly 三

    Golang 网络爬虫框架gocolly/colly 三 熟悉了<Golang 网络爬虫框架gocolly/colly一>和<Golang 网络爬虫框架gocolly/colly二& ...

  8. 【网络爬虫】【python】网络爬虫(二):网易微博爬虫软件开发实例(附软件源码)

    对于urllib2的学习,这里先推荐一个教程<IronPython In Action>,上面有很多简明例子,并且也有很详尽的原理解释:http://www.voidspace.org.u ...

  9. 老李分享:网页爬虫java实现

    老李分享:网页爬虫java实现   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...

随机推荐

  1. 每天进步一点点——mysql——Percona XtraBackup(innobackupex)

    一.  简单介绍 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非堵塞地备份(对于MyISAM的备份相同须要加表锁).Xt ...

  2. OpenCV for Python 学习笔记 一

    本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http:/ ...

  3. [javase学习笔记]-8.7 静态代码块

    这一节我们看一个比較特殊的概念,那就是静态代码块. 前面我们也提到过代码块,就是一段独立的代码空间.那么什么是静态代码块呢?说白了,就是用statickeyword修饰的代码块. 我们来看一个样例: ...

  4. Matlab---傅里叶变换---通俗理解(二)

    1.用Matlab进行傅立叶变换 FFT是离散傅里叶变换的高速算法,能够将一个信号变换到频域.有些信号在时域上是非常难看出什么特征的,可是假设变换到频域之后,就非常easy看出特征了.这就是非常多信号 ...

  5. c结构体里的数组与指针

    /* 訪问成员数组名事实上得到的是数组的相对地址.而訪问成员指针事实上是相对地址里的内容 */ struct buf_str { int length; char buf[0]; }; struct ...

  6. javascript 连续赋值(转载)

    先看一个例子   ● var a = {n:1}; ● var b = a; ● a.x = a = {n:2}; ● console.log("a.x: " + a.x); // ...

  7. poj 1163 The Triangle &amp;poj 3176 Cow Bowling (dp)

    id=1163">链接:poj 1163 题意:输入一个n层的三角形.第i层有i个数,求从第1层到第n层的全部路线中.权值之和最大的路线. 规定:第i层的某个数仅仅能连线走到第i+1层 ...

  8. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. kong

    https://docs.konghq.com/install/centos/ wget https://bintray.com/kong/kong-community-edition-rpm/dow ...

  10. intelliJ IDEA springMVC 搭建配置

    1.添加参数 archetypeCatalog=internal