data analysis & visualization

크롤링의 종류와 개요는 아래에 포스팅 해두었으니, 궁금하신 분은 먼저 읽고 오기를 바란다.

pycj92.tistory.com/16

 

크롤링과 python

크롤링, 스크래핑 데이터 분석의 자료수급을 위해 요즘 같이 활용되는 기술로 크롤링이라 부르는 기술이 있다. 크롤링은 크롤러가 웹을 돌아다니는 작업을 말하고, 스크래핑은 크롤러를 통해

pycj92.tistory.com

사용될 패키지

크롤링에 사용될 패키지는 다음과 같으며, 간단한 용도는 다음과 같다.

자료 저장 경로나 디렉토리조회 관련 용도의 os 패키지
자료 추출을 위한 re 패키지
크롤러에 지연을 주기위한 time 패키지
원하는 곳으로 파일 이동을 위한 shutil 패키지
사용하지는 않았지만, 향후 자동로그인을 위한 threading 패키지
마지막으로 크롤링에 사용되는 selenium 패키지

import os
import re
import warnings
from time import sleep
import pandas as pd
import shutil
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
import threading 

 

사용 환경 설정

본격적인 크롤링에 앞서, 환경을 세팅해보자. 

환경을 세팅하기 위해서는 크롬드라이버를 별도로 다운로드 받아야하는데 사용하고 있는

크롬의 버전과 동일해야 한다. 

아래는 크롬드라이버의 버전을 확인하는 과정이다. 

 

현재 내 컴퓨터는 89.0 버전이라는 것을 확인할 수 있다. 

아래 링크는 크롬드라이버를 설치할 수 있는 사이트이다. 해당 사이트에서 내 버전인 89.0 windows 버전으로 다운받자.

chromedriver.chromium.org/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

chromedriver.chromium.org

다운 받았다면, 다운받은 chromedriver.exe파일을 자주사용하는 경로로 이동시키도록 하자
(나는 c:/selenium으로 설정함, c:/selenium/chromedriver.exe) 

본격적인 크롤링

간략히 설명하자면, driver_path는 chrome driver의 경로를 의미하며, download_path는
인터넷의 자동 다운로드 경로를 의미한다. 

setting함수를 사용하게 되면, 기상자료개방포털 홈페이지로 이동하게 된다.
login 함수를 사용하게 되면, login을 수행하며, 성공하면 True를 반환한다.
logout 함수를 사용하게 되면, logout을 수행하며, 성공하면 True를 반환한다.
close와 quit함수는 인터넷창을 닫는다. 

 

class KMA:
    def __init__(self,driver_path=r'c:\selenium\chromedriver.exe',
    	download_path=r'D:\downloads',options = Options(),time=5):
        self.down_dir=download_path
        self.driv_path=driver_path
        self.options=options
        options.add_experimental_option("prefs", {
            "download.default_directory": self.down_dir})
        self.time=time
        self.thread=threading.Timer(time,self.auto_login)
        
    def setting(self):
        try:
            self.driver.quit()
        except:
            1
        self.driver= webdriver.Chrome(self.driv_path, options=self.options)
        self.driver.get('https://data.kma.go.kr/cmmn/main.do')
        
    def login(self,kma_id,kma_pass):
        try:
            self.driver.maximize_window()
            self.driver.find_element_by_css_selector('a#loginBtn').click()
            self.driver.find_element_by_css_selector('input#loginId.inp').send_keys(kma_id)
            self.driver.find_element_by_css_selector('input#passwordNo.inp').send_keys(kma_pass)
            self.driver.find_element_by_css_selector('button#loginbtn.btn_login').click()
            return True
        except:
            print('이미 로그인 중입니다.')
            return False
    def logout(self):
        try:
            self.driver.maximize_window()
            self.driver.find_element_by_css_selector('a#logoutBtn').click()
            return True
        except:
            print('이미 로그아웃 되어있습니다.')
            return False

    def close(self):
        self.driver.close()
    def quit(self):
        self.driver.quit()
    

login, logout 을 매번 수행하기 귀찮으므로 login_loof함수를 사용하게 되면 다시 로그인을 수행한다.

 

