微信公众帐号开发教程第16篇-应用实例之历史上的今天
来源:互联网 发布:2017观潮网络空间论坛 编辑:程序博客网 时间:2024/06/03 23:27
内容概要
本篇文章主要讲解如何在微信公众帐号上实现“历史上的今天”功能。这个例子本身并不复杂,但希望通过对它的学习,读者能够对正则表达式有一个新的认识,能够学会运用现有的网络资源丰富自己的公众账号。
何谓历史上的今天
回顾历史的长河,历史是生活的一面镜子;以史为鉴,可以知兴衰;历史上的每一天,都是喜忧参半;可以了解历史的这一天发生的事件,借古可以鉴今,历史是不能忘记的。查看历史上每天发生的重大事情,增长知识,开拓眼界,提高人文素养。
寻找接口(数据源)
要实现查询“历史上的今天”,首先我们要找到相关数据源。笔者经过搜索发现,网络上几乎没有现成的“历史上的今天”API可以使用,所以我们只能通过爬取、解析网页源代码的方式得到我们需要的数据。笔者发现网站http://www.rijiben.com/上包含“历史上的今天”功能,就用它做数据源了。
开发步骤
为了便于读者理解,我们需要清楚该应用实例的开发步骤,主要如下:
1)发起HTTP GET请求,获取网页源代码。
2)运用正则表达式从网页源代码中抽取我们需要的数据。
3)对抽取得到的数据进行加工(使内容呈现更加美观)。
4)将以上三步进行封装,供外部调用。
5)在公众账号后台调用封装好的“历史上的今天”查询方法。
代码实现
笔者将上述步骤1)、2)、3)中的代码实现封装成了TodayInHistoryService类,并对外提供了getTodayInHistory()方法来获取“历史上的今天”。实现代码如下:
代码解读:
1)27-58行代码是httpRequest()方法,用于发起http get请求,获取指定url的网页源代码。
2)66-92行代码是extract()方法,运用正则表达式从网页源代码中抽取“历史上的今天”数据。
3)111-118行代码是getTodayInHistory()方法,封装给外部调用查询“历史上的今天”。
4)125-128行代码是main方法,用于在本地的开发工具中测试。
5)75-76行代码的作用是判断获取到的“历史上的今天”数据是当天的还是前一天的(因为不能保证www.rijiben.com上的数据一定在凌晨零点准时更新,所以为了保证数据的准确性必须做此判断)。
6)第71行代码是本文的重点,笔者编写的正则表达式规则是“(.*)(<div class=\"listren\">)(.*?)(</div>)(.*)”。正则表达式规则需要根据网页源代码进行编写的,特别是包含“历史上的今天”数据的那部分HTML标签,所以我们先来查看网页源代码。通过httpRequest("http://www.rijiben.com/")方法获取到的网页源代码,与我们通过浏览器访问http://www.rijiben.com/页面再点击右键选择“查看网页源代码”所得到的结果完全一致。我们通过浏览器查看http://www.rijiben.com/的网页源代码,然后找到“历史上的今天”数据所在位置,如下图所示:
从上面的源代码截图中可以看到,我们需要的数据被包含在<div class="listren">标签内,这样就不难理解为什么正则表达式要这样写:
(.*)(<div class=\"listren\">)(.*?)(</div>)(.*)
我们使用括号()将正则表达式规则分成了5组,下面是这些分组的说明:
第1组:(.*)表示网页源代码中<div class="listren">标签之前还有任意多个字符。
第2组:(<div class=\"listren\">)中的反斜杠表示转义,所以该规则就是用于匹配<div class="listren">。
第3组:(.*?)表示在标签<div class="listren">和</div>之间的所有内容,这才是我们真正需要的数据所在。
第4组:(</div>)就是用于匹配<div class="listren">的结束标签。
第5组:(.*)表示在</div>标签之后还有任意多的字符。
掌握了正则表达式规则的含义,就不难理解为什么在extract()方法中全都是在使用m.group(3),因为m.group(3)就表示匹配到数据的第3个分组。m.group(3)的内容如下:
可以看到,通过正则表达式抽取得到的m.group(3)中仍然有大量的html标签、空格、换行、无关字符等。我们要想办法把它们全部过滤掉,第83行代码的作用正是如此。组装文本消息
对于公众帐号的消息回复在本系列教程的第5篇已经讲的很详细了,所以在这里笔者只是简单的组装了文本消息。最后,我们来看一下在微信公众帐号上的演示效果:
说明:与其说这是一篇关于公众帐号应用开发的教程,倒不如说这是一篇关于网页数据爬取的教程。本文旨在为读者开辟思路,介绍一种数据获取方式。当然,这种做法也是有弊端的,当网页改版源代码结构发生变化时,就需要重新改写数据抽取代码。没有做不到,只有想不到!
本文出自柳峰的博客(http://blog.csdn.net/lyq8479)
- [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天 .
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- [040] 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 【凸包性质】 POJ 1228 Grandpa's Estate
- 欢迎使用CSDN-markdown编辑器
- tomcat源码解析(四)--请求过程之路径的匹配
- 有效的XML: DTD(文档类型定义)介绍
- 设置tabBarItem字体颜色和图片颜色
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 使用swipemenulistview实现列表的左右滑动
- 异构医院信息系统(HIS)更换时数据迁移的方法
- poj 1062 dijkstra求最短路变形
- linux中替换所有文件名称和文件内容特定字符命令
- 在windows下运行Hadoop程序的环境配置
- 微信公众帐号开发教程第17篇-应用实例之智能翻译
- Android之LoadMoreListView
- 2016SDAU课程练习四1008 Problem H