import requests
from bs4 import BeautifulSoup

response = requests.post(tranUrl, headers=headers, data=data, verify=False)
soup = BeautifulSoup(response.content,"html.parser")
print(soup.find(id="tw-answ-target-text").text)
return soup.find(id="tw-answ-target-text").text

verify=False 설정으로 SSL오류를 해결하고 나면 이번에는 아래와 같은 경고가  표시됩니다.

InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.google.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(

인증서 검증으로 하라는 경고인데 아래와 같이 작성하며 경고를 숨길 수 있습니다.

import requests
from bs4 import BeautifulSoup
from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)          # InsecureRequestWarning 경고를 무시하도록 설정

response = requests.post(tranUrl, headers=headers, data=data, verify=False)
soup = BeautifulSoup(response.content,"html.parser")
print(soup.find(id="tw-answ-target-text").text)
return soup.find(id="tw-answ-target-text").text

from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)          # InsecureRequestWarning 경고를 무시하도록 설정

위 2개 코드를 추가하게 되면 해결됩니다.

◊  회사에서 Python / Request 를 사용하여 데이터 수집 프로그램을 만들다 보면 request 모듈 호출시 아래와 같은 오류를 만나게 됩니다. 그에 따른 오류 해결 방법 입니다.

url = "이런 저런 URL"
response = requests.post(url, headers=headers, data=data)
soup = BeautifulSoup(response.content,"html.parser")
print(soup.find(id="tw-answ-target-text").text)

 

◊ 오류 메시지

SSLError: HTTPSConnectionPool(host='www.google.com', port=443): Max retries exceeded with url: /async/translate?vet=eiv=1&yv=3&cs=1&_fmt=pc (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1133)')))

 

◊ 조치 방법

# verify=False 옵션을 지정해주면 SSL오류가 발생하지 않음
response = requests.post(url, headers=headers, data=data, verify=False)
soup = BeautifulSoup(response.content,"html.parser")
print(soup.find(id="tw-answ-target-text").text)

✔️ 모듈 사용

import pandas as pd
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager as fm
from sqlalchemy import create_engine
import urllib.parse

✔️ 추가 설정

np.set_printoptions(precision=3)            # 소수점 3번째 자리에서 반올림
pd.set_option('display.max_rows', None)     # Row 생략없이 출력
pd.set_option('display.max_columns', None)  # Column 생략없이 출력
pd.set_option('display.max_colwidth', None) # 컬럼의 내용이 길어도 생략없이 출력
pd.set_option('display.width', None)
pd.set_option('display.float_format', '{:.5f}'.format) # 8.500000e+01 이런 형식의 지수표현을 하고 싶지 않을 경우

 

✔️ DB 접속 및 쿼리 실행

# DB 접속 객체 생성
sqlEngine = create_engine("mysql+pymysql://root:Qwer1234%21%40%23%24@10.240.71.71:25000", encoding='utf8', pool_recycle=3600)
dbConnection = sqlEngine.connect()   # DB 접속
user_data = pd.read_sql("select * from a209.user_info where user_id = 'a209' ", dbConnection); # 쿼리 실행
dbConnection.close() # 접속 종료

 

외부 인터넷 접속이 되지 않는 환경에서  모듈을 설치하는 방법 입니다.

자주 사용하는 MySQL 모듈을 기준으로 설명드리겠습니다. 

1. https://pypi.org/ 사이트에 접속하여 다운받을 모듈과 버전 정보를 결정합니다.

    - https://pypi.org/project/PyMySQL/

    - https://pypi.org/project/PyMySQL/#history 버전 정보를 확인합니다.

 

2.  cmd를 실행하여 아래와 같이 모듈 정보를 입력합니다.

pip download -d ./ PyMySQL==1.0.1

    위와 같이 실행시 SSL  오류가 발생하며 다운로드가 안된다면 아래와 같이 실행합니다.

pip --trusted-host pypi.org --trusted-host files.pythonhosted.org download -d ./ PyMySQL

 

    - 버전을 명시하지 않을 경우 최신 버전이 다운로드 됩니다.

 

3. 파일을 폐쇄망으로 이동시킵니다.

 

4. 아래 명령어를 통해서 다운받은 모듈을 설치합니다.

pip install --no-index --find-links=./ PyMySQL          << 특정 위치의 모듈을 설치할 경우

pip install --no-index --find-links=./ PyMySQL==1.0.2   << 특정 버전의 모듈을 설치할 경우

pip install --no-index PyMySQL                          << 모듈이 위치한 폴더에서 실행할 경우

 

5. 설치된 모듈과 버전 정보를 확인합니다.

pip list

✳️ 첨부 파일은 Visual Studio 2017 프로젝트 파일입니다.

Python_Windows_Service.7z
0.09MB

Python으로 제작한 프로그램을 Windows Service로 만드는 가장 확실한 방법 입니다. 

준비물 : 

1. nssm : https://nssm.cc/download

 

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager Windows 10, Server 2016 and newer 2017-04-26: Users of Windows 10 Creators Update or newer should use prelease build 2.24-101 or any newer build to avoid an issue with services failing to start. If for some reason you

nssm.cc

➔ 테스트 Project 파일과 함께 첨부해 놓았으나 최신 버전이 필요하시면 위 링크에서 다운로드 하시면 됩니다.

 

Service 등록 절차

✔️ Python 예제 프로그램

#_*_ coding: utf-8 _*_
import os
import sys
import time
import logging
from datetime import datetime, timedelta

