교재실습파일_04_나라장터공고.py
0.01MB

# import data handling libraries
import pandas as pd
import numpy as np


# 셀레니움 드라이버 임포트
import selenium

# 웹드라이버 임포트
from selenium import webdriver
from selenium.webdriver.common.by import By # WebDriverWait는 Selenium 2.4.0 이후 부터 사용 가능합니다.
from selenium.webdriver.support.ui import WebDriverWait  # expected_conditions는 Selenium 2.26.0 이후 부터 사용 가능합니다.
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import ElementNotVisibleException
from selenium.webdriver.common.keys import Keys

# BeautifulSoup 임포트 
from bs4 import BeautifulSoup

# time 임포트
import time

# 크롬 창 크기를 최대화 한다.
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
driver = webdriver.Chrome('chromedriver.exe',chrome_options=options)


#페이지수 
페이지수 = 5 # 이 부분은 about 개념이다. 

#페이지수로 loop
테이블_리스트 = []


for i in range(페이지수) :
    공고_URL = 'http://www.g2b.go.kr:8101/ep/tbid/tbidList.do?area=&bidNm=&bidSearchType=1&fromBidDt=2020%2F08%2F03&fromOpenBidDt=&instNm=&radOrgan=1&regYn=Y&searchDtType=1&searchType=1&taskClCds=5&toBidDt=2020%2F09%2F02&toOpenBidDt=&currentPageNo=' + str(i+1) +'&maxPageViewNoByWshan=2&'     
    driver.get(공고_URL)
#    테이블 = driver.find_element_by_class_name('table_list_tbidTbl').click()
    테이블_바디 = driver.find_element_by_xpath('//*[@id="resultForm"]/div[2]/table/tbody')
    테이블_바디_행 = 테이블_바디.find_elements_by_tag_name("tr")

    for idx, value in enumerate(테이블_바디_행):
        데이터_0 = value.find_elements_by_tag_name("td")[0]
        데이터_1 = value.find_elements_by_tag_name("td")[1]
        데이터_2 = value.find_elements_by_tag_name("td")[2]
        데이터_3 = value.find_elements_by_tag_name("td")[3]
        데이터_4 = value.find_elements_by_tag_name("td")[4]
        데이터_5 = value.find_elements_by_tag_name("td")[5]
        데이터_6 = value.find_elements_by_tag_name("td")[6]
        데이터_7 = value.find_elements_by_tag_name("td")[7]
        데이터_8 = value.find_element_by_tag_name('a')
    
        print(데이터_0.text, 
              데이터_1.text,
              데이터_2.text,
              데이터_3.text,
              데이터_4.text,
              데이터_5.text,
              데이터_6.text,
              데이터_7.text,
              데이터_8.get_attribute('href'))
        테이블_리스트 = 테이블_리스트 + [[데이터_0.text, 데이터_1.text, 
                                 데이터_2.text, 데이터_3.text, 
                                 데이터_4.text, 데이터_5.text, 
                                 데이터_6.text, 데이터_7.text.split('\n')[0], 
                                 데이터_7.text.split('\n')[1],
                                 데이터_8.get_attribute('href') ]]    

# 결과를 엑셀로 저장하기 : list of list 는 from_records() 함수를 이용한다. 
df_조회결과 = pd.DataFrame.from_records(테이블_리스트, columns=['업무', 
                                                   '공고번호', 
                                                   '분류', 
                                                   '공고명', 
                                                   '공고기관', 
                                                   '수요기관', 
                                                   '계약방법', 
                                                   '입력일시', 
                                                   '입찰마감일시',
                                                   '원문주소'] )


# 입력일시로 내림차순
df_조회결과 = df_조회결과.sort_values(by = ['입력일시'], ascending = False)


# 최근공고일시.txt에서 입력된 공고일시를 임시 변수로 저장한다.
f = open("최근공고일시.txt", 'r')
구_공고일시 = f.readline()
print(구_공고일시)
f.close()


# 구_공고일시 이후 공고만 데이터프레임으로 남기기
for i in range(len(df_조회결과))[::-1]:
    if df_조회결과.iloc[i]['입력일시'] <= 구_공고일시 :
        df_조회결과 = df_조회결과.drop(i)
        
# 공고 상세 URL에 반복해서 접속하고 첨부파일 다운로드 받기
for i in range(len(df_조회결과)):
    공고_URL = df_조회결과.iloc[i]['원문주소'] 
    driver.get(공고_URL)
    
    # 테이블을 클래스 이름으로 찾는다.
    try :
        테이블_1 = driver.find_element_by_class_name('table_list_attchFileTbl') #element 단수 조심
    
        if "첨부된 파일이 없습니다" in 테이블_1.text:
            continue 
    
        else :
            테이블_1_바디 = 테이블_1.find_element_by_tag_name("tbody")  #element 단수 조심
            테이블_1_바디_행 = 테이블_1_바디.find_elements_by_tag_name("tr") #elements 복수 조심

            for idx, value in enumerate(테이블_1_바디_행):
                파일명 = value.find_elements_by_tag_name("td")[2]
                if 파일명.text[-4:] != 'html' :
                    파일명.find_element_by_tag_name("a").click()
                    time.sleep(1)
                    
    except :
        continue 