auto_login, start, cancel함수는 현재 수정중이다.

download는 자료를 다운로드 받는 함수이다.
data_type은 지상기상관측자료와 해양자료 즉, Aws, Asos, Agr, FargoBuoy, Buoy, Rh가 될수 있으며,
new_path는 최종적으로 저장될 경로를 의미하고, time_type은 시간자료, 분자료, 일자료 등이 될 수 있다. 

    def login_loof(self,kma_id,kma_pass):
        self.logout()
        self.login(kma_id,kma_pass)
            
    def auto_login(self,kma_id,kma_pass):
        self.login_loof(kma_id,kma_pass)
        self.thread=threading.Timer(self.time,self.auto_login)
        self.thread.start()

    def start(self):
        self.thread.start()

    def cancel(self):
        self.thread.cancel()
        
    def download(self,data_type,download_day,new_path,query,time_type='시간 자료'):
        """ 사이트 이동 """
        try:
            if data_type in ['Aws','Asos','Agr']:#Asos,Aws,Agr
                self.driver.get(f'https://data.kma.go.kr/data/grnd/select{data_type}RltmList.do?pgmNo=')
            elif data_type in ['FargoBuoy','Buoy','Rh']:#data_type='FargoBuoy'#Buoy,lb(Rh),FargoBuoy
                self.driver.get(f'https://data.kma.go.kr/data/sea/select{data_type}RltmList.do?pgmNo=')
            else:
                raise
        except:
            print('Asos, Aws, Agr, FargoBuoy, Buoy, Rh')
        """ 시간 타입 """
        Select(self.driver.find_element_by_id('dataFormCd')).select_by_visible_text(time_type)
        """ 변수 선택 """
        self.driver.find_element_by_id('ztree1_1_check').click()
        
        """ 전체 지점 선택 """
        if self.driver.find_element_by_css_selector('a#ztree_1_check').get_attribute('title')=='전체선택 안됨':
            self.driver.find_element_by_css_selector('a#ztree_1_check').click()
        
        """ 시작 기간 설정 """
        self.driver.execute_script('document.querySelector("input[id=startDt_d]").removeAttribute("readonly")')
        self.driver.execute_script(f'document.querySelector("input[id=startDt_d]").value = "{query}"')
        
        """ 끝 기간 설정 """
        self.driver.execute_script('document.querySelector("input[id=endDt_d]").removeAttribute("readonly")')
        self.driver.execute_script(f'document.querySelector("input[id=endDt_d]").value = "{query}"')
        
        if time_type=='시간 자료':
            self.driver.find_element_by_xpath(f'//select[@name="startHh"]/option[@value="{st_time}"]').click()
            self.driver.find_element_by_xpath(f'//select[@name="endHh"]/option[@value="{ed_time}"]').click()
        
        """ 조회 """
        self.driver.execute_script('goSearch();')
        sleep(1)
        if data_type=='FargoBuoy':
            pd.read_html(self.driver.find_elements_by_css_selector('table.tbl')[0].get_attribute('outerHTML'))
        else:
            pd.read_html(self.driver.find_elements_by_css_selector('table.tbl')[1].get_attribute('outerHTML'))
        
        """ 다운로드 """ 
        self.driver.execute_script('downloadRltmCSVData();')
        sleep(1)
        try:
            self.driver.find_element_by_css_selector('div#divPopupTemp.back_layer').get_attribute('id')
            self.driver.find_element_by_id("reqstPurposeCd7").click()
        except:
            1
        self.driver.execute_script('fnRltmRequest();')
        #A.quit()
        
        before_files=[i for i in os.listdir(self.down_dir) if re.compile('.csv').findall(i)]
        
        before=(len(before_files))
        sleep(5)
        after_files=[i for i in os.listdir(self.down_dir) if re.compile('.csv').findall(i)]
        after=(len(after_files))
        if before!=after:
            down_file=list(set(after_files)-set(before_files))[0]
            shutil.move(f'{self.down_dir}/{down_file}',new_path)

                        

