Python自动化抓取Keep运动数据:从入门到实战

张开发
2026/4/16 22:35:32 15 分钟阅读

分享文章

Python自动化抓取Keep运动数据:从入门到实战
1. 为什么需要自动化抓取Keep运动数据作为一个健身爱好者我每天都会用Keep记录自己的运动数据。但时间久了发现一个问题这些宝贵的数据都散落在App里想做个长期分析特别麻烦。每次都要手动截图、复制粘贴效率低不说还容易出错。后来我发现用Python写个自动化脚本就能解决这个问题。通过爬虫技术我们可以定期把Keep里的运动数据自动抓取下来存到本地数据库或Excel里。这样不仅能避免手动操作的繁琐还能对数据进行更深入的分析。举个例子我有个朋友坚持跑步半年但体重一直没变化。后来我们把他的Keep跑步数据导出分析发现平均配速太稳定身体已经适应了这个强度。调整训练计划后效果立竿见影。这就是数据的力量。2. 准备工作环境搭建与工具选择2.1 Python环境配置首先确保你安装了Python 3.6或以上版本。我推荐使用Anaconda来管理Python环境它能很好地处理各种依赖关系。安装完成后我们需要几个关键库pip install requests beautifulsoup4 pandas seleniumrequests用于发送HTTP请求beautifulsoup4解析HTML内容pandas处理和分析数据selenium模拟浏览器操作后面会讲到它的用途2.2 开发者工具的使用现代浏览器都内置了开发者工具按F12打开这是我们分析网页结构的利器。以Chrome为例打开Keep网页版并登录按F12打开开发者工具切换到Network选项卡刷新页面观察加载的资源特别注意XHR类型的请求这些往往包含了我们需要的数据接口。找到返回运动数据的接口后右键选择Copy as cURL可以获取请求的完整信息。3. 登录Keep的两种方法3.1 直接使用账号密码登录Keep的登录接口做了加密处理直接模拟登录比较复杂。我测试发现最稳定的方式是使用Selenium模拟浏览器操作from selenium import webdriver from selenium.webdriver.common.by import By import time driver webdriver.Chrome() driver.get(https://www.gotokeep.com/login) # 输入账号密码 driver.find_element(By.NAME, phoneNumber).send_keys(你的手机号) driver.find_element(By.NAME, password).send_keys(你的密码) # 点击登录按钮 driver.find_element(By.CSS_SELECTOR, .login-btn).click() # 等待登录完成 time.sleep(5) # 获取cookies cookies driver.get_cookies() driver.quit()这种方法虽然慢但成功率高。获取到的cookies可以用于后续的请求。3.2 使用移动端API经过抓包分析Keep的移动端API相对简单。我们可以直接调用手机登录接口import requests login_url https://api.gotokeep.com/v1.1/users/login headers { User-Agent: Keep/5.25.0 (iPhone; iOS 14.4; Scale/3.00), Content-Type: application/json } data { phoneNumber: 你的手机号, password: 你的密码 } response requests.post(login_url, jsondata, headersheaders) auth_token response.json()[data][token]这种方式更快但需要注意模拟正确的User-Agent和请求头。4. 获取运动数据的具体实现4.1 解析运动列表登录成功后我们可以获取运动记录列表def get_workout_list(token, page1, limit20): url fhttps://api.gotokeep.com/pd/v3/stats/record?page{page}limit{limit} headers { Authorization: fBearer {token}, User-Agent: Keep/5.25.0 (iPhone; iOS 14.4; Scale/3.00) } response requests.get(url, headersheaders) return response.json()[data][records]这个接口返回的是JSON格式的数据包含每次运动的基本信息如运动类型、时长、消耗卡路里等。4.2 获取详细运动数据有了运动记录ID后我们可以获取更详细的数据def get_workout_detail(token, record_id): url fhttps://api.gotokeep.com/pd/v3/stats/detail/{record_id} headers { Authorization: fBearer {token}, User-Agent: Keep/5.25.0 (iPhone; iOS 14.4; Scale/3.00) } response requests.get(url, headersheaders) return response.json()[data]对于跑步记录这个接口会返回配速、心率、轨迹等详细信息。我建议将这些数据存储为结构化格式方便后续分析。5. 数据存储与分析5.1 存储到CSV文件使用pandas可以方便地将数据保存为CSVimport pandas as pd def save_to_csv(data, filenameworkout_data.csv): df pd.DataFrame(data) df.to_csv(filename, indexFalse, encodingutf_8_sig)5.2 存储到数据库对于长期积累的数据建议使用数据库存储。这里以SQLite为例import sqlite3 def init_db(): conn sqlite3.connect(keep_data.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS workouts (id TEXT PRIMARY KEY, type TEXT, duration INTEGER, calories REAL, distance REAL, start_time TEXT)) conn.commit() conn.close() def save_to_db(data): conn sqlite3.connect(keep_data.db) c conn.cursor() for item in data: c.execute(INSERT OR IGNORE INTO workouts VALUES (?,?,?,?,?,?), (item[id], item[type], item[duration], item[calories], item.get(distance, 0), item[startTime])) conn.commit() conn.close()5.3 数据分析示例有了数据后我们可以进行各种分析。比如计算每周跑步距离def analyze_running_data(): conn sqlite3.connect(keep_data.db) df pd.read_sql(SELECT * FROM workouts WHERE typerunning, conn) df[start_time] pd.to_datetime(df[start_time]) df[week] df[start_time].dt.strftime(%Y-%U) weekly_stats df.groupby(week)[distance].sum() print(weekly_stats)这样的分析可以帮助我们了解训练效果及时调整计划。6. 常见问题与解决方案6.1 反爬虫机制Keep有一定的反爬虫措施我遇到过的主要问题有请求频率过高被封IP - 解决方法添加适当的延时如3-5秒需要验证码 - 解决方法使用Selenium模拟人工操作接口变更 - 解决方法定期检查接口是否有效6.2 数据加密部分运动数据如GPS轨迹是加密的。经过分析Keep使用的是Base64编码的Gzip压缩数据。解密方法如下import base64 import gzip import json def decode_encrypted_data(encrypted_str): compressed_data base64.b64decode(encrypted_str) json_str gzip.decompress(compressed_data).decode(utf-8) return json.loads(json_str)6.3 数据不完整有时接口返回的数据可能缺少某些字段。我的经验是检查是否有其他接口能提供更完整的数据设置默认值避免程序出错记录数据缺失情况便于后续分析7. 完整代码示例下面是一个完整的示例实现了从登录到数据获取的全流程import requests import pandas as pd import time import sqlite3 class KeepSpider: def __init__(self): self.session requests.Session() self.token None def login(self, phone, password): url https://api.gotokeep.com/v1.1/users/login headers { User-Agent: Keep/5.25.0 (iPhone; iOS 14.4; Scale/3.00), Content-Type: application/json } data { phoneNumber: phone, password: password } response self.session.post(url, jsondata, headersheaders) self.token response.json()[data][token] return self.token is not None def get_workouts(self, page1, limit20): url fhttps://api.gotokeep.com/pd/v3/stats/record?page{page}limit{limit} headers { Authorization: fBearer {self.token}, User-Agent: Keep/5.25.0 (iPhone; iOS 14.4; Scale/3.00) } response self.session.get(url, headersheaders) return response.json()[data][records] def get_workout_detail(self, record_id): url fhttps://api.gotokeep.com/pd/v3/stats/detail/{record_id} headers { Authorization: fBearer {self.token}, User-Agent: Keep/5.25.0 (iPhone; iOS 14.4; Scale/3.00) } response self.session.get(url, headersheaders) return response.json()[data] def save_to_csv(self, data, filename): df pd.DataFrame(data) df.to_csv(filename, indexFalse, encodingutf_8_sig) # 使用示例 if __name__ __main__: spider KeepSpider() if spider.login(你的手机号, 你的密码): workouts spider.get_workouts() workout_details [] for workout in workouts[:10]: # 只获取前10条避免频繁请求 detail spider.get_workout_detail(workout[id]) workout_details.append(detail) time.sleep(3) # 适当延时 spider.save_to_csv(workout_details, my_workouts.csv)8. 实际应用建议经过几个月的实践我总结出一些实用建议定时运行使用Windows任务计划或Linux的cron设置定时任务建议每周运行一次数据备份定期备份数据库避免数据丢失异常处理增加重试机制应对网络波动可视化展示用matplotlib或Tableau创建仪表盘直观展示训练成果我自己的脚本已经稳定运行半年多积累了丰富的运动数据。通过这些数据我不仅能看到自己的进步还能发现训练中的问题。比如有段时间我的跑步配速波动很大分析后发现是因为那段时间睡眠质量差。这种洞察是单纯靠感觉无法获得的。最后提醒一点自动化抓取数据要遵守Keep的使用条款不要过度请求影响服务器性能。建议控制请求频率最好在非高峰时段运行脚本。

更多文章