python

어드민 페이지 크롤링, 이것이 해킹?!

쵸비 2022. 10. 26. 15:46
728x90

우선 물론 해킹은 아니다. ㅎㅎ

 

한 회사의 서버문제로 어드민 페이지를 크롤링하여 구글 시트에 업데이트 시키는 자동화 의뢰를 받아 수행하였다.

 

사용언어는 python으로 여러가지 시도를 통해 고생한 결과 크롤링 성공을 하였다. url로 직접 request, response를 받으려고 했으나 보안상 불가능하여, forbiden error만 주구장창 보다가 편법으로 해결을 하였다.

 

from selenium import webdriver
import time
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

#크롬드라이브 다운로드 : https://sites.google.com/a/chromium.org/chromedriver/downloads

chromedriver = r'C:\Users\Administrator\Downloads\chromedriver.exe'

driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(2)

#관리자 페이지 회원가입창
driver.get('어드민 페이지 url')

#로그인
time.sleep(1)
username=driver.find_element("xpath", '//*[@id="id_username"]')
username.send_keys('--아이디--')

password=driver.find_element("xpath", '//*[@id="id_password"]')
password.send_keys('--비밀번호--')

time.sleep(1)
driver.find_element("xpath", '//*[@id="login-form"]/div[3]/input').click()

#로그인 세션 유지
#일반시설 예약 목록 루프
output=pd.DataFrame()
ind=0

for i in range(0,5):
    try:
        url = '--크롤링할 웹페이지 url {}--'.format(i)
        driver.get(url)

        # 페이지의 elements모두 가져오기
        html = driver.page_source 
        soup = BeautifulSoup(html, 'html.parser')

        table = soup.find('table', {'id': 'result_list'})
        dfs = pd.read_html(str(table))
        dataframe = dfs[0]

        output=pd.concat([output, dataframe])
        ind+=1
        print(i)
    except:
        print("error {} times".format(i))
        
 #output 객체에 DataFrame 형태로 저장됨

그리고 나중에 구글시트에 업로드할 코드는 아래와 같다.

from oauth2client.service_account import ServiceAccountCredentials
import gspread

scope = [
    "https://spreadsheets.google.com/feeds",
    "https://www.googleapis.com/auth/drive",
]

json_key_path = "json key 경로"	# JSON Key File Path

credential = ServiceAccountCredentials.from_json_keyfile_name(json_key_path, scope)
gc = gspread.authorize(credential)

# URL로 열기
spreadsheet_url = "--구글시트 url--"
doc = gc.open_by_url(spreadsheet_url)

#시트 불러오기
sheet = doc.worksheet("sheet1")
#시트 초기화
sheet.clear()

#!pip install gspread-dataframe pandas numpy #설치된 경우 실행x
from gspread_dataframe import get_as_dataframe, set_with_dataframe

# 기존 output 데이터프레임을 그대로 시트에 최신화시키는 작업
worksheet_title = "sheet1"
try:
    worksheet = doc.worksheet(worksheet_title)
except gspread.WorksheetNotFound:
    worksheet = doc.add_worksheet(title=worksheet_title, rows=1000, cols=1000)
    
set_with_dataframe(worksheet, output)

이렇게 작성해주면 구글 시트에 업로드가 가능하다~

728x90

'python' 카테고리의 다른 글

[Django] 3. html 파일용 templates 설정  (0) 2023.07.07
[Django] 2. 라우팅  (0) 2023.07.04
[Django] 1. 설치  (0) 2023.07.04
Colab에서 Spark 설치하기!! (23/05/02 기준)  (0) 2023.05.03