자료를 하루만 받을게 아니라서, download_range함수를 만들었다. 
n_download_login_loof는 '자료를 몇개 받았을 때 재로그인할지'에서 몇개를 의미한다(default : 20)
over_write는 기존에 같은 자료가 있으면, 넘어갈지 덮어쓸지를 의미한다.

    def download_range(self,date_list,data_type,kma_id,kma_pass,\
                       n_download_login_loof=20,st_time='00',ed_time='23',time_type='시간 자료',\
                       down_dir='d:/downloads/aws',over_write=False):
        _n_download_login_loof=0
        down_error=list()
        old_down_dir=os.listdir(down_dir)
    
        for download_day in date_list:
            _n_download_login_loof=_n_download_login_loof+1
            if _n_download_login_loof%n_download_login_loof==1:
                self.login_loof(kma_id,kma_pass)
                sleep(3)
            query=download_day.strftime('%Y%m%d')
            move_file_name=f'{data_type}_{query}_{time_type}.csv'
            new_path = f'{down_dir}/{move_file_name}'
            n_download_login_loof=n_download_login_loof+1

            if over_write==False:
                if not move_file_name in old_down_dir:
                    try:
                        print(download_day)
                        self.download(data_type,download_day,new_path,query,time_type)
                    except:
                        down_error.append(download_day)
            else:
                try:
                    print(download_day)
                    self.download(data_type,download_day,new_path,query,time_type)
                except:
                    down_error.append(download_day)
        return down_error

    def date_to_filename(self,date_list,down_dir, data_type, time_type):
        return [f'{data_type}_{i.strftime("%Y%m%d")}_{time_type}.csv' for i in date_list]


 

대충 사용방법은 아래를 따라하면 된다.

A=KMA(time=60*3,download_path=r'D:\downloads\temp')
#A=KMA(time=60*3)
A.setting()
A.login_loof(kma_id=아이디,kma_pass=비밀번호)
start_day = '2010-01-01';end_day = '2020-12-31';data_type='Asos'#Asos,Aws
st_time='00';ed_time='23';time_type='시간 자료';down_dir='d:/downloads/asos';over_write=False
start_day = pd.Timestamp(start_day)
end_day = pd.Timestamp(end_day)
date_list=pd.date_range(start_day,end_day,freq='d')
#start_day = pd.Timestamp(start_day)
#download_day=start_day 
#query=download_day.strftime('%Y%m%d')
#move_file_name=f'{data_type}_{query}_{time_type}.csv'
#new_path = f'{down_dir}/{move_file_name}'
#A.download(data_type,download_day,new_path)
down_error_list=A.download_range(date_list,data_type,n_download_login_loof=20,\
                                 kma_id=아이디,kma_pass=비밀번호,down_dir='d:/downloads/asos')

#query=download_day.strftime('%Y%m%d')
set(A.date_to_filename(date_list, down_dir, data_type, time_type))-set(os.listdir(down_dir))
A.quit()

 

'python > crawling' 카테고리의 다른 글

크롤링과 python  (0) 2021.04.03
python selenium 자주쓴거 정리  (0) 2020.03.23
나라장터 open api crawling  (0) 2020.03.01
[나라장터] 크롤링  (2) 2019.11.14
selenium 사용해서 위경도 가져오기  (0) 2019.03.20

크롤링, 스크래핑

데이터 분석의 자료수급을 위해 요즘 같이 활용되는 기술로 크롤링이라 부르는 기술이 있다. 

크롤링은 크롤러가 웹을 돌아다니는 작업을 말하고, 스크래핑은 크롤러를 통해 자료를 수집하는 것을 의미한다.

물론 이게 완벽한 정의라고는 할 수 없을지도 모른다.

본론으로 들어가서 크롤링에는 동기식, 비동기식이 있다.

Python에서는 requests, urllib, BeautifulSoup, Selenium, Scrapy 등 이 대표적이다.

크게 웹을 이용하는 selenium을 활용하는 크롤링을 동적크롤링,

requests, urllib, BeautifulSoup을 활용한 크롤링을 정적 크롤링이라고 표현한다.

 

BeautifulSoup, requests, urllib 패키지

해당 패키지는 HTML, XML파일의 정보를 추출해주는 파이썬 패키지이다. 

