热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎么用Python来统计知识星球打卡作业

本篇内容主要讲解“怎么用Python来统计知识星球打卡作业”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大

本篇内容主要讲解“怎么用Python来统计知识星球打卡作业”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python来统计知识星球打卡作业”吧!

标题叫“用Python批改知识星球作业”,感觉太标题党了,所以换了个词,不过等AI更强大点是有可能做到的。咱们知识星球,每周都要统计大家的作业完成情况与打卡次数,因为知识星球没有给星主提供运营统计数据,所以,我只能自己动手解决,特别推荐产品和运营人员学点编程,懂点爬虫,因为互联网人都是靠数据说话的。

我们的目标是统计出最近一周在星球里的打卡与作业完成情况,所以我们先要想办法拿到数据,再对数据进行统计分析。因为知识星球提供了 PC 浏览器版本,数据的抓取我们直接从 Chrome 浏览器找入口。

第一步:思路分析

爬虫获取数据就是利用程序模拟浏览器发起网络请求,将数据采集回来,所以,我们先来分析网络请求在浏览器里面是怎样的。微信扫描登录知识星球 https://wx.zsxq.com/dweb/ 后, 浏览器右键「检查」,打开开发者模式选择 「Network」就可以看到浏览器发出的每个网络请求,选择你要进行统计的圈子,你会看到有很多请求。

怎么用Python来统计知识星球打卡作业

这些请求全部是和该圈子相关的,在这个阶段首先你要对整个往页的数据有个大概了解,比如在该页面提供的功能有圈子的基本介绍、星主的基本信息、中间是帖子列表,左侧是圈子列表,此时你需要根据每个请求的返回结果做出判断

groups 请求的数据对应页面左边的圈子列表。

怎么用Python来统计知识星球打卡作业

topics?count=20 正是我们要找的帖子数据的请求接口

怎么用Python来统计知识星球打卡作业


找到了获取数据的请求接口后,我们先来对返回的数据结构了解一下

{
   "topic_id": 48551524482128,
   "group": {
       "group_id": 518855855524,
       "name": "Python之禅和朋友们"
   },
   "type": "talk",
   "talk": {
       "owner": {
           "user_id": 15551441848112,
           "name": "叶宪",
           "avatar_url": "https://file.zsxq.19.jpg"
       },
       "text": "我尝试了一下,8位0-9纯数字的MD5暴力破解花了约140秒。"
   },
   "likes_count": 0,
   "comments_count": 0,
   "rewards_count": 0,
   "digested": false,
   "sticky": false,
   "create_time": "2018-06-05T23:39:38.197+0800",
   "user_specific": {
       "liked": false,
       "subscribed": false
   }
}

根据接口返回的结果,分析得出每次请求返回的结果包含了20条帖子数据,每条帖子的数据结构也非常清晰,type 表示帖子的类型,talk 是普通的帖子,还有一种叫 solution,表示作业,talk 字段里面指定了发帖者的信息,和所发的内容,还有创建时间。这是一个嵌套的json 字典结构,用 MongoDB 来直接存储这些数据是最方便的,不需要构建 Schema,直接作为一个文档(json)存到数据库就可以,方便后面根据条件进行过滤分组统计。

第二步:代码实现

思路清晰后,写代码其实是很快的,Mongodb 的安装这里就不介绍了,参考网上的教程可以解决。 只需要两个依赖库就可以搞定。

pip install pymongo
pip install requests

现在获取数据的接口找到了,存储数据的方案也确定了,可以正式开始撸代码实现了。先来确定如果我们用代码来模拟浏览器发送获取帖子数据的请求,我们需要提供给哪些请求数据。

怎么用Python来统计知识星球打卡作业


再来详细看这个请求的细节信息,确定了完整的 url 和请求方法 GET,以及很重要的请求头信息。头信息我们把它封装成字典放在get方法中。

def crawl():
   url = "https://api.zsxq.com/v1.10/groups/518855855524/topics?count=20"
   res = requests.get(url, headers=headers) # get 请求
   topics = res.json().get("resp_data").get("topics")
   for i in topics:
       print(i.get("talk").get("text")[:10])
       db.topics.insert_one(i)

