化合物信息批量抓取
优采云 发布时间: 2022-07-29 05:42化合物信息批量抓取
前段时间老板布置了一项任务,需要收集整理些化合物,于是现学了一些简单爬虫,同时发现了一个针对pubchem中物质信息提取的工具,趁着现在分享给大家!
爬虫篇我拿到了一些化合物,我想从一个网站中下载该物质的注释信息,但是发现是不能直接下载的,例如图片中红色框中的文字部分,一个一个copy比较浪费时间,于是爬虫ing~
网站爬虫需要了解下网站的布局,F12键会打开新世界!如下图所示,我们能发现注释信息所在的位置,因此通过爬虫定位到此,批量获取信息!网页爬取太频繁会导致请求失败,可以尝试更换IP或者模拟浏览器进行访问!
爬虫源码
"""demo28 - 抓取化合物信息<br />Author:CXangDate:2022/7/15"""import timeimport requestsimport lxmlfrom lxml import etreeimport reimport pandas as pdimport bs4<br /># 药物列表# 需要先将待下载化合物名称保存为txt文件"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""with open(r"/path/to/your/drugname.txt") as f: content = f.read()lines = [line.split(" ") for line in content.split("\n")]druglist = []for line in lines: druglist += line<br /># 导入网站URLurls = ["https://drugcentral.org/?q={}".format(drug) for drug in druglist]<br /># 建立储存信息字典result = {"name": [], # 药物名称 "define": [] # 药物描述 }<br /><br /># 记录时间-startst = time.time()<br /># 循环遍历# 定义访问休息时间,每个conts大于5则休息几秒的时间count = 0for url in urls: count += 1 print(url) r = requests.get(url,verify=False) html = bs4.BeautifulSoup(r.text, 'html.parser') # 寻找目标内容 all_drugs = html.find("div", class_="content container").find_all("tr") # print(all_drugs) for data in all_drugs: drug_name = data.find("strong", class_="sealine").text drug_define = str(data.find_all(id="sea")) # 字典分割 drug_define = drug_define.split(r'sea">')[1] drug_define = drug_define.split(r'')[0] # 若药物不含有定义描述则返回NA if not drug_define: drug_define = "NA" # print(drug_define) result["name"].append(drug_name) result["define"].append(drug_define) if count > 5: time.sleep(3) count = 0 df = pd.DataFrame(result) df.to_csv(r"/path/to/your/output.csv", index=False)<br /># 记录时间-endet = time.time()# 计算使用时间print(f"All tasks finished, and costs {round(et-st, 2)} seconds.")
抓取结果显示
PubChemPy
PubChem就是那个熟悉的化合物大全,涵盖范围很广。包含物质的各种信息,例如名称、分子式、分子量等信息,此时我有一堆化合物名称,我要如何批量拿到物质分子式、分子量等信息呢?一个一个搜索比较浪费时间,无意中发现PubChemPy,PubChemPy是通过python来获取pubchem中相关化合物数据的python库(PubChemPy provides a way to interact with PubChem in Python);
安装Installation
PubChemPy 支持Python版本包括2.7, 3.5, and 3.6. 没有各种依赖.可以通过多种方式进行安装,包括pip、conda或者下载压缩包自行安装。
使用Getting started
import pubchempy as *敏*感*词*c = *敏*感*词*.Compound.from_cid(5090)print c.molecular_formula# C17H14O4Sprint c.molecular_weight# 314.35566print c.isomeric_smiles# CS(=O)(=O)C1=CC=C(C=C1)C2=C(C(=O)OC2)C3=CC=CC=C3print c.xlogp# 2.3print c.iupac_name# 3-(4-methylsulfonylphenyl)-4-phenyl-2H-furan-5-oneprint c.synonyms# [u'rofecoxib', u'Vioxx', u'Ceoxx', u'162011-90-7', u'MK 966', ... ]
尝试通过化合物名称批量获取信息
# 需要先将待下载化合物名称保存为txt文件。"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""<br /># 批量抓取import urllibimport pubchempyimport pandas as pdimport numpy as npwith open('/path/to/your/drugname.txt','r',encoding='utf-8-sig') as file1: file_lines = file1.readlines() name_list=[] a=[] cc=[] d=[] e=[] f=[] g=[]#readlines读取字符串格式,需将其转换成列表格式 for i in file_lines: j=i.strip() #去掉每行头尾空白 name_list.append(str(j)) for k in name_list: results = pubchempy.get_compounds(k, 'name') for l in results: try: print('CID: {}\tMass: {}\tName: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid,l.exact_mass,l.iupac_name,l.molecular_formula,l.isomeric_smiles,l.synonyms)) MFs=l.molecular_formula MWs=l.molecular_weight ISs=l.isomeric_smiles Sys=l.synonyms Cis=l.cid a.append(k) cc.append(MFs) d.append(ISs) e.append(Sys) f.append(Cis) g.append(MWs) except (pubchempy.BadRequestError,TimeoutError,urllib.error.URLError,ValueError): pass dataframe=pd.DataFrame({'name':a, 'molecular_formula':cc, 'molecular_weight':g, 'isomeric_smiles':d, 'synonyms':e, 'cid':f}) # outputpath是保存文件路径 outputpath = '/path/to/your/output.csv' dataframe.to_csv (outputpath,index=False,sep=',')
抓取结果显示
写在最后
匆忙之中完成此次更新,如有问题欢迎后台交流呀~