다소 안정적이고 빠르나, javascript가 필요한 크롤링이 제한된다. 

 

Selenium 패키지

해당 패키지는 인터넷 브라우저를 통해 정보를 추출해주는 패키지이다.

실제 인터넷을 사용하므로, 다소 불안정하나, Javascript가 필요한 크롤링이 수월하다.

 

'python > crawling' 카테고리의 다른 글

[Selenium] 기상자료 크롤링  (1) 2021.04.03
python selenium 자주쓴거 정리  (0) 2020.03.23
나라장터 open api crawling  (0) 2020.03.01
[나라장터] 크롤링  (2) 2019.11.14
selenium 사용해서 위경도 가져오기  (0) 2019.03.20

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
import time
import os
import shutil
import re
import pandas as pd
directory=r'<저장될 경로>'
options = webdriver.ChromeOptions()
############
# 창이 뜨지 않게 설정
options.add_argument('headless')
# 창 크기 조절 설정
options.add_argument('window-size=1920x1080') 
options.add_argument("disable-gpu")
# F11 전체 화면 설정
options.add_argument('--start-fullscreen')
###############
# 기본 다운로드 경로 설정 /쓰지 말고 \\로 사용할 것.
options.add_experimental_option("prefs", {
  "download.default_directory": directory,
  "download.prompt_for_download": False,
  "download.directory_upgrade": True,
  "safebrowsing.enabled": True
})
#웹 열기
driver = webdriver.Chrome(executable_path='c:/selenium/chromedriver', chrome_options=options)

#될때까지 기다리게하기
wait= WebDriverWait(driver, 10)
temp2=wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "input#ststistic_period")))

#alert 팝업 확인하기
Alert(driver).text
#case 1
alert = driver.switch_to.alert
alert.accept()
#case 2
Alert(driver).accept()

#iframe 이동하기
# 상위로 이동
driver.switch_to.default_content()
driver.switch_to.frame(<iframe name>)

#iframe은 아닌데 비슷한게 있는듯.( 예 : chrome download)
shadow_root = driver.execute_script('return arguments[0].shadowRoot', <element>)

#select 버튼에 값 입력
Select(driver.find_element_by_css_selector(<CSS>)).select_by_value(<value>)

#캡처 
driver.get_screenshot_as_file('<파일명>.png')

#driver 내에 열린 창 목록 가져오기
main=driver.window_handles[0]
#사용중인 창 바꾸기
driver.switch_to.window(driver.window_handles[pop])

#자바스크립트 보내기
driver.execute_script('$javascript:doSelect();')

#요소로 마우스 이동시키기
action=ActionChains(driver)
action.move_to_element(mainmenu)        

 

그 외 참고

http://seiyria.com/bootstrap-slider/#example-1

'python > crawling' 카테고리의 다른 글

[Selenium] 기상자료 크롤링  (1) 2021.04.03
크롤링과 python  (0) 2021.04.03
나라장터 open api crawling  (0) 2020.03.01
[나라장터] 크롤링  (2) 2019.11.14
selenium 사용해서 위경도 가져오기  (0) 2019.03.20

Untitled4
In [1]:
import pandas as pd
from bs4 import BeautifulSoup
import requests
import urllib
from urllib import parse
from datetime import datetime, timedelta
from datetime import date
import re 
import math
In [2]:
today = date.today()
start=re.sub('-','',str(today - timedelta(days=60)))
end=re.sub('-','',str(today))