# 
import os
import shutil
from os import listdir
from os.path import isfile, join

#
pd.set_option('display.max_columns', None)  

# 사용자 정의 함수
def getFileList(path):
    return [[join(path,i),i] for i in listdir(path) if isfile(join(path,i))]

files =getFileList("C:/Users/사용자명/Downloads/") # 자신의 path로 수정해야 한다
#print(files)
df_다운로드파일 = pd.DataFrame(files,columns = ['path','파일명'])
print(df_다운로드파일)

#다운로드파일 = Table(data = df_다운로드파일)

# 공고파일 path 찾기 : DrProof가 파일명에 포함된 것만 찾기
공고파일_path = []

for i in df_다운로드파일['path'] :
    if any(j in i for j in df_조회결과['공고번호']) :
        공고파일_path = 공고파일_path + [i]

# 디렉토리 생성
베이스_디렉토리 = os.getcwd()

for i in df_조회결과['공고번호'] :
    path = join(베이스_디렉토리, i)
    os.mkdir(path)


for i in 공고파일_path :
    shutil.move(i, 베이스_디렉토리+"\\"+i[24:38])  # i의 슬라이싱 부분은 예를 들어, 20200902695-00 형태가 되도록 시작되는 위치와 종료되는 위치를 수정해야 할 필요가 있다.

첨부파일 

사업자번호.xlsx
0.01MB
국세청사업자휴폐업조회.py
0.00MB

# 셀레니움 드라이버 임포트
import selenium

# 웹드라이버 임포트
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# time 임포트
import time

# 크롬 창 크기를 최대화 한다.
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
driver = webdriver.Chrome('chromedriver.exe',chrome_options=options)

#
driver.get('https://teht.hometax.go.kr/websquare/websquare.html?w2xPath=/ui/ab/a/a/UTEABAAA13.xml')

# 엑셀을 데이터프레임으로 
사업자 = pd.read_excel('사업자번호.xlsx')

# 사업자번호 
테이블_리스트 = []
for i in range(len(사업자)):
    사업자번호 = 사업자.iloc[i]['사업자번호']

    # 사업자번호 카피하여 붙이기
    elem = driver.find_element_by_xpath('//*[@id="bsno"]')
    elem.send_keys(사업자번호)
    
    # 시간 주기
    time.sleep(4.5)
    driver.find_element_by_xpath('//*[@id="trigger5"]').click()

    # 테이블_바디로 이동
    테이블_바디 = driver.find_element_by_xpath('//*[@id="grid2_body_tbody"]')
    time.sleep(1)
    print(테이블_바디.text)
    
    테이블_바디_쪼개기 = 테이블_바디.text.split(" ")
    
    테이블_리스트 = 테이블_리스트 + [[테이블_바디_쪼개기[0], " ".join(테이블_바디_쪼개기[1:-1]), 테이블_바디_쪼개기[-1]]]
    
# 결과를 엑셀로 저장하기 : list of list 는 from_records() 함수를 이용한다. 
df = pd.DataFrame.from_records(테이블_리스트, columns=['사업자등록번호', '과세여부', '조회일'] )


import xlwings as xw
xw.view(df)

시청률검색.py
0.00MB

# 셀레니움 드라이버 임포트
import selenium

# 웹드라이버 임포트
from selenium import webdriver

# pyautogui 임포트
#import pyautogui as p

# time 임포트
import time

# 크롬 창 크기를 최대화 한다.
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
driver = webdriver.Chrome('chromedriver.exe',chrome_options=options)

#원하는 URL 접속한다.
driver.get('http://www.daum.net')


# 검색창 클릭
검색어 = '시청률'
driver.find_element_by_xpath('//*[@id="q"]').send_keys(검색어)


#검색버튼 누르기 
driver.find_element_by_xpath('//*[@id="daumSearch"]/fieldset/div/div/button[2]').click()
time.sleep(1)

# 일일시청률 버튼 누르기
driver.find_element_by_xpath('//*[@id="jupTvRatingColl"]/div[2]/div[1]/div[1]/ul/li[1]/a').click()
time.sleep(1)


# 일일시청률 테이블 형식의 text 갖고 오기
시청률_텍스트 = driver.find_element_by_xpath('//*[@id="jupTvRatingColl"]/div[2]/div[1]/div[3]/div/table/tbody').text


time.sleep(1)
tmp = [i.split() for i in 시청률_텍스트.split('\n')]
tmp_1 = [tmp[i]+tmp[i+1] for i in range(0,len(tmp),2)]
테이블_리스트 = [[tmp_1[i][0]," ".join(tmp_1[i][1:-2]),tmp_1[i][-2],tmp_1[i][-1]] for i in range(len(tmp_1))]

time.sleep(1)
df = pd.DataFrame.from_records(테이블_리스트, columns=['순위', '프로그램', '채널', '시청률'])

import xlwings as xw

xw.view(df)

+ Recent posts