前言
环境使用
- python 3.9
- pycharm
模块使用
- requests
模块介绍
模块安装问题:
- 如果安装python第三方模块:
- 安装失败原因:
想法和思路
编写程序:
我们可以编写一个程序,用于帮助我们核对qn大学习学习名单。这个程序可以根据我们输入的学习名单,自动检查名单中的每个人是否已经完成了学习任务。我们可以使用编程语言(如Python)来编写这个程序。
但是,我们发现这个方法太麻烦,这个和我一个一个对比,有什么区别呢。我就想到了直接构建列表就好了啊。省时省力。
功能实现
我们首先,我们爬取班级学习的名单,然后,和班级所有同学的名单做对比,程序自动输出未完成青年大学习的名单,如何操作,看我一步一步的操作。
获取大学习期数
我们这里获取大学习的期数,我们就可以不用修改table_name的值了,我们这里默认的是最新一期的大学习。
url = 'http://dxx.ahyouth.org.cn/api/peopleRankList?level1=%E7%9B%B4%E5%B1%9E%E9%AB%98%E6%A0%A1'
url_res = requests.get(url)
name = url_res.json()['list'][0]['name']
table_name = url_res.json()['list'][0]['table_name']
print("你正在查询",name,"青年大学习\n")
运行我们的程序,今天是第10期的大学习,说明,我们的程序没有问题的,我们继续往下走。
获取名单
接下来,就是最重要的一步,构建下面的地址。找到自己班级大学习的名单的地址,大家会使用开发者工具的话直接找到下面的地址,不会使用也没有关系,我们可以直接修改下面level后面的值。
url = 'http://dxx.ahyouth.org.cn/api/peopleRankStage'
data = {
'table_name': table_name,
'level1': '直属高校',
'level2': '某某大学',
'level3': '数理学院',
'level4': '数学类2101',
}
res = requests.get(url, params=data)
level1是直属高校,我们这里可以不用修改。
level2是大家学校的名字,大家填自己学校的名字就好。
level3是大家学院的名字,大家填自己学院的名字就好。我们这里以安庆师范大学为例,大家需要注意的是,填写名字要和我们看到的名字一模一样。尤其是班级的名字。后面,就不过多赘述。
level4是大家班级的名字,大家填自己班级的名字就好。
我们接下来以"数学类2101"为例,讲解后面的代码。我们这里调用 requests
库中的 get()
方法,传入这个 URL 和 data
字典,可以获取服务器返回的结果。这个结果是一个字典,其中包含了查询的结果,就是学习的名单。
我们发现返回res.text就会乱码,我们可以转码,或者直接json解决。
html_lists = res.json()['list']['list']
这段代码把 res.json()
返回的是一个包含多个字典的列表,每个字典代表一个用户的信息。['list']['list']
表示字典中的第一个键对应的列表,即用户的名字和学习时间。
我们看看效果:
名单对比
接下来,也就是我们最重要的环节,对比我们的名单。
我们接着看看后面的程序:
for html_list in html_lists:
username = html_list['username']
yixue_list.append(username)
我们接下来循环处理 html_lists
列表中的每个字典,获取其中的 username
键,将其添加到 yixue_list
列表中。这样,循环结束后,yixue_list
列表中就包含了班级所有学习了大学习的名字。
weixue_list = list(set(list_all) - set(yixue_list))
if not weixue_list:
print("全部完成青年大学习")
else:
print("未完成的名单如下\n", weixue_list)
我们这段代码使用了 Python 的集合(set)和列表(list)操作。
首先,它使用 set
将所有用户的名字转换为集合,去除了重复的名字。然后,它使用 set
将 yixue_list
中的名字转换为集合,再使用 set
将两个集合的差转换为新的集合。
接着,它检查新集合是否为空,如果为空,则说明所有用户都已经完成了大学习,程序输出一条消息。否则,它输出未完成青年大学习同学的名单,并将其打印出来。
我们这里把我们班级所有同学的名字都放到一个list_all
列表里面。到这里,我们的功能就实现了。
list_all = ['张三', '李四', '王二麻子']
效果
到这里,我们的程序就实现了,回头,我把程序封装一下,大家就可以直接使用了。
我们把py程序封装成exe文件,我们看看运行效果吧。
完整代码
下面我把完整的代码放在下面,大家有什么不懂的可以在评论区留言。
import requests
yixue_list = []
list_all = ['张三', '李四', '王二麻子']# 班级同学名单
url = 'http://dxx.ahyouth.org.cn/api/peopleRankList?level1=%E7%9B%B4%E5%B1%9E%E9%AB%98%E6%A0%A1'
url_res = requests.get(url)
name = url_res.json()['list'][0]['name']
table_name = url_res.json()['list'][0]['table_name']
print("你正在查询", name, "青年大学习\n")
url = 'http://dxx.ahyouth.org.cn/api/peopleRankStage'
data = {
'table_name': table_name,
'level1': '直属高校',
'level2': '学校名字',
'level3': '学院名字',
'level4': '班级名字',
}
res = requests.get(url, params=data)
html_lists = res.json()['list']['list']
print(html_lists)
for html_list in html_lists:
username = html_list['username']
yixue_list.append(username)
weixue_list = list(set(list_all) - set(yixue_list))
if not weixue_list:
print("全部完成青年大学习")
else:
print(len(weixue_list))
print("未完成的名单如下\n", weixue_list)