priceUp=2000000
priceDown=200000000000
key='오픈api'
In [4]:
link='http://apis.data.go.kr/1230000/BidPublicInfoService/getBidPblancListInfoServcPPSSrch?type=json&inqryDiv=1&dminsttNm='+parse.quote('해양수산부')+'&inqryBgnDt='+start+'&inqryEndDt='+end+'&pageNo=1&numOfRows=1&ServiceKey='+key
url = parse.urlparse(link) 
query = parse.parse_qs(url.query)
base='http://apis.data.go.kr/1230000/BidPublicInfoService/getBidPblancListInfoServcPPSSrch?'
link=base+parse.urlencode(query, doseq=True)
In [5]:
request=urllib.request.urlopen(link).read().decode('utf-8')
n=math.ceil(json.loads(request)['response']['body']['totalCount']*.1)
n
Out[5]:
70
In [6]:
page=1
link='http://apis.data.go.kr/1230000/BidPublicInfoService/getBidPblancListInfoServcPPSSrch?type=json&inqryDiv=1&dminsttNm='+parse.quote('해양수산부')+'&inqryBgnDt='+start+'&inqryEndDt='+end+'&pageNo='+str(page)+'&numOfRows=10&ServiceKey='+key
url = parse.urlparse(link) 
query = parse.parse_qs(url.query)
link=base+parse.urlencode(query, doseq=True)
request=urllib.request.urlopen(link).read().decode('utf-8')
df=pd.DataFrame(json.loads(request)['response']['body']['items'])
df2=df[['bidNtceNm','asignBdgtAmt','bidBeginDt','bidClseDt','opengDt','bidMethdNm','cntrctCnclsMthdNm','dminsttNm','dminsttCd','bidNtceNo','reNtceYn','ntceKindNm','bidNtceDtlUrl']]
df2.rename(columns = {'asignBdgtAmt' : '배정예산','bidNtceNm':'공고명','bidBeginDt':'입찰개시일','bidClseDt':'입찰마감일'
                  ,'opengDt':'개찰일시','bidMethdNm':'입찰방식','cntrctCnclsMthdNm':'계약체결방법','dminsttCd':'수요기관코드'
                 ,'dminsttNm':'수요기관명','bidNtceNo':'입찰공고번호','reNtceYn':'재공고여부','ntceKindNm':'공고종류','bidNtceDtlUrl':'링크'}, inplace = True)
data=df2
/root/anaconda3/envs/jupyter/lib/python3.6/site-packages/pandas/core/frame.py:4133: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  errors=errors,
In [7]:
data
Out[7]:
공고명 배정예산 입찰개시일 입찰마감일 개찰일시 입찰방식 계약체결방법 수요기관명 수요기관코드 입찰공고번호 재공고여부 공고종류 링크
0 2020~2021년 사무기기 유지보수 용역(재공고) 192000000 2020-01-07 10:00:00 2020-01-13 14:00:00 2020-01-13 15:00:00 전자입찰 제한(총액)협상에의한계약 해양수산부 1192000 20191239804 N 변경 http://www.g2b.go.kr:8081/ep/invitation/publis...
1 2020년 해양안전종합정보시스템(GICOMS) 유지보수 및 운영 435593200 2020-01-08 10:00:00 2020-01-14 10:00:00 2020-01-14 11:00:00 전자입찰 제한(총액)협상에의한계약 해양수산부 1192000 20200100306 Y 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
2 2020년 실시간 해양환경 어장정보시스템 유지보수 351647806 2020-01-07 10:00:00 2020-01-07 12:00:00 2020-01-07 13:00:00 전자시담 수의(총액) 해양수산부 국립수산과학원 1192266 20200100313 N 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
3 2020년도 로란-C 시설장비 유지보수 용역(긴급) 40000000 2020-01-08 10:00:00 2020-01-14 10:00:00 2020-01-14 11:00:00 전자입찰 제한(총액)협상에의한계약 해양수산부 국립해양측위정보원 1192464 20191243271 N 긴급 http://www.g2b.go.kr:8081/ep/invitation/publis...
4 2020년도 항로표지 전산관리시스템 유지관리 용역 121344200 2020-01-10 10:00:00 2020-01-14 10:00:00 2020-01-14 11:00:00 전자입찰 제한(총액)협상에의한계약 해양수산부 여수지방해양수산청 1192359 20200101328 Y 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
5 평택·당진항 중앙집중형 종합보안시스템 유지보수 용역 191929400 2020-01-10 10:00:00 2020-01-14 10:00:00 2020-01-14 11:00:00 전자입찰 제한(총액)협상에의한계약 해양수산부 평택지방해양수산청 1192365 20200101339 Y 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
6 2020년도 항만보안 종합감시시스템 유지보수 용역 141511400 2020-01-10 12:00:00 2020-01-14 12:00:00 2020-01-14 13:00:00 전자입찰 제한(총액)협상에의한계약 해양수산부 부산지방해양수산청 제주해양수산관리단 1192373 20200101590 Y 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
7 2020년도 항로표지 관리시스템 유지보수 용역 98250000 2020-01-03 20:00:00 2020-01-13 10:00:00 2020-01-13 11:00:00 전자입찰 제한(총액) 해양수산부 부산지방해양수산청 1192357 20200102162 N 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
8 포항 영일만항 해경부두 축조공사 기본 및 실시설계용역 1710000000 2020-01-20 16:00:00 직찰 제한경쟁 해양수산부 포항지방해양수산청 1192364 20200102532 N 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
9 울릉군 남양1리 연안정비사업 실시설계용역 780000000 2020-01-20 16:00:00 직찰 제한경쟁 해양수산부 포항지방해양수산청 1192364 20200102573 N 일반 http://www.g2b.go.kr:8081/ep/invitation/publis...
In [ ]:
 

