안전보건공단피셜
0. 필요성
제각기인 화합물 한글명칭의 Cas No가 필요해졌다.
예를 들자면
에탄올을 '에틸 알코올', 'EtOH', 'Ethyl alcohol', 'Alcohol'(?) 등으로 쓰는데
각종 DB에서 이러한 다양한 명칭 및 다양한 띄어쓰기로 검색할 시
결과가 제대로 나오지 않는 문제 등이 있었다. (위의 사진 참조)
그래서 항상 우리는 구글링을 한다.
그래서 구글링을 자동화할 아이디어를 떠올렸다.
1. 컨셉
구글에 해당 명칭 + "cas no" 의 형식을 기반으로 자동 검색 코드를 짠다.
Cas No가 ???-???-??? 형식을 취한다는 점을 이용,
구글의 검색결과 html에서 위의 형식을 정규식으로 매칭시킨 다음,
파이썬의 Counter 클래스로 개수를 세서,
가장 많이 등장하는 일련번호가 곧 Cas No일 것이라고 추측한다.
2. 결과
'암모니아'와 '암모니아수'가 서로 다른 Cas No로 구분되고 있는 모습과
'염소'와 '염소(Cl2)'가 같은 Cas No를 가리키고 있는 모습 및
차아염소산나트륨이 '염소산소다', '염소산나트륨'으로도 검색되지만
정확성에서 안습한 모습을 보여주고 있는 모습에 주목하라.
참고로 9-2-2는 검색결과 html에서 잘못 매칭되고 있는 결과이다.
이것만 없애도 정확도가 상승할 것 같긴 하지만(염소산포타슘의 예처럼)
정확하게 검색된 염산같은 물질들이
검색 결과에서 총 14번이나 등장하면서 '9-2-2'를 압도하는 모습이 마치
'이 정도는 반복되어야 믿을 수 있지 않을까'라는 심정..
이 값을 기준 역치값으로 사용해버렸다.
(이 정도도 이기지 못하는 일련번호는 쓸모없다!)
3. 코드
from selenium import webdriver
import time
import re
import traceback
from collections import Counter
def searching(query):
try:
driver = webdriver.Chrome('chromedriver.exe')
time.sleep(1)
driver.get('http://www.google.com')
time.sleep(1)
inputElement = driver.find_element_by_name("q")
time.sleep(1)
inputElement.send_keys(f"{query} cas no")
inputElement.submit()
time.sleep(1)
cass = re.findall('(\d+-\d+-\d+)', driver.page_source)
print(query.strip(), Counter(cass).most_common())
return Counter(cass).most_common()
driver.quit()
except Exception as ex:
print('---------에러 발생---------')
print(traceback.format_exc())
finally:
driver.quit()
with open(r'##열고 싶은 파일 경로.txt##', 'r', encoding='utf-8') as f:
result = []
lists = f.readlines()
for compound in lists[150:170]:
result.append({'compound': compound.strip(), 'counter': searching(compound.strip())})
for i in result:
print(i['compound'], i['counter'][0][0], f"{i['counter'][0][1]}회", sep='★')
실행할 코드파일.py에 셀레니움 실행을 위한 chromedriver.exe 가 필요하다.
'열고 싶은 파일 경로'는 한 줄에 물질명 하나씩 담겨 있는 텍스트 파일로 하였다.
이렇게 ↓
그리고 결과창에 추가로 출력되는 맨 아랫줄의 코드는
★로 각 단어를 분리해, 엑셀에 붙여넣어 작업을 편리하게 하려고
급하게 끼워넣어 사용한 코드임을 보여준다. (...)
4. 한계점
이상한 명칭(?)들에는 제대로 작동하지 않을 수 있다.
애초에 '가장 자주 등장하는 매칭'을 끌어오는 방식이기 때문에
구글의 검색결과에 절대적으로 의존하고 있다.
(Cas No를 통해 추가 검증을 하지 않았다는 의미)
또한 구글에서 당신을 로봇으로 인식하여
'휴먼입니까 휴먼?'이라며 아래의 페이지를 띄우기도 한다.
(휴먼?)
그래서 셀레니움을 headless로 설정하지 않았다.
휴먼이 실시간으로 모니터링 하는 편이 더 나을 것이라고 생각했다.
5. 고찰
역시 작업은 자동화해야 제맛이다.
300개 물질의 Cas No를 일일히 검색하려니 여간 귀찮은게 아니었는데
이 코드로 80% 이상은 반복 작업을 줄였으니
이 정도면 쓸 만하다고 생각한다.
하지만 이런 조악한 코드조차도 빠르게 짤 수 없는 사람이라면
코딩보다 손수 작업하는 편이 더 빠를지도 모른다.
가장 효율적이게 문제를 해결할 방법을 고민하는 습관을 들이면 좋을 것 같다.