脚本语言:Python

数据库:NHANES公开数据

NHANES(National Health and Nutrition Examination Survey)是美国国家卫生与营养检查调查的缩写,它是由美国国家卫生与人类服务部(HHS)的国家卫生调查中心(NCHS)所开展的一项重要的流行病学调查项目。NHANES旨在评估美国人口的健康和营养状况,并为政策制定者、研究人员和公众提供有关美国人群健康状况的重要数据。

NHANES通过对代表性样本进行抽样调查,收集关于参与者的健康和营养信息,包括生理测量数据、健康调查问卷、实验室检测和营养调查等。这些数据有助于了解美国人的饮食和营养摄入、慢性疾病的患病率、生活方式因素以及环境暴露等信息。

NHANES数据库是由这些调查数据组成的,并且由美国国家卫生调查中心(NCHS)进行管理和维护。研究人员、卫生专业人员和政策制定者可以申请访问这些数据,用于各种健康研究和政策制定目的。

官网地址:https://www.cdc.gov/nchs/nhanes/ind

一个个去下载很麻烦,所以想了用脚本去批量下载所有数据(1999-2022)

代码分为两个部分

1.批量获取链接,保存到Nhanes_Data_href.xlsx里

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 定义URL
components = ["Demographics", "Dietary", "Examination", "Laboratory", "Questionnaire"]
base_url = "https://wwwn.cdc.gov/nchs/nhanes/search/variablelist.aspx?Component="
urls = [base_url + component for component in components]

# 获取表格数据
tables = []
for url in urls:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    table = soup.find('table')
    df = pd.read_html(str(table))[0]
    tables.append(df)

# 合并所有表格
combined_table = pd.concat(tables, ignore_index=True)

# 显示前几行
print(combined_table.head())

# 保存为RData文件
combined_table.to_pickle("Nhanes_Variablelist.pkl")

# 获取数据页面的URL
base_url_data = "https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component="
urls_data = [base_url_data + component for component in components]

# 获取表格数据
tables_data = []
for url in urls_data:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    table = soup.find('table')
    df = pd.read_html(str(table))[0]
    tables_data.append(df)

# 合并所有表格
combined_table_data = pd.concat(tables_data, ignore_index=True)

# 显示前几行
print(combined_table_data.head())

# 保存为RData文件
combined_table_data.to_pickle("Data_File_Table.pkl")

# 获取所有链接
hrefs = []
for url in urls_data:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    links = soup.find_all('a', href=True)
    hrefs.extend([link['href'] for link in links])

# 过滤出带有 .XPT 后缀的链接
xpt_links = [href for href in hrefs if ".XPT" in href]

# 添加前缀
xpt_links_full = ["https://wwwn.cdc.gov" + link for link in xpt_links]

# 显示前几行
print(xpt_links_full[:6])

# 保存为Excel文件
df_xpt_links = pd.DataFrame(xpt_links_full, columns=["Links"])
df_xpt_links.to_excel("Nhanes_Data_href.xlsx", index=False)

代码2 下载所有XPT文件

import os
import pandas as pd
import requests

# 读取包含链接的Excel文件
df = pd.read_excel("C:\\Users\\Administrator\\Desktop\\Nhanes_Data_href.xlsx")

# 基础保存路径
base_save_dir = "C:\\Users\\Administrator\\Desktop\\nhanes_files"

# 确保基础保存目录存在
if not os.path.exists(base_save_dir):
    os.makedirs(base_save_dir)

# 遍历每个链接
for link in df['Links']:
    # 提取年份信息,假设年份信息在链接中,例如 https://wwwn.cdc.gov/Nchs/Nhanes/2005-2006/DEMO_D.XPT
    year = link.split('/')[5]  # 提取年份部分,例如 2005-2006

    # 创建年份文件夹
    year_dir = os.path.join(base_save_dir, year)
    if not os.path.exists(year_dir):
        os.makedirs(year_dir)

    # 下载文件并保存到相应的年份文件夹
    response = requests.get(link, stream=True)
    if response.status_code == 200:
        filename = link.split('/')[-1]
        file_path = os.path.join(year_dir, filename)
        with open(file_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"下载成功: {file_path}")
    else:
        print(f"下载失败: {link} 状态码 {response.status_code}")