气相色谱质谱联用(Gas chromatography mass spectrometry, GC-MS)是广泛应用于环保行业、电子行业、纺织品行业、石油化工、香精香料行业、医药行业、农业及食品安全等领域;环境中有机污染物分析(空气、水质、土壤中污染分析);农残、兽残、药残分析;香精香料香气成分分析;纺织品行业中的有害物质检测。@气相色谱质谱联用仪_百度百科 ()
GCMS测试反馈的数据不包含化合物的中文名和分子式,有的测试单位甚至不包含分子量等信息。为了更加直观的了解测试样品中化合物的分布,种类,还得手动根据CAS手动查询补全这些信息,然而手动查询实在折磨,故试着用Python爬虫来代劳!
通过Python爬虫查询特定的CAS号对应化合物的中文名,分子式的信息,并整理成表格。
(资料图片)
〓测试数据的形式与结构〓
把样品寄给测试单位,得到的数据表格反馈如图1:
以化合物编号列的计数,图1展示的是一组半。
每组化合物编号都对应了正好20组数据,并且在其组内以定性列数字从大到小排序。
这意味着不能完全确定对应的是哪种化合物,只能在定性栏注明可能性的高低。
此外面积(Ab*s)指的是质谱峰面积,此处我把峰面积的占比称为相对丰度,也要整理出来。
根据要求,我需要的是每组化合物的第一匹配项,也就是说我应该把图1中出现的两组化合物整理成图2格式。
然而,CAS:138781-42-7没有找到对应的中文名,就空着吧!
可见,只有中文名和分子式是从网上查来的,相对丰度是计算来的,其他项目都是直接从图1表格中搬来的。用Python来取代人工再合适不过了。
〓简而言之就是6步〓:
从图1表格中抽取每组化合物的第一行的面积(Ab*s)、匹配项名称、分子量、CAS号。
把步骤1中CAS号重复的整合成一项,但是该项面积(Ab*s)要加和起来。
算出各项面积在总面积中的占比,也就是峰面积占比,此处且称作相对丰度。
利用CAS号上网爬取对应化合物的介绍页面的网页源码。
从网页源码中遍历寻找中文名称和分子式。
将中文名称、匹配项名称(英文),分子式、分子量、CAS、相对丰度填表并保存。
〓其他格式的数据〓
不同测试机构可能给出的数据形式不太一样,比如图3就是另外一个测试机构给出的,文件形式不是表格,而是一个txt文本文件,每组化合物三个匹配项,只包含CAS号,峰面积占比(Area%),故需要多出一部从这样的文本中读取CAS号的操作,在爬虫时也需要多一步:爬分子量。但总体上来说差别不大!
用到pandas、numpy、request、my_fake_useragent几个库。
〓步骤1-3的实现方式〓
从图1表格中抽取每组化合物的第一行的面积(Ab*s)、匹配项名称、分子量、CAS号。
把步骤1中CAS号重复的整合成一项,但是该项面积(Ab*s)要加和起来。
算出各项面积在总面积中的占比,也就是峰面积占比,此处且称作相对丰度。
这段是read()函数,该函数调用以下2个自定义函数:
relative_abundance(df)
delete_duplicates(df)
功能为读取图1所示的表格文件。完成问题描述中的1-3步。
返回一个一个有 ['化学名','分子量','CAS','相对丰度'] 四列的Pandas DataFrame变量
〓步骤4-5的实现方式〓
利用CAS号上网爬取对应化合物的介绍页面的网页源码。
从网页源码中遍历寻找中文名称和分子式。
这段是gethtml()函数,该函数调用以下3个自定义函数:
delete_0(df)
get_name_chinese(html)
get_name_chinese1(html1)
完成问题描述中的4-5步
返回的是分子式和中文名的list变量
〓步骤6的实现方式〓
将中文名称、匹配项名称(英文),分子式、分子量、CAS、相对丰度填表并保存。
主函数main()调用read()、gethtml()、write(),最后将新表格保存在原路径。
最后实现的效果如图4,基本上CAS100开头的查不到,不晓得为什么。但是能交差就行。
标签: