You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改SciFinder API Python代码获取密度、沸点等物性数据

解决SciFinder API获取物性及反应检索的问题

一、获取密度、沸点等物性数据的关键修改

默认的substances接口仅返回基础元数据,必须通过fields参数显式指定需要的物性字段,API才会返回对应数据。具体修改点:

  • 在请求URL中添加fields参数,多个字段用英文逗号分隔
  • 常用物性字段参考:
    • molecularWeight:分子量
    • boilingPoint:沸点
    • density:密度
    • criticalTemperature:临界温度
    • meltingPoint:熔点
    • molecularFormula:分子式

修改后的请求URL示例(移除原代码中重复的冗余请求):

resp = requests.get(
    'https://helium.cas.org/integration/v1/substances?str=Cc1nc%28n%28n1%29C%28C%29C%29c2cn3c%28n2%29-c4ccc%28cc4OCC3%29c5cnn%28c5%29C%28C%29%28C%29C%28%3DO%29N&strMode=drw&offset=0&length=100&echo=false&strHighlight=false&facet=true&fq=Number%20of%20Components%3A1&fields=casRn,uri,name,molecularWeight,boilingPoint,density,criticalTemperature',
    headers=headers
)

遍历结果时,建议用get()方法访问字段,避免字段不存在时报错:

for substance in json['substances']:
    print(f"CAS号: {substance['casRn']}")
    print(f"名称: {substance['name']}")
    print(f"分子量: {substance.get('molecularWeight', '无数据')}")
    print(f"沸点: {substance.get('boilingPoint', '无数据')}")
    print(f"密度: {substance.get('density', '无数据')}")
    print(f"临界温度: {substance.get('criticalTemperature', '无数据')}")
    print("---")

二、反应检索的实现方法

要进行反应检索,需切换到reactions端点,核心修改点:

  • 请求URL改为https://helium.cas.org/integration/v1/reactions
  • strMode设为rxn(表示反应式搜索)
  • 同样用fields指定需要返回的反应字段,比如reactionId、reactionSmiles、reactants、products等

示例代码:

# 搜索生成目标产物的反应
resp_reaction = requests.get(
    'https://helium.cas.org/integration/v1/reactions?str=Cc1nc(n(n1)C(C)C)c2cn3c(n2)-c4ccc(cc4OCC3)c5cnn(c5)C(C)(C)C(=O)N&strMode=rxn&offset=0&length=10&fields=reactionId,reactionSmiles,reactants,products',
    headers=headers
)
if resp_reaction.status_code != 200:
    raise Exception(f'GET reactions/ {resp_reaction.status_code}')
reaction_json = resp_reaction.json()

for reaction in reaction_json['reactions']:
    print(f"反应ID: {reaction['reactionId']}")
    print(f"反应SMILES: {reaction['reactionSmiles']}")
    print(f"反应物: {', '.join([r['name'] for r in reaction['reactants']])}")
    print(f"产物: {', '.join([p['name'] for p in reaction['products']])}")
    print("---")

三、完整修改后的代码

import requests

Bearer_Token = "<token>"  # 替换为你的实际Token
headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {Bearer_Token}'
}

# 1. 获取带物性数据的物质信息
substance_url = (
    'https://helium.cas.org/integration/v1/substances?'
    'str=Cc1nc%28n%28n1%29C%28C%29C%29c2cn3c%28n2%29-c4ccc%28cc4OCC3%29c5cnn%28c5%29C%28C%29%28C%29C%28%3DO%29N&'
    'strMode=drw&offset=0&length=100&echo=false&strHighlight=false&facet=true&'
    'fq=Number%20of%20Components%3A1&'
    'fields=casRn,uri,name,molecularWeight,boilingPoint,density,criticalTemperature,molecularFormula'
)
resp_substance = requests.get(substance_url, headers=headers)
if resp_substance.status_code != 200:
    raise Exception(f'GET substances/ {resp_substance.status_code}')
substance_json = resp_substance.json()

print("=== 物质物性数据 ===")
for substance in substance_json['substances']:
    print(f"CAS号: {substance['casRn']}")
    print(f"名称: {substance['name']}")
    print(f"分子式: {substance.get('molecularFormula', '无数据')}")
    print(f"分子量: {substance.get('molecularWeight', '无数据')}")
    print(f"沸点: {substance.get('boilingPoint', '无数据')}")
    print(f"密度: {substance.get('density', '无数据')}")
    print(f"临界温度: {substance.get('criticalTemperature', '无数据')}")
    print("---")

# 2. 反应检索示例
reaction_url = (
    'https://helium.cas.org/integration/v1/reactions?'
    'str=Cc1nc(n(n1)C(C)C)c2cn3c(n2)-c4ccc(cc4OCC3)c5cnn(c5)C(C)(C)C(=O)N&'
    'strMode=rxn&offset=0&length=10&'
    'fields=reactionId,reactionSmiles,reactants,products'
)
resp_reaction = requests.get(reaction_url, headers=headers)
if resp_reaction.status_code != 200:
    raise Exception(f'GET reactions/ {resp_reaction.status_code}')
reaction_json = resp_reaction.json()

print("\n=== 反应检索结果 ===")
for reaction in reaction_json['reactions']:
    print(f"反应ID: {reaction['reactionId']}")
    print(f"反应SMILES: {reaction['reactionSmiles']}")
    reactant_names = [r['name'] for r in reaction.get('reactants', [])]
    product_names = [p['name'] for p in reaction.get('products', [])]
    print(f"反应物: {', '.join(reactant_names) if reactant_names else '无数据'}")
    print(f"产物: {', '.join(product_names) if product_names else '无数据'}")
    print("---")

内容的提问来源于stack exchange,提问作者Rekton Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:46:00