目录

使用ChEMBL Python API 搜索化合物信息

前言

ChEMBL 算是各位化学从业者喜闻乐见的数据库。(因为他不要钱) 但是如果我们想要批量收集我们想要的内容,用网页版挨个寻找属实有点麻烦了。那么,有没有什么方法能够批量自动获取我们想要的分子信息呢?

其实除了我们熟知的ChEMBL网页 , ChEMBL 还贴心的提供了可以用Python 搜索的 ChEMBL web service client 服务。只要我们在Python代码中输入想要的关键词,就可以批量搜索到我们想要的内容然后保存为CSV 文件用于后续处理。(比如赛博炼丹)

应用实例

一位励志发JACS的同学希望收集ChEMBL上杂环化合物Heterocyclic compound溶解度Solubility数据,我们应该怎么找呢?

示例代码

首先 安装chembl_webresource_client 包

1
! pip install chembl_webresource_client

然后运行这一段代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import csv
from chembl_webresource_client.new_client import new_client

# 新建一个Client
client = new_client

# 录入关键词 solubility
assays = client.assay.filter(
    description__icontains='solubility'
)

# 新建一个CSV文件存储结果
with open('heterocyclic_solubility_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['CHEMBL_ID', 'SMILES', 'Solubility_value', 'Solubility_units', 'Solubility_doi', 'Assay_description']
    # 这里我们打算收集杂环分子的 ID,SMILES结构式,溶解度数据和单位,原始文献和这个数据的说明(比如测试条件),不需要的话可以按需删除
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    
    for assay in assays:
        activities = client.activity.filter(assay_chembl_id=assay['assay_chembl_id'])
        for activity in activities:
            try:
                molecule = client.molecule.get(activity['molecule_chembl_id'])
                
                # 判断这个分子是不是杂环分子
                is_heterocyclic = False
                if molecule.get('molecule_structures'):
                    smiles = molecule['molecule_structures'].get('canonical_smiles')
                    if smiles and any(atom in smiles for atom in ['n', 'o', 's', 'p','se']):
                        is_heterocyclic = True
                if is_heterocyclic:
                    try:
                        document = client.document.get(activity['document_chembl_id'])
                        doi = document.get('doi', "Not Available")
                    except Exception:
                        doi = "Not Available"
                    # 储存结果
                    writer.writerow({
                        'CHEMBL_ID': activity['molecule_chembl_id'],
                        'SMILES': smiles,
                        'Solubility_value': activity.get('value', "Not Available"),
                        'Solubility_units': activity.get('units', "Not Available"),
                        'Solubility_doi': doi,
                        'Assay_description': assay.get('description', "Not Available")
                    })
            except Exception as e:
                print(f"Error processing molecule {activity['molecule_chembl_id']}: {str(e)}")
                continue

print("Data collection completed. Results saved in 'heterocyclic_solubility_data.csv'.")

然后我们就能看到我们想要的结果了

注意事项

  • ChEMBL 上面的数据均为人肉收集和录入,请务必使用之前人工验证
  • 这一个过程可能持续很长一段时间,建议在程序运行过程中多多摸鱼

Good Luck!

参考文献Davies et al.,2015