基于Python的健身数据分析工具的搭建流程分数据挖掘、数据存储和数据分析三个步骤。本文主要介绍利用Python实现健身数据分析工具的数据挖掘部分。
第一步:加载库
加载本文需要的库,如下代码所示。若库未安装,请按照python如何安装各种库(保姆级教程)_python安装库-CSDN博客https://blog.csdn.net/aobulaien001/article/details/133298563?ops_request_misc=%7B%22request%5Fid%22%3A%22bc807b7c972b79eb086b07c7a89a778b%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=bc807b7c972b79eb086b07c7a89a778b&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-133298563-null-null.142^v102^pc_search_result_base5&utm_term=python%E5%AE%89%E8%A3%85%E5%BA%93&spm=1018.2226.3001.4187的流程安装。
代码如下:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
第二步:找爬取数据的位置
打开要爬取数据的网页,找到其在HTML上User-Agent的位置,并存储到headers字典里。
代码如下:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
第三步:解析数据
对要爬取的运动时长、热量数据和心率区间数据进行解析。
代码如下:
def parse_duration(element):
"""解析运动时长"""
if element:
return int(element.text.strip().replace('分钟', ''))
return 0
def parse_number(element):
"""解析数值型数据"""
return int(element.text.strip().replace('千卡', '')) if element else 0
def parse_range(element):
"""解析心率区间"""
if element:
return tuple(map(int, element.text.strip().split('-')))
return (0, 0)
第四步:爬取keep运动数据
调用requests库的get()函数读取网址+headers的运动记录,并将读取到的所有数据添加到all_data文件。pages参数是设置读取记录的最大页码。
代码如下:
def scrape_keep_data(pages):
"""爬取Keep公开运动记录"""
base_url = "https://www.keep.com/activity/?page={}"
all_data = []
for page in range(1, pages + 1):
try:
response = requests.get(base_url.format(page), headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 解析运动记录
records = soup.select('.WorkoutCard')
for item in records:
data = {
'date': item.select_one('.Time').text.strip(),
'duration': parse_duration(item.select_one('.Duration')),
'calories': parse_number(item.select_one('.Calorie')),
'heart_rate': parse_range(item.select_one('.HeartRate')),
'type': item.select_one('.WorkoutType').text.strip()
}
all_data.append(data)
# 随机延迟防封禁
time.sleep(random.uniform(1, 3))
except Exception as e:
print(f"Error scraping page {page}: {str(e)}")
return pd.DataFrame(all_data)
完整代码:
# 导入库
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
# 指定数据位置
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 解析数据格式
def parse_duration(element):
"""解析运动时长"""
if element:
return int(element.text.strip().replace('分钟', ''))
return 0
def parse_number(element):
"""解析数值型数据"""
return int(element.text.strip().replace('千卡', '')) if element else 0
def parse_range(element):
"""解析心率区间"""
if element:
return tuple(map(int, element.text.strip().split('-')))
return (0, 0)
# 爬取运动数据
def scrape_keep_data(pages):
"""爬取Keep公开运动记录"""
base_url = "https://www.keep.com/activity/?page={}"
all_data = []
for page in range(1, pages + 1):
try:
response = requests.get(base_url.format(page), headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 解析运动记录
records = soup.select('.WorkoutCard')
for item in records:
data = {
'date': item.select_one('.Time').text.strip(),
'duration': parse_duration(item.select_one('.Duration')),
'calories': parse_number(item.select_one('.Calorie')),
'heart_rate': parse_range(item.select_one('.HeartRate')),
'type': item.select_one('.WorkoutType').text.strip()
}
all_data.append(data)
# 随机延迟防封禁
time.sleep(random.uniform(1, 3))
except Exception as e:
print(f"Error scraping page {page}: {str(e)}")
return pd.DataFrame(all_data)
# df = scrape_keep_data(5)
# df.to_csv('keep_data.csv', index=False)