现在你还只是获取了前20条数据,要想获取所有的帖子,还需要分页查询,这时你需要使用浏览器加载更多数据来查看请求里面的分页参数是什么。你会发现它是使用上一次请求返回的数据中最后一条帖子的创建时间作为分页参数 end_time 象服务器获取的,所以我们把代码改成:

def crawl(url):
   res = requests.get(url, headers=str_to_dict(headers))
   topics = res.json().get("resp_data").get("topics")
   if len(topics) <= 1:
       return
   for i in topics:
       print(i.get("talk").get("text")[:10])
       db.topics.insert_one(i)
   else:
       last_time = i.get("create_time")
       crawl("https://api.zsxq.com/v1.9/groups/518855855524/topics?count=20" + "&end_time=" + parse.quote(last_time))

我使用递归的方式将这个圈子里面所有的帖子全部爬下来。

怎么用Python来统计知识星球打卡作业

第三步:数据统计

数据拿到了,现在正是可以进入分析统计阶段了。

我们需要用到 MongoDB 的聚合功能,根据每个人的发帖数进行分组排名,并指定匹配查询条件(我查询的是时间大于某个指定的日期),有人说,是不是我还需要先去学完 MongoDB 才能做统计了。其实也不,你可以借用强大的搜索引擎来帮助你怎么做这这种复杂的操作。

话说回来,你还是要对MongoDB有基本的了解和掌握简单的操作,快速入门后才知道怎么去搜索你要的答案,否则也是无从下手。

def statics():
   # 打卡
   talk = db.topics.aggregate(
       [
           {"$match": {"create_time": {"$gte": "2018-05-28T00:00:14.202+0800"}}},
           {
               "$group": {
                   "_id": {
                       "user_id": "$talk.owner.user_id",
                       "name": "$talk.owner.name",
                   },
                   "count": {"$sum": 1},
               }
           },
           {"$sort": {"count": -1}},
       ]
   )

这是我根据刷选条件,根据帖子的创建时间大于等于指定时间,再根据发帖者的id和名字进行分组统计,最后按照降序进行排列。 type 为 solution 的作业帖子也使用同样的方式,即可统计出来。最终写入 cvs 文件,展示出来的效果是:

怎么用Python来统计知识星球打卡作业


到此,相信大家对“怎么用Python来统计知识星球打卡作业”有了更深的了解,不妨来实际操作一番吧!这里是编程笔记网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


推荐阅读
  • django rest framework(一)django连接mongo配制方法
    原创文章转载请标明出处环境配置使用mongoengine操作数据库pipinstalldjangopipinstalldjangorestframeworkpipinstallmo ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本文介绍了协程的概念和意义,以及使用greenlet、yield、asyncio、async/await等技术实现协程编程的方法。同时还介绍了事件循环的作用和使用方法,以及如何使用await关键字和Task对象来实现异步编程。最后还提供了一些快速上手的示例代码。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • MySQL中如何使用MD5加密
    这篇文章主要介绍“MySQL中如何使用MD5加密”,在日常操作中,相信很多人在MySQL中如何使用MD5加密问题上存在疑惑,小编查阅了各式资料,整理出简 ... [详细]
  • config设置源 使用pip_最全的 pip 使用指南,50 % 你可能都没用过~
    所有的Python开发者都清楚,Python之所以如此受欢迎,能够在众多高级语言中,脱颖而出,除了语法简单,上 ... [详细]
  • MongoDB的upsert在并行程序中应该注意的问题
    题图Oct.12th,2018最近使用python的多进程编程来解决一个MongoDB的数据库。这个程序中,每一个进程都要对数据库中的某些数据进行升级。假如目标数据不存在的话,则需 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 我正在为我的Flask网络应用程序使用geopy库。我想将我从模态(html ... [详细]
  • 用Python在Windows上安装MongoDB原文 ... [详细]
  • 一.升级mongo到4.0以上安装mongodb4.0参考了这篇文章步骤1:在终端输入GPK码sudoapt-keyadv--keyserverhkp:keyserver.ubun ... [详细]
author-avatar
你的拥吻像情歌一样凄美_207
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有