20242122 2024-2025-2《Python公选课》实验四报告
课程:《Python程序设计》
班级: 2421
姓名: 苏锦泷
学号:20242122
实验教师:王志强
实验日期:2025年5月14日
必修/选修: 公选课
(一)实验内容
编写一个程序,一部游戏的名称以后,如果该游戏存在于Steam游戏平台,则输出它的价格,否则提示该游戏不在Steam平台上。
(二)实验过程以及结果
1、编写程序的过程
(1)导入库
在终端导入requests库,输入如下命令:
pip install requests
然后可以在python程序里面运用库:
import requests
(2)函数 get_price
函数原型是
def get_price(game_name):
作用是接受一个字符串类型的变量作为游戏名称,然后返回游戏价格
利用try-except进行异常处理
try语句:
search_url = "https://api.steampowered.com/ISteamApps/GetAppList/v2/"
response = requests.get(search_url, timeout=15)
app_list = response.json()['applist']['apps']
先提供了要访问的目标网站,把网站以字符串的形式储存到变量search_url中。然后请求访问目标网站,请求超过timeout=15秒未响应会返回异常ConnectionError,或者Timeout。最后会利用json函数确认解析异常。这一条语句是我向ai询问程序修改建议的时候他告诉我的,当可能返回HTML错误页面、响应内容为空或者返回的数据因编码问题出现乱码时,可以得到明确的错误原因反馈,知道程序运行失败是哪里出了问题,从而提高了程序的健壮性。

比如这张图片,就报告了程序遇到的错误是连接超时。
精确地匹配游戏名称:
app['name'].lower() == game_name.strip().lower())
这句话在等式左侧把Steam应用名称转换为全小写,等式右侧去除用户输入的首尾空格并转为小写。可以消除用户输入与Steam官方名称的大小写和空格差异。app for app in app_list if语句是遍历app_list,逐个检查我输入的应用名称是否匹配。
获取价格详情:
detail_url = f"https://store.steampowered.com/api/appdetails"
params = {
'appids': target_app['appid'],
'cc': 'CN',
'filters': 'price_overview'
}
把查询游戏详情的API地址以字符串的形式储存到变量sdetail_url中,参数appids是目标游戏的唯一ID,这里临时地设置一个变量cc来储存国家代码,因为查询时国家代码会影响货币单位和区域定价。filters作为过滤字段仅返回价格信息,可以减少响应数据量。
处理价格信息并返回结果:
通过查询资料,我了解到,Steam API的响应格式为 {appid: {"success": bool, "data": ...}}。如果配对成功,就从API响应中提取游戏的定价信息,就像price_info = detail_data[str(target_app['appid'])]['data'].get('price_overview')如果游戏为免费或无定价信息price_info为None。get('price_overview')可以安全地获取字段。
如果需要处理API请求失败的情况,当success字段为False时,表示游戏数据无效。等会在主程序根据None结果提示“未找到该游戏”。
(3)主程序逻辑
input_name = input("\n请输入游戏名称(输入q退出):").strip()
if input_name.lower() == 'q':
print("程序结束")
break
获取输入的游戏名称或退出主循环。
result = get_price(input_name)
if result:
print(f"\n【{result['游戏名称']}】价格信息:")
print(f"当前售价:{result['当前售价']} \n")
else:
print("未找到该游戏,请检查游戏名称")
调用get_price函数,传入输入的游戏名称,查找成功则获得有价格信息的字典,不成功就会获得none,然后处理查询结果并询问是否继续执行循环(略)。
2、实验结果
https://www.bilibili.com/video/BV1E3EBzNES7/?spm_id_from=333.1387.homepage.video_card.click
3、源代码
import requests
def get_price(game_name):
try:
search_url = "https://api.steampowered.com/ISteamApps/GetAppList/v2/"
response = requests.get(search_url, timeout=15)
app_list = response.json()['applist']['apps']
target_app = next((app for app in app_list
if app['name'].lower() == game_name.strip().lower()), None)
if not target_app:
return None
detail_url = f"https://store.steampowered.com/api/appdetails"
params = {
'appids': target_app['appid'],
'cc': 'CN',
'filters': 'price_overview'
}
detail_res = requests.get(detail_url, params=params, timeout=15)
detail_data = detail_res.json()
if detail_data[str(target_app['appid'])]['success']:
price_info = detail_data[str(target_app['appid'])]['data'].get('price_overview')
return {
"游戏名称": target_app['name'],
"当前售价": f"¥{price_info['final'] / 100:.2f}" if price_info else "免费",
"货币单位": price_info['currency'] if price_info else 'CNY'
}
return None
except Exception as e:
print(f"查询出错: {str(e)}")
return None
if __name__ == "__main__":
while True:
input_name = input("\n请输入游戏名称(输入q退出):").strip()
if input_name.lower() == 'q':
print("程序结束")
break
result = get_price(input_name)
if result:
print(f"\n【{result['游戏名称']}】价格信息:")
print(f"当前售价:{result['当前售价']} \n")
else:
print("未找到该游戏,请检查游戏名称")
while True:
choice = input("\n继续查询?(y/n): ").lower()
if choice in ['y', 'n']: break
print("请输入y/n")
if choice == 'n':
print("程序结束")
break
(三)对课程的总结体会和建议
Python语言是我学习的第二门计算机语言。有了C语言的学习基础和经验,我能快速地接受简单的python知识。在python学习过程中,我喜欢将python知识和c语言知识相似的部分进行归类和对比,这个过程给了我很大的学习乐趣,同时也激励我继续对这些语言深入学习,并且有了学习其他语言的兴趣和信心。我发现,Python语言有很多比C语言更丰富的内容和延伸。让我印象最深刻得学习内容是列表、元组和字典相关知识的学习。刚开始我很疑惑为什么仅仅是对元素的列举就要利用这么多的功能;后来我才明白他们分别可以在动态数据管理场景、固定配置场景和快速查找场景中大显身手。另外一个震撼我的Python功能是爬虫。它将个人的Python程序和丰富的互联网连接起来,极大地拓宽了我的视野。这也是我这次实验决定将爬虫作为期末结课作业的原因。当然,在学习Python的过程中也遇到了一些困难,在进行实验三socket的时候我作为客户端一直无法连接同伴的移动端,在我们反复确认以后才发现程序中的变量address使用的IP地址是错误的,我们在控制台处利用ipconfig确定client和server的ip地址,替换以后才获得了正确的结果。调试程序的时候有多么的烦躁,程序成功运行才会获得多大的成就感。总而言之,整个Python的学习经历不仅是知识的积累,更是信心、耐心和好奇心的培养。
对于课程的建议,我个人觉得老师在讲课的时候可以更多的把原来的C语言知识和新的Python语言知识的相似之处结合起来讲述,这样更利于接受。在后面讲授socket技术和爬虫技术的时候,我不是很能跟上老师的授课节奏,希望老师讲解一些陌生的语句和变量的时候节奏能更慢一些。最后是大模型的运用,上课的时候就算当时已经理解了,但是下来一部分内容会遗忘,完成作业的时候我会询问大模型有关的基础知识,在写完代码却出现错误的时候我也会向ai寻求修改建议,这些建议很多时候从新奇的角度提供了解决问题的思路,所以程序中出现大模型的痕迹也并不是完全不可接受。
很高兴能参与到本学期Python公选课的学习!
浙公网安备 33010602011771号