상세 컨텐츠

본문 제목

[Pandas 웹 크롤링] ]pd.read_html로 NIST Atomic spectrum line 테이블 가져오기

프로그래밍/Python

by 척척석사 민준 2021. 6. 20. 16:03

본문

728x90

이 자료는 방전가스를 공기로 사용한 플라즈마 제트에서 방출된 빛의 스펙트럼을 분석한 데이터이다.

논문정보는 다음과 같다.

Air plasma jet with hollow electrodes at atmostpheric pressure 저자 : Yong Cheol Hong and Han Sup Uhm 

공기를 이용한 플라즈마 방전에선 위 그림과 같은 OES가 측정 된다.

질소와 산소원자에서 방출되는 빛이 측정되는 것인데 실험을 하면 그냥 wavelength에 따른 intensity 정보만을 알 수 있다.

어떤 파장이 어떤 원소에서 나오는지는 알 수 없는 것이다.


그럼 이런 정보들은 어디에서 알 수 있을까?

다행히 NIST라는 미국의 표준기술연구소 홈페이지에 데이터베이스를 구축해놔서 누구나 들어가서 스펙트럼 라인을 조사할 수 있다.

https://physics.nist.gov/PhysRefData/ASD/lines_form.html

 

NIST: Atomic Spectra Database Lines Form

 

physics.nist.gov

문제는 스펙트럼이 한두개가 아니라 수 없이 많다는 점이다.

질소의 스펙트럼 라인을 300 nm - 500 nm 까지를 확인해보자

이런 스펙트럼 데이터가 무려 432개의 데이터가 있다.

원소 종류별로 데이터를 다른곳에 옮겨적는다고 생각하면 엄청난 노동이 될 것이다. 

다행이 홈페이지는 HTML로 짜여있고

크롤링을 이용하면 웹상의 데이터를 쉽게 꺼내올 수 있다.


가져오고자 하는 데이터 : 질소의 에너지 레벨, Transition probability(Aki), Wavelength(nm)

코드를 동작시키기 위한  라이브러리

pip install pandas
pip install numpy
pip install lxml
pip install html5lib
pip install beadutifulsoup4

웹페이지에서 테이블을 가져오는 코드

import pandas as pd
import numpy as np
import lxml
import html5lib
import bs4

df = pd.read("https://physics.nist.gov/cgi-bin/ASD/lines1.pl?spectra=N&limits_type=0&low_w=300&upp_w=500&unit=1&submit=Retrieve+Data&de=0&format=0&line_out=0&en_unit=0&output=0&bibrefs=1&page_size=15&show_obs_wl=1&show_calc_wl=1&unc_out=1&order_out=0&max_low_enrg=&show_av=2&max_upp_enrg=&tsb_value=0&min_str=&A_out=0&intens_out=on&max_str=&allowed_out=1&forbid_out=1&min_accur=&min_intens=&conf_out=on&term_out=on&enrg_out=on&J_out=on", encoding = 'utf-8')
df[0]

실행결과는 다음과 같다(헤더정보나 양식이 다를 수 있어서 리스트 몇번째에 원하는 데이터가 있는지는 df[0], df[1] 이런식으로 이동해가면서 조회해봐야한다.

데이터프레임으로 정보를 가져왔으니 데이터 슬라이싱으로 원하는 데이터를 가져올 수 있다.

Transition Probability ( Aki )를 가져와보자

사람 눈으로 보이는 것과 실제 컴퓨터가 보이는게 다를 수 있기 때문에 웹상의 데이터를 가져올 때는 두세번씩 확인하는게 정신건강에 좋다.

오류화면은 Aki (s-1) 이라는 이름을 가진 열이 없다고 하는 것이다.

df[3].columns 함수로 데이터프레임의 열이름 모두 조회해봤다.

이때도 분명 Aki (s-1)인데 계속 해당열이 없다는 오류가 나온다.

그럼 아예 특정행을 찾아보는 것이다

df[3].columns[4]으로 특정 위치의 열이름을 조회할 수 있다.

주의할 점은 파이썬에서 숫자를 셀때는 매트랩과는 다르게 0에서 부터 시작하기에 5번째 열을 조회하려면 4를 입력해야한다.

역시 Aki (s-1)이 아니라 Aki\xa0(s-1)이라는 이름으로 되어있었다.

df[3]['Aki\xa0(s-1)']로 Transition Probability를 가져올 수 있었다.

이런 식으로 데이터프레임을 조작하면 NIST의 데이터를 가져와 OES 실험데이터를 분석할 수 있다.

NIST 데이터는 실험분석에 방대한 정보를 제공해주지만

원소에 대해서만 분광데이터를 제공해준다는 한계가 있다.

분자종의 분광데이터를 가져오려면 논문을 찾아봐야한다.

728x90

관련글 더보기