微信群总能看到各种新闻简报,心想能否写一个爬虫每天采集些一句话新闻,让程序来生成这种简报。经过一番对比选定了界面新闻,理由是:1.大部分新闻标题概括性很强,符合一句话新闻的特点; 2. 类别丰富,国内、国际、科技、商业、体育等等都有; 3.没有太多主旋律新闻(☭的喉舌那样的你懂的)和震惊体之类的标题党新闻。
技术选型是:eggjs + request-promise + cheerio + mongoose
用egg的定时任务,每小时爬一次当天的新闻,增量地存到MongoDB。生成简报时,查出当天新闻随机摘12条即可,如果当天新闻条目数不足(比如早晨五六点的时候),就把昨天新闻拿来凑一下。
简报做好了,感觉太单薄,又加了所在城市天气预报功能,接入心知天气API。需要继发调用2个接口查询访客所在城市的天气预报:根据IP查城市名、根据城市名查天气预报。由于心知天气API(免费版)调用频率有限制,加上考虑到每次生成简报的远程HTTP请求开销,肯定要将这两个接口得到的数据存库呀。做法是:IP地址为1.2.3.4的客户访问服务时,要将1.2.3.0这个网段IP地址及所在城市存库,下次1.2.3.99的IP来访问,直接从本地数据库查到其所在城市,这样可以少发很多请求到心知天气。天气预报接口同理,只不过本地存的是城市今明两天的天气,作用一样是为了减少调用心知API的频率和次数。
继续充实简报内容,从CSDN下载了“历史上的今天”、“名人名言”、“成语词典”数据库,随机展示3条“历史上的今天”条目和1条名人名言及成语条目,成语后期还加上了汉字描红框线的样式。在简报末尾加上了年度使用进度条,简报头部加上了农历日期和节气的展示。给简报增加一个切换夜间模式的小图标。加上统计功能。加上一键复制全文功能。完事儿 :D
1
2
3
4
5
6
7
8
9
10
11
12
13
14用法:
[GET] http://news.topurl.cn ---> 得到带有所在城市天气预报的HTML页面
[GET] http://news.topurl.cn/api ---> 得到带有所在城市天气预报的JSON报文
[GET] http://news.topurl.cn/?ip=117.152.202.3 ---> 得到带有武汉天气预报的HTML页面
[GET] http://news.topurl.cn/api?ip=117.152.202.3 ---> 得到带有武汉天气预报的JSON报文
[GET] http://news.topurl.cn/api?ip=xiajbxie ---> 得到带有齐齐哈尔天气预报的JSON报文(笑)
API特性:
1、支持传入ip参数,获取指定ip地址所在城市的天气预报. 例如http://news.topurl.cn/api?ip=101.68.1.1
2、每日18点前播报当日天气,18点后预报明日天气
3、calendar.term代表节气
4、支持https
5、单个ip15秒内最多调用15次