摸魚(yú)筆記|基于Python爬蟲(chóng)和CAS號(hào)爬取化合物信息

GC-MS
氣相色譜質(zhì)譜聯(lián)用(Gas chromatography mass spectrometry,?GC-MS)是廣泛應(yīng)用于環(huán)保行業(yè)、電子行業(yè)、紡織品行業(yè)、石油化工、香精香料行業(yè)、醫(yī)藥行業(yè)、農(nóng)業(yè)及食品安全等領(lǐng)域;環(huán)境中有機(jī)污染物分析(空氣、水質(zhì)、土壤中污染分析);農(nóng)殘、獸殘、藥殘分析;香精香料香氣成分分析;紡織品行業(yè)中的有害物質(zhì)檢測(cè)。@氣相色譜質(zhì)譜聯(lián)用儀_百度百科 (baidu.com)

問(wèn)題描述
GCMS測(cè)試反饋的數(shù)據(jù)不包含化合物的中文名和分子式,有的測(cè)試單位甚至不包含分子量等信息。為了更加直觀的了解測(cè)試樣品中化合物的分布,種類,還得手動(dòng)根據(jù)CAS手動(dòng)查詢補(bǔ)全這些信息,然而手動(dòng)查詢實(shí)在折磨,故試著用Python爬蟲(chóng)來(lái)代勞!
通過(guò)Python爬蟲(chóng)查詢特定的CAS號(hào)對(duì)應(yīng)化合物的中文名,分子式的信息,并整理成表格。
〓測(cè)試數(shù)據(jù)的形式與結(jié)構(gòu)〓
把樣品寄給測(cè)試單位,得到的數(shù)據(jù)表格反饋如圖1:

以化合物編號(hào)列的計(jì)數(shù),圖1展示的是一組半。
每組化合物編號(hào)都對(duì)應(yīng)了正好20組數(shù)據(jù),并且在其組內(nèi)以定性列數(shù)字從大到小排序。
這意味著不能完全確定對(duì)應(yīng)的是哪種化合物,只能在定性欄注明可能性的高低。
此外面積(Ab*s)指的是質(zhì)譜峰面積,此處我把峰面積的占比稱為相對(duì)豐度,也要整理出來(lái)。
根據(jù)要求,我需要的是每組化合物的第一匹配項(xiàng),也就是說(shuō)我應(yīng)該把圖1中出現(xiàn)的兩組化合物整理成圖2格式。

然而,CAS:138781-42-7沒(méi)有找到對(duì)應(yīng)的中文名,就空著吧!
可見(jiàn),只有中文名和分子式是從網(wǎng)上查來(lái)的,相對(duì)豐度是計(jì)算來(lái)的,其他項(xiàng)目都是直接從圖1表格中搬來(lái)的。用Python來(lái)取代人工再合適不過(guò)了。
〓簡(jiǎn)而言之就是6步〓:
從圖1表格中抽取每組化合物的第一行的面積(Ab*s)、匹配項(xiàng)名稱、分子量、CAS號(hào)。
把步驟1中CAS號(hào)重復(fù)的整合成一項(xiàng),但是該項(xiàng)面積(Ab*s)要加和起來(lái)。
算出各項(xiàng)面積在總面積中的占比,也就是峰面積占比,此處且稱作相對(duì)豐度。
利用CAS號(hào)上網(wǎng)爬取對(duì)應(yīng)化合物的介紹頁(yè)面的網(wǎng)頁(yè)源碼。
從網(wǎng)頁(yè)源碼中遍歷尋找中文名稱和分子式。
將中文名稱、匹配項(xiàng)名稱(英文),分子式、分子量、CAS、相對(duì)豐度填表并保存。
〓其他格式的數(shù)據(jù)〓
不同測(cè)試機(jī)構(gòu)可能給出的數(shù)據(jù)形式不太一樣,比如圖3就是另外一個(gè)測(cè)試機(jī)構(gòu)給出的,文件形式不是表格,而是一個(gè)txt文本文件,每組化合物三個(gè)匹配項(xiàng),只包含CAS號(hào),峰面積占比(Area%),故需要多出一部從這樣的文本中讀取CAS號(hào)的操作,在爬蟲(chóng)時(shí)也需要多一步:爬分子量。但總體上來(lái)說(shuō)差別不大!

Python代碼
用到pandas、numpy、request、my_fake_useragent幾個(gè)庫(kù)。
〓步驟1-3的實(shí)現(xiàn)方式〓
從圖1表格中抽取每組化合物的第一行的面積(Ab*s)、匹配項(xiàng)名稱、分子量、CAS號(hào)。
把步驟1中CAS號(hào)重復(fù)的整合成一項(xiàng),但是該項(xiàng)面積(Ab*s)要加和起來(lái)。
算出各項(xiàng)面積在總面積中的占比,也就是峰面積占比,此處且稱作相對(duì)豐度。
這段是read()函數(shù),該函數(shù)調(diào)用以下2個(gè)自定義函數(shù):
relative_abundance(df)
delete_duplicates(df)
功能為讀取圖1所示的表格文件。完成問(wèn)題描述中的1-3步。
返回一個(gè)一個(gè)有? ?['化學(xué)名','分子量','CAS','相對(duì)豐度']? ?四列的Pandas DataFrame變量

〓步驟4-5的實(shí)現(xiàn)方式〓
利用CAS號(hào)上網(wǎng)爬取對(duì)應(yīng)化合物的介紹頁(yè)面的網(wǎng)頁(yè)源碼。
從網(wǎng)頁(yè)源碼中遍歷尋找中文名稱和分子式。
這段是gethtml()函數(shù),該函數(shù)調(diào)用以下3個(gè)自定義函數(shù):
delete_0(df)
get_name_chinese(html)
get_name_chinese1(html1)
完成問(wèn)題描述中的4-5步
返回的是分子式和中文名的list變量

〓步驟6的實(shí)現(xiàn)方式〓
將中文名稱、匹配項(xiàng)名稱(英文),分子式、分子量、CAS、相對(duì)豐度填表并保存。
主函數(shù)main()調(diào)用read()、gethtml()、write(),最后將新表格保存在原路徑。

最后實(shí)現(xiàn)的效果如圖4,基本上CAS100開(kāi)頭的查不到,不曉得為什么。但是能交差就行。
