微博热搜数据收集及监控的实现

基于Django + Redis + Github Pages实现一个简单的查询助手页面

由Jeza Chen 发表于 September 24, 2019

最近刚刚面完中大的预推免复试,发挥得并不理想,一天天战战兢兢之余得找点活干。打开微博热搜,依然是那几个宝藏男孩登上热搜,突然间想写个程序统计一下微博热搜的趋势、上榜时间之类的,就温习一下Python爬虫和Django之类的知识,开始着手在自己的Github IO上搭一个微博热搜数据收集及监控页面。

>立即体验<

目前的功能

  • 支持每一分钟爬取微博热搜榜,并使用正则表达式提取出榜单数据并存储。
  • 当前使用SQLite轻量级数据库进行数据存储。
  • 使用Django作为后端服务器程序。
  • 使用Redis作为缓存机制。
  • 使用eCharts作为数据可视化处理。
  • 目前图表功能支持“当前微博热搜榜”、“热搜前十趋势折线图”、“热搜前二十名热度图”、“历史前十登顶热搜”、“最近十个登顶热搜”、“历史前20热度热搜”、“历史前20在榜时长热搜”。
  • 支持热搜搜索功能(支持模糊搜索)。
  • 点击当前热搜,可以查看该热搜的历史热度图表以及其他信息。

更新进度

2019-09-27 的更新

  • 新增侧边热搜点击逻辑,点击侧边的热搜后,会弹出该热搜的历史热度图表。

2019-09-26 的更新

  • 新增模糊搜索功能。
  • 修改一些字段,如将部分图表的“每一分钟更新”改成“每隔五分钟更新”(因为采用了缓存)。

2019-09-24 下午的更新

  • 修正排版,将搜索框移至页面上方。
  • 优化布局,当用户一开始没有搜索操作时,隐藏用于显示搜索结果的eCharts图表。当用户点击搜索按钮时,图标会下拉(使用jQuery的slideDown)显示,并且增加一个“收回”按钮供用户关闭该图表。
  • 增加缓冲机制,使用Redis数据库缓存经常访问的数据,加速页面的访问。事实证明页面加载速度快了不少,但也牺牲了一些实时性。
  • 增加一些声明。

2019-09-24 上午的更新

  • 修正一些问题。当用户使用HTTPS协议访问该页面时,会提示警告框告知用户相应情况,指导用户使用HTTP协议访问该页面。

2018-09-23 的更新

  • 增加“历史前20热度的热搜”、“历史前20在榜时长热搜”图表。
  • 增加搜索功能,允许用户使用精确的热搜名查询到该热搜的热度趋势、最高热度、最高排位、在榜时间等等。
  • 修正一些字段,将一些残余的英语单词改成中文词汇。
  • 将后端服务器移至国内的腾讯云服务器,以便爬虫程序不崩溃。

2018-09-22 的更新

  • 完成基本的功能,如“当前微博热搜榜”、“热搜前十趋势折线图”、“热搜前二十热度图”等图表。

待改进的功能

  • 弄懂eCharts的tooltip的用法,讲上榜时间等字段弄上去。
  • 优化服务器传输过来的数据,比如一些重复的字段不要写在json上面了,采用list而不用dict,节省一些带宽。
  • Redis缓存机制也需要优化一下,看看能不能定时刷新缓存,而不用有请求再写入缓存,否则第一个用户会感觉很卡。

一些关键技术点和文档

  • 爬取热搜的正则表达式为:r'<td class="td-01 ranktop">(\d+)</td>\n\s+<td class="td-02">\n\s+<a .*?>(.*?)</a>\n\s+<span>(\d+)</span>'
  • Django ORM对应于原生SQL的group by字段的语句为(举一个例子):HotSpot.objects.values('title').annotate(count=Count('title')).order_by().all()
  • 关于Django聚合查询(aggregation)的详细内容,可以去Django文档-聚合查看。
  • 关于Django的ORM机制的简单用法,可以去Django文档-执行查询查看。
  • 关于eCharts的用法,可以去eCharts官网查看。
  • 关于Redis的简介,可以去菜鸟教程-Redis教程查看。
  • 关于Django-Redis的用法,可以去Django-Redis官方文档查看。
  • 关于Django的缓存框架,可以去Django文档-缓存框架查看。