'python > crawling' 카테고리의 다른 글

[Selenium] 기상자료 크롤링  (1) 2021.04.03
크롤링과 python  (0) 2021.04.03
python selenium 자주쓴거 정리  (0) 2020.03.23
[나라장터] 크롤링  (2) 2019.11.14
selenium 사용해서 위경도 가져오기  (0) 2019.03.20

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import pandas as pd 
import datetime
import time
import os
times=20
while True:
    if(str(datetime.datetime.now())[11:13]=='10'):
        
        times=20
        print(times)
        if(not(str(datetime.datetime.now())[0:10].replace('-','')+'.csv' in os.listdir('G:/내 드라이브'))):
            times=50
            print(times)
            driver=webdriver.Chrome('c:/selenium/chromedriver')
            results=[]
            querylist=['홈페이지','플랫폼','포털','시스템','구축','빅데이터','산학협력','산학포털','LINC','업무지원','평생교육','솔루션']
            querylist2=['중앙신체검사소','한국감정원','한국교육학술정보원','한국산업단지공단','한국사학진흥재단','한국산업기술평가관리원','한국가스공사','신용보증기금','중앙119구조본부','한국정보화진흥원','중앙교육연수원','한국장학재단','대구경북첨단의료산업진흥재단','의료기술시험훈련원','한국뇌연구원','한의기술응용센터','한국도로공사','한국건설관리공사','교통안전공단','국립농산물품질관리원','농림축산검역본부','국립종자원','한국전력기술','대한법률구조공단','우정사업조달사무소','기상통신소','조달품질원','한국법무보호복지공단','에너지경제연구원','근로복지공단','노동부고객상담센터','한국산업인력공단','한국산업안전보건공단','국립재난안전연구원','한국동서발전','한국석유공사','한국에너지공단','한국토지주택공사','주택관리공단','한국시설안전공단','중소기업진흥공단','한국산업기술시험원','한국세라믹기술원','한국남동발전','한국승강기안전관리원','국방기술품질원','중앙관세분석소','한국저작권위원회','대구광역시','대구광역시교육청','대구광역시교육연구정보원','경상북도교육청','경상북도교육연구원','경상북도교육정보센터','국립대구과학관']
            n=len(querylist)*len(querylist2)
            t=0
            try:
                for query in querylist:
                    for query2 in querylist2:
                        t=t+1
                        driver.get('http://www.g2b.go.kr:8101/ep/tbid/tbidFwd.do')
                        
                        # 업무 종류 체크
            #            task_dict = {'용역': 'taskClCds5', '민간': 'taskClCds20', '기타': 'taskClCds4'}
            #            for task in task_dict.values():
            #                checkbox = driver.find_element_by_id(task)
            #                checkbox.click()
            
                        instNm=driver.find_element_by_id('instNm')
                        instNm.clear()
                        instNm.send_keys(query2)
                        instNm.send_keys(Keys.RETURN)
                        # 입찰정보 검색 페이지로 이동
                        
                        # 검색어
                        # id값이 bidNm인 태그 가져오기
                        bidNm = driver.find_element_by_id('bidNm')
                        # 내용을 삭제 (버릇처럼 사용할 것!)
                        bidNm.clear()
                        # 검색어 입력후 엔터
                        bidNm.send_keys(query)
                        bidNm.send_keys(Keys.RETURN)
                        # 검색 조건 체크
                        option_dict = {'검색기간 1달': 'setMonth1_1', '입찰마감건 제외': 'exceptEnd'}
                        for option in option_dict.values():
                            checkbox = driver.find_element_by_id(option)
                            checkbox.click()
                        # 목록수 100건 선택 (드롭다운)
                        recordcountperpage = driver.find_element_by_name('recordCountPerPage')
                        selector = Select(recordcountperpage)
                        selector.select_by_value('100')
                        # 검색 버튼 클릭
                        search_button = driver.find_element_by_class_name('btn_mdl')
                        search_button.click()
                        # 검색 결과 확인
                        elem = driver.find_element_by_class_name('results')
                        div_list = elem.find_elements_by_tag_name('div')
                        # 검색 결과 모두 긁어서 리스트로 저장
                        #results.append(query)
                        #if len(div_list)!=0:
                        #    results.append(query)
                        for div in div_list:
                            results.append(div.text)
                            a_tags = div.find_elements_by_tag_name('a')
                            if a_tags:
                                for a_tag in a_tags:
                                    link = a_tag.get_attribute('href')
                                    results.append(link)
                        # 검색결과 모음 리스트를 12개씩 분할하여 새로운 리스트로 저장 
                        #result = [results[i * 13:(i + 1) * 13] for i in range((len(results) + 13 - 1) // 13 )]
                        result = [results[i * 12:(i + 1) * 12] for i in range((len(results) + 12 - 1) // 12 )]
                        # 결과 출력
                        print(round(t/n*100,2))
                        #print(result)
            except Exception as e:
                # 위 코드에서 에러가 발생한 경우 출력
                print(e)
            finally:
                # 에러와 관계없이 실행되고, 크롬 드라이버를 종료
                driver.quit()
            
            
            my_df=pd.DataFrame(result)
            my_df.to_csv('G:/내 드라이브/test.csv',index=False,header=False,encoding='cp949')
            my_df.to_csv('G:/내 드라이브/'+str(datetime.datetime.now())[0:10].replace('-','')+'.csv',index=False,header=False,encoding='cp949')
    time.sleep(60*times)

'python > crawling' 카테고리의 다른 글

[Selenium] 기상자료 크롤링  (1) 2021.04.03
크롤링과 python  (0) 2021.04.03
python selenium 자주쓴거 정리  (0) 2020.03.23
나라장터 open api crawling  (0) 2020.03.01
selenium 사용해서 위경도 가져오기  (0) 2019.03.20

Selenium 사용하기


예전엔 따로 다운로드 받지 않아도 패키지만 설치해서 크롤링이 가능했는데 크롬버전 업그레이드 때문인지 cmd로 chromeDriver를 열어주는 방법을 사용해야 된다. 


목차


1. 필요 파일 다운로드

2. 크롤링 환경 만들기

3. python에서 크롤링 시작하기



1.필요파일 다운로드

우선 cmd로 chrome Driver를 열어주는 방법을 알아보자.


아래 3개의 파일을 같은 경로에 다운로드 받자.

1) selenium download

2) geckodriver download

3) chromedrover download


아래와 같이 selenium-server와 geckodriver, chromedriver 3개를 설치해주면 된다.

다운로드 받은 파일을 한 경로에 옮긴다.



위에서 보시다 시피 나의 경로는 C:\selenium이다.


2. 크롤링 환경 만들기

아나콘다 프롬프트에서 pip install selenium 을 통해 selenium 다운로드


3. python에서 크롤링 시작하기



'python > crawling' 카테고리의 다른 글

[Selenium] 기상자료 크롤링  (1) 2021.04.03
크롤링과 python  (0) 2021.04.03
python selenium 자주쓴거 정리  (0) 2020.03.23
나라장터 open api crawling  (0) 2020.03.01
[나라장터] 크롤링  (2) 2019.11.14