找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1232|回复: 5

[其他话题] NHANSE数据下载,授人以渔也授人以鱼

[复制链接]
锦色谙然 发表于 2025-3-6 20:19:44 | 显示全部楼层 |阅读模式

注册后推荐绑定QQ,之后方才可以使用下方的“用QQ帐号登录”。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
NHANSE介绍
NHANES是比较知名的公共数据库,国家健康和营养检查调查 (NHANES,National Health and Nutrition Examination Survey) 是一项基于人群的横断面调查,旨在收集美国成人和儿童的健康和营养状况的信息,该调查的独特之处在于它结合了访谈和体检。该数据库包括Demog Data(人口统计学数据)、Dietary Data(饮食数据)、 Examination Data(检查数据)、Laboratory Data(实验室数据)、Questionnaire Data(问卷数据)、Limited Access Data(有限访问数据)。调查结果将用于确定主要疾病的患病率和疾病的风险因素,也是衡量身高、体重和血压等国家标准的基础。

数据下载
中规中矩下载
1.访问NHANES官方网站:- 进入NHANES数据库官网:https://wwwn.cdc.gov/nchs/nhanes/continuousnhanes/default.aspx

2.选择数据年份和类型:- 在官网首页,点击“NHANES Questionnaires, Datasets, and Related Documentation”栏目,选择你需要的调查年份和数据类型。数据类型包括人口统计数据(Demographics)、饮食数据(Dietary)、检查数据(Examination)、实验室数据(Laboratory)和问卷数据(Questionnaire)。


image
3.下载数据:- 以2017-2018年的一般人口学资料为例,选择“NHANES 2005-2006 Demographics Data”,然后点击数据文件(Data File)下面的相应文件DEMO D Data [XPT-3.4 MB]进行下载。文件类型是.XPT,这是SAS传输格式。


image
4.使用统计软件打开数据:下载的.XPT文件可以用多种应用程序直接读取,如SUDAAN、SPSS、STATA和R。例如,在R中可以使用`read.xport`函数读取数据。

5.设限数据获取:- 如果需要访问受限数据,可以在NHANES官网页面导航栏最下端找到“Research Data Center”菜单,按照指引申请获取设限数据。

python一键下载。下面是具体代码:

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/datapage.aspx?Component="
urls = [base_url + component for component in components]

# 存储链接和文本内容的列表
link_list = []
text_list = []

try:
    # 遍历每个 URL
    for url in urls:
        # 发送 HTTP 请求获取网页内容
        response = requests.get(url)
        # 检查请求是否成功
        response.raise_for_status()

        # 使用 BeautifulSoup 解析 HTML 内容
        soup = BeautifulSoup(response.text, 'html.parser')

        # 查找所有的超链接
        links = soup.find_all('a', href=True)

        # 遍历所有超链接并筛选出包含 XPT 的链接和文本
        for link in links:
            href = link['href']
            text = link.get_text(strip=True)
            if 'XPT' in href or 'XPT' in text:
                link_list.append(href)
                text_list.append(text)

    # 创建 DataFrame
    df = pd.DataFrame({
        '链接': link_list,
        '文本内容': text_list
    })

    # 保存为 Excel 文件,此处可自定义文件存储位置
    df.to_excel('E:/NHANSE/data.xlsx', index=False)

    print("数据已成功写入 E:/NHANSE/data.xlsx 文件。")

except requests.RequestException as e:
    print(f"请求出错: {e}")
except Exception as e:
    print(f"发生错误: {e}")
上面是第一部分,目的是爬取相对应数据文件的下载链接,然后需要逐个下载到相应的年份文件夹中:

import os
import pandas as pd
import requests
import re
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# 配置重试机制
retry_strategy = Retry(
    total=3,  # 重试次数
    backoff_factor=1,  # 重试间隔时间的倍数
    status_forcelist=[429, 500, 502, 503, 504],  # 遇到这些状态码时进行重试
    allowed_methods=["HEAD", "GET", "OPTIONS"]  # 允许重试的请求方法
)
adapter = HTTPAdapter(max_retries=retry_strategy)
http = requests.Session()
http.mount("https://", adapter)
http.mount("http://", adapter)

# 读取包含链接的 Excel 文件,注:这里要确保文件位置无误
df = pd.read_excel("E:\\NHANSE\\data.xlsx")

# 基础保存路径
base_save_dir = "E:\\NHANSE\\nhanes_files"

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

# 遍历每个链接
for link in df['link']:
    # 构建完整的下载链接
    full_link = "https://wwwn.cdc.gov" + link
    print(f"处理链接: {full_link}")  # 添加调试信息

    # 使用正则表达式提取年份
    year_match = re.search(r'/(\d{4})/', link)
    if year_match:
        year = year_match.group(1)
        print(f"提取的年份: {year}")  # 添加调试信息
    else:
        print(f"无法从链接 {full_link} 中提取年份信息,跳过该链接。")
        continue

    # 创建年份文件夹
    year_dir = os.path.join(base_save_dir, year)
    if not os.path.exists(year_dir):
        try:
            os.makedirs(year_dir)
            print(f"创建文件夹: {year_dir}")  # 添加调试信息
        except OSError as e:
            print(f"创建文件夹 {year_dir} 失败: {e}")
            continue

    # 下载文件并保存到相应的年份文件夹
    try:
        response = http.get(full_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"下载失败: {full_link} 状态码 {response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {full_link}, 错误信息: {e}")


NHANSE数据已下载好。不想折腾的可以直接保存下载,链接:https://pan.quark.cn/s/c16b7ee1090c

声明:数据下载仅为方便广大科研人员研究之用。

评分

参与人数 1钢镚 +100 收起 理由
epiman + 100 积极参与论坛活动!

查看全部评分

希美 发表于 2025-3-26 15:33:49 | 显示全部楼层
感谢博主
回复

使用道具 举报

15836126735 发表于 2025-5-27 16:58:19 | 显示全部楼层
谢谢分享,留着学习
回复

使用道具 举报

kuang 发表于 2025-7-8 10:36:52 | 显示全部楼层
感谢楼主的无私分享
回复

使用道具 举报

x小小小小鸟 发表于 2025-7-16 10:21:55 | 显示全部楼层
感谢博主分享
回复

使用道具 举报

15836126735 发表于 2025-7-19 10:43:04 | 显示全部楼层
虽然我看不懂,但是准备学习,谢谢博主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

改名|钢镚|会员|联系我们|公卫人 ( 沪ICP备06060850号-3|沪公网安备31010402334125号 )

GMT+8, 2025-8-11 18:53 , Processed in 0.055601 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表