def init():
    current_directory = os.path.dirname(os.path.realpath(__file__)) # .py 파일 위치
    current_log_directory = os.path.join(current_directory, "Log")  # 생성할 로그 폴더
    try:
        if not os.path.exists(current_log_directory):   # 로그 폴더 존재여부 검사
            os.makedirs(current_log_directory)          # 폴더 생성
    except OSError:
        print('----------------- Error -----------------')
        return -1

    # 로그파일 설정
    now_date_str = datetime.now().strftime('%Y%m%d_%H%M%S') # 현재 시간을 파일명으로 사용
    errorlogfilename = os.path.join(current_log_directory , "Log_%s.log" % (now_date_str))  # 로그파일의 전체 경로

    # 로그파일 생성
    logging.basicConfig(
        filename=errorlogfilename, 
        level=logging.DEBUG, 
        format='[%(asctime)s][%(name)s][%(levelname)s] - %(message)s'
    )
    return 1

def main():

    # 1초마다 로그파일에 현재 시간을 기록
    for i in range(10):
        out_message = "Now Time : %s" % (datetime.now().strftime('%Y-%m-%d_%H:%M:%S'))
        logging.info("Now Time : %s" % (out_message))
        print("Now Time : %s" % (out_message))
        time.sleep(1)

    return

if __name__ == '__main__':
    if (init() >= 1):
        while True:
            main()
            time.sleep(10)  # 10초마다 main() 함수 실행
    else:
        print("Exit")

✔️ 관리자 권한으로 CMD를 실행하여 nssm이 보관된 폴더로 이동합니다.

✔️ nssm install [서비스명]을 입력합니다.

 

✔️ Path : Python 실행파일을 선택합니다. (Startup directory는 자동으로 채워집니다.)

     ex) C:\Users\kirum\AppData\Local\Programs\Python\Python39\python.exe

✔️ Arguments : xxxx.py 파일을 전체 경로를 입력합니다.

     ex) D:\T\Python_Windows_Service\Python_Windows_Service\Python_Windows_Service.py

✔️ Install service 클릭

 

✔️ 정상적으로 Service가 등록되었으며 시작/중지 모두 정상적으로 작동합니다.

Nifi 를 Windows Service로 등록 및 운용하는 방법입니다. 

Python Flask 프로그램의 경우도 동일한 방법으로 Service로 등록할 수 있습니다.

http://nssm.cc/

 

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager nssm is a service helper which doesn't suck. srvany and other service helper programs suck because they don't handle failure of the application running as a service. If you use such a program you may see a service lis

nssm.cc

- 저장한 NSSM 압축 파일의 압축을 해제합니다.

 

Nifi 서비스 등록 방법

1. 관리자 권한으로 CMD를 실행

2.  nssm 설치폴더 에서 nssm install [서비스명] 형태로 실행

3. 설정화면이 표시되면 Path의 선택버튼을 눌러 run-nifi.bat 파일을 선택

4. Install service 버튼을 눌러 서비스 등록 완료

5. 서비스 등록 확인

6. 서비스 관리자 에서는 nssm.exe를 실행하는것으로 보이지만 [레지스트리 편집기]를 보시면 nssm에 파라메터를 등록하여 nifi를 실행하고 있는것을 확인할 수 있습니다.

PC 재시작 / 서비스관리자를 통한 서비스 실행/중지 모두 정상적으로 동작하는것을 확인하였습니다.

 

Python Flask 웹 프로그램의 경우도 Python 파일을 실행하도록 xxx.bat 파일을 만들고

nssm으로 해당 xxx.bat 파일을 실행하도록 등록하면 됩니다.

'기타' 카테고리의 다른 글

[배터리] 18650 vs 14500 규격(사이즈)  (0) 2023.03.12
[가죽] 프레스  (0) 2023.03.10
Zotac egpu 와 2018 LG gram 연결 정보  (0) 2021.01.08
마우스 스위치 모음  (0) 2020.02.15
MAC PowerPoint 및 Word 의 탭 간격 조정 방법  (0) 2016.02.26

Excel 파일을 읽어 DB에 insert 하는 Python 소스 공유 드립니다.

Python 3.6, Eclipse 에서 작업 하였습니다.


> Eclipse Project : 엑셀 파일을 읽어 DB에 저장 


- main.py : 메인 함수

- ClsDB.py : db 작업

- ClsLogHandler.py : Excel_Insert_Err_Log 파일에 오류 로그 저장



> Python Module : 아래 2가지 모듈은 추가로 설치하셔야 합니다.

- PyMySQL : mysql DB 처리 관련 모듈, https://github.com/PyMySQL/PyMySQL

- openpyxl :  Excel 처리 모듈 , http://openpyxl.readthedocs.io/en/default/



> DB Table

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `TBL_STOCK` (
  `type_code` varchar(10NOT NULL,
  `basic_date` date NOT NULL,
  `open_value` float DEFAULT NULL COMMENT '시가',
  `high_value` float DEFAULT NULL COMMENT '고가',
  `low_value` float DEFAULT NULL COMMENT '저가',
  `close_value` float DEFAULT NULL COMMENT '종가',
  `adj_close_value` float DEFAULT NULL COMMENT '수정 주가',
  `volume_value` float DEFAULT NULL COMMENT '거래량',
  PRIMARY KEY (`type_code`,`basic_date`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
cs


> Source File Excel_Insert.zip


문의 및 의견은 댓글로 달아 주시길 바랍니다. 

코스피 증시 데이터를 수집하면서, CSV 파일을 DB에 등록할 필요가 있어 만들었습니다.


> 모듈 설명 : https://docs.python.org/3/library/csv.html


> Eclipse 에서 만들었으며, Pythoh 3.6 을 사용하였습니다.


  - main.py : CSV파일을 Read

  - DBCls : DB 처리

  - ClsLogHandler.py : 파일에 오류 로그 기록 


> Source File :        CSV_Insert.zip


질문이나 의견은 댓글로 부탁 드립니다. ^^


+ Recent posts