일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- BFS
- SQL
- 리눅스 환경변수
- git 기본명령어
- 알고리즘
- 데이터분석
- 오라클 데이터 처리방식
- 배깅
- Collaborative filtering
- Decision Tree
- git stash
- enq: FB - contention
- Oracle 논리적 저장 구조
- Spark jdbc parallel read
- 추천시스템
- 앙상블
- 네트워크
- eda
- Python
- CF
- 데이터 분석
- Spark Data Read
- 랜덤포레스트
- Oracle ASSM
- airflow 정리
- Linux
- 통계분석
- git init
- 의사결정나무
- Spark 튜닝
- Today
- Total
[Alex] 데이터 장인의 블로그
[Python] - Selenium, webdriver 을 활용한 상가업소 폐점여부 데이터 크롤링 본문
상가업소 폐점여부 확인하기 < 국세청 홈택스 >
< 크롤러 제작 배경 >
프로젝트 진행 중, VAN 사업을 운영하는데 있어서 가맹점 상가업소의 폐업여부를 확인하는 것이 중요하다고 느꼈습니다. 30일 이상 장기로 실적이 없는 가맹점을 효율적으로 관리하기 위해서는 휴업인지, 폐업인지를 정확히 알아야하기 때문입니다. 물론 일일이 사업자분들께 전화나 문자를 보내 확인하는 방법도 있겠지만 아래와 같은 경우에는 확인하는 시간과 비용이 필요이상으로 많이 발생합니다.
공공데이터 포털에서 해당 정보를 얻을 수 있는 API가 있나 확인해봤지만 사업자 등록번호로 조회할 수 있는 기능은 제공하지 않았습니다.
열심히 서칭을 해본 결과,
국세청 홈택스에서 사업자등록번호를 통해 폐업여부를 확인할 수 있다는 것을 알게되었습니다.
위처럼 사업자 등록번호를 입력하면 해당 사업자의 과세유형, 그리고 폐점 유형이 나타나는 것을 확인하였습니다. 위와 같은 경우는 따로 API를 제공하지 않아 크롤링 프로그램 + 매크로 작업을 수행할 수 있는 프로그램을 제작해야 합니다.
또한 iframe을 사용하고 있어 일반적인 html 크롤러와는 다른방법으로(다른 라이브러리) 크롤러를 제작해야합니다.
저는 사업자등록 번호를 '입력'하고 폐업여부 등의 정보를 크롤링해서 가져오는 프로그램을 제작하였습니다.
입력값 : 사업자 등록 번호 (10자리 숫자)
산출값: 폐업여부 (String)
우선 selenium 라이브러리와 webdriver (Chrome)파일을 다운받아야 합니다.
pip install selenium
Tip : 현재 실행하고 있는 Chrome의 버전을 참고하여 webdriver를 다운받습니다.
예시 데이터입니다.
1. 필요한 라이브러리를 호출합니다.
from selenium import webdriver
import pandas as pd
import time
2. 데이터를 불러옵니다.(예시)
df = pd.read_csv("tmp_data.csv")
df
3. 이제 위에서 살펴본 페이지의 html 혹은 xml 구성을 살펴봅니다. 일단 저희가 필요한
- 가맹점 번호 입력(string)
- 결과 크롤링(string)
두가지 값의 위치를 알아보는 것이 중요합니다! html 구성을 아시는 분은 금방 찾겠지만 익숙치 않은 분들이 있을 수 있어 함께 살펴보겠습니다. F12 키를 누르고 내가 필요한 컴포넌트를 클릭하면 해당하는 html 값을 살펴볼 수 있습니다.
여기 위치를 표현하는 방식이 여러가지 있지만, 여기서는 가장 먼저 id 값 "bsno"이 보이니 해당 값을 활용하겠습니다. 오른쪽 마우스를 클릭한 뒤 copy element를 활용하는 방법도 있습니다.
차례로 조회하기, 결과값 위치 또한 파악해줍니다. 각각 아이디 값이 trigger5 와 grid2... 네요 !
이제 필요한 정보를 얻었으니 스크립트로 구현해보겠습니다.
4. 크롬드라이버를 호출하고 해당 URL을 저장합니다. GET 호출로 해당 홈페이지를 오픈합니다. tip 로딩시간을 고려하여 time.sleep 함수를 사용합니다.
driver = webdriver.Chrome("../chromedriver") # chromedriver.exe 파일 위치
url = "https://teht.hometax.go.kr/websquare/websquare.html?w2xPath=/ui/ab/a/a/UTEABAAA13.xml"
driver.get(url)
time.sleep(3)
5. 결과값을 받을 list를 호출하고 for 문을 사용하여 가맹점 번호 값을 하나씩 검사합니다. 스크립트는 아래와 같습니다.
result_list = []
for reg_no in df['가맹점 번호'] :
driver.find_element_by_id('bsno').send_keys(reg_no) # 가맹점 번호 입력칸
driver.find_element_by_id('trigger5').click() # 확인 버튼
time.sleep(2)
result = driver.find_element_by_id("grid2_cell_0_1").text # 결과값 리턴
print(result)
rst = None
if '폐업자' in result:
rst = '폐업/' + result.split("폐업일자:")[1].split(")")[0]
elif '일반과세자' in result:
rst = '일반'
else:
rst = '미등록'
result_list.append(rst)
time.sleep(5)
driver.close()
6. 결과 값을 pandas DataFrame 형태로 나타내주기 위해서 함수로 만들어주겠습니다. 리턴값 Series
def confirm_closure(df):
driver = webdriver.Chrome("../chromedriver") # chromedriver.exe 파일 위치
url = "https://teht.hometax.go.kr/websquare/websquare.html?w2xPath=/ui/ab/a/a/UTEABAAA13.xml"
driver.get(url)
time.sleep(3)
result_list = []
for reg_no in df['가맹점 번호'] :
driver.find_element_by_id('bsno').send_keys(reg_no) # 가맹점 번호 입력칸
driver.find_element_by_id('trigger5').click() # 확인 버튼
time.sleep(2)
result = driver.find_element_by_id("grid2_cell_0_1").text # 결과값 리턴
print(result)
rst = None
if '폐업자' in result:
rst = '폐업/' + result.split("폐업일자:")[1].split(")")[0]
elif '일반과세자' in result:
rst = '일반'
else:
rst = '미등록'
result_list.append(rst)
time.sleep(5)
driver.close()
return pd.Series(result_list)
7. 위에서 호출한 데이터 값(예시)로 잘 작동하는지 확인해보겠습니다.
df['결과'] = confirm_closure(df)
df
결과가 잘 나타납니다.
전체 스크립트입니다.
from selenium import webdriver
import pandas as pd
import time
df = pd.read_csv("tmp_data.csv")
print(df)
# 크롤링 프로그램 제작
def confirm_closure(df):
driver = webdriver.Chrome("../chromedriver") # chromedriver.exe 파일 위치
url = "https://teht.hometax.go.kr/websquare/websquare.html?w2xPath=/ui/ab/a/a/UTEABAAA13.xml"
driver.get(url)
time.sleep(3)
result_list = []
for reg_no in df['가맹점 번호'] :
driver.find_element_by_id('bsno').send_keys(reg_no) # 가맹점 번호 입력칸
driver.find_element_by_id('trigger5').click() # 확인 버튼
time.sleep(2)
result = driver.find_element_by_id("grid2_cell_0_1").text # 결과값 리턴
# print(result)
rst = None
if '폐업자' in result:
rst = '폐업/' + result.split("폐업일자:")[1].split(")")[0]
elif '일반과세자' in result:
rst = '일반'
else:
rst = '미등록'
result_list.append(rst)
time.sleep(5)
driver.close()
return pd.Series(result_list)
#함수 활용, 결과값 확인
df['결과'] = confirm_closure(df)
print(df)
감사합니다.
'Python' 카테고리의 다른 글
[Python] 데코레이터(Decorator) 사용하기 (0) | 2021.12.26 |
---|---|
[Python] python 라이브러리 오프라인 설치 (feat.pip) (0) | 2021.12.22 |
[Python] - 암호화 라이브러리 hashlib (0) | 2021.01.05 |
[Python] - 파이썬, SQL 연동하기 (0) | 2020.06.14 |
[Python] - 공공데이터 api 크롤링(날씨데이터 수집) (2) | 2020.04.25 |