ํฐ์คํ ๋ฆฌ ๋ทฐ
[์บก์คํค๋์์ธ - Adultree] ํฌ๋กค๋งํด์ ์ป์ ํ ์คํธ, ์ด๋ฏธ์ง๋ฅผ ํ์ผ๋ก ์ ์ฅํ์ฌ google drive api๋ฅผ ์ด์ฉํด drive์ ์ ๋ก๋ํ๊ธฐ
ujjulsu 2024. 11. 25. 16:29๐ฌ ์ ์ด๋ฌํ ์ผ์ ํ๊ฒ ๋์๋์ง
๋จผ์ ์กธ์ ํ๋ก์ ํธ์์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์ ์๋ฆฝ์ค๋น์ฒญ๋ ์ด ํ ์คํธ๋ก ๊ถ๊ธํ ์ ์ ๋ํด ๋ฌผ์ด๋ณด์์ ๋, ์ฑ๋ด์ด ์ฌ์ฉ์์๊ฒ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฑ๋ด์ด ์ ๋ณด๋ฅผ ์ ๊ณตํด์ค ๋์ ์ ํ์ฑ์ ๋์ด๊ธฐ ์ํด์ RAG๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ์๋ค. RAG ๊ตฌ์ถํ๋ ๊ณผ์ ์์ chroma DB๋ก ๋ฒกํฐ DB๋ฅผ ๊ตฌ์ถํ๊ณ ์ด ๋ฒกํฐ DB์ ์๋ฆฝ์ค๋น์ฒญ๋ ์๊ฒ ๋์์ด ๋๋ ์ ๋ณด(์ฃผ๊ฑฐ ์ ๋ณด, ์ทจ์ ์ ๋ณด, ์กฐ๋ก ๋ฑ)๋ฅผ ํฌ๋กค๋งํ์ฌ ๋ฃ์ด์ฃผ๊ธฐ๋ก ํ์๋ค.
๐ฅ selenium์ผ๋ก ํฌ๋กค๋ง์ ํด๋ณด์!
์์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์งํํ๊ฒ ๋์๋ค.
selenium์ ๋์ ํฌ๋กค๋ง์ ์ ํฉํด์ ์ ํํ๊ฒ ๋์๋ค. ๋จผ์ ์ฐ๋ฆฌ๋ ์๋ฆฝ์ ๋ณดON์ด๋ผ๋ ํํ์ด์ง ์์ ์๋ฆฝ ์ง์ ์ฌ์ ์ ๋ํ txt์ ์ด๋ฏธ์ง ํ์ผ์ ๊ฐ์ ธ์ค๊ธฐ๋ก ํ๋ค.
๋จผ์ selenium์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ด๋ จ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํ๋ค. ๋๋ ์๋์ฝ๋ค๋ก ๊ฐ์ํ๊ฒฝ์ ์ธํ ํด์ฃผ์๋ค.
pip install selenium
์ฑ๊ณต์ ์ผ๋ก ์ค์น๊ฐ ๋๋ฉด, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์น์ฌ์ดํธ์ ์ ์ํ ์ ์๋ค.
์๋์ ๊ฐ์ด ํ์ด์ฌ ์ฝ๋ ์์์ import๋ฅผ ์์ฑํด์ค๋๋ค.
import os
import requests
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
html ์์์ class๋ id ์ด๋ฆ์ ๊ฐ์ง๊ณ ์ค๊ธฐ ์ํด์ ํ์ํ๋ค
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
์นํ์ด์ง ์์์ ์ด๋ค ์์๊ฐ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด์ ํ์ํ๋ค.
from selenium import webdriver
๋ธ๋ผ์ฐ์ ์๋ ์ ์ด๋ฅผ ์ํด ํ์ํ๋ค.
# ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
driver.get("https://jaripon.ncrc.or.kr/home/kor/main.do")
# ๊ฒฝ๊ณ ์ฐฝ ์ฒ๋ฆฌ
try:
WebDriverWait(driver, 5).until(EC.alert_is_present())
alert = driver.switch_to.alert
alert.accept()
print("Alert accepted.")
except Exception as e:
print(f"No alert found or error occurred: {e}")
# ์๋ฆฝ์ ๋ณด ์กฐํ ํ์ด์ง๋ก ์ด๋
script = "fn_menu_move('/home/kor/support/projectMng/index.do', '3');"
driver.execute_script(script)
๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ ํ, ์๋ฆฝ์ ๋ณด ์ง์์ฌ์ ์ด ์กด์ฌํ๋ ํ์ด์ง๋ก ์ด๋ํ๊ฒ๋ request๋ฅผ ๋ณด๋ด๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ค๋ค.
์ด ๋์ ๋ฐ๋ก ์๋ฆฝ์ ๋ณด ์ง์์ฌ์ ์ด ์กด์ฌํ๋ ํ์ด์ง๋ก ์ด๋ํ์ง ์์ ์ด์ ๊ฐ ์๋ค!
๋ฐ๋ก ํด๋นํ์ด์ง๋ก ์ ๊ทผํ ๊ฒฝ์ฐ์๋ "๋น์ ์์ ์ ๊ทผ์ ๋๋ค"์ ๊ฐ์ ์๋ฌ ๋ฉ์์ง๊ฐ ํ์๋๋ ๊ฒ์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ์ด๋ฌํ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด์ค๋ค.
driver.execute_script(์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋)
์ด๋ฐ ์์ผ๋ก ์์ฑํ๊ฒ ๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ๋์์ ์ ์ดํ ์ ์๋ค.
script = "fn_menu_move('/home/kor/support/projectMng/index.do', '3');"
์ด ๋ถ๋ถ์์ fn_menu_move๋ ์ ์๋์ง ์์ ํจ์์ธ๋ฐ ์ด๋ป๊ฒ ์๋ํ ์ ์๋๊ณ ํ ์๋ ์๋๊ณ ๋ฌผ์ ์๋ ์๋ค!
<a href="javascript:void(0);" onclick="fn_menu_move('/home/kor/servic/login/index.do','25');">
<span class="text">๋ก๊ทธ์ธ</span>
</a>
์ด๋ฐ ์์ผ๋ก ์ด๋ฏธ ํํ์ด์ง ๋ด์ ์๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ค ์ธ ์ ์๋ ๊ฒ์ด์๋ค.
๋ค๋ง ๋ค๋ฅธ ํํ์ด์ง์์๋ ์ด๋ฌํ ํจ์๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ณณ์ ์ ์ฉํ ๋๋ ์ ์ํด์ผํ๋ค.
# ํ์ด์ง ๋ก๋ฉ ๋ฐ div.gallery_list > ul.list ์์ ํ์ธ
try:
gallery_list = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.gallery_list ul.list"))
)
print("gallery_list found.")
# ๊ฐ li > a ์์ ํ์ ๋ฐ ํ
์คํธ/์ด๋ฏธ์ง ์ ์ฅ ๋ฐ๋ณต
for idx in range(10): #10๊ฐ์ ํญ๋ชฉ ์ฒ๋ฆฌ
try:
# ํ์ฌ li > a ์์๋ค ๋ก๋
li_elements = gallery_list.find_elements(By.CSS_SELECTOR, "li > a")
# a ํ๊ทธ ํด๋ฆญํ์ฌ ์ ํ์ด์ง๋ก ์ด๋
a_tag = li_elements[idx]
driver.execute_script("arguments[0].click();", a_tag)
# ์ ํ์ด์ง๊ฐ ๋ก๋๋ ๋๊น์ง ๋๊ธฐ
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
# <div class="editor_view">์์ ํ
์คํธ ๋ฐ ์ด๋ฏธ์ง URL ๊ฐ์ ธ์ค๊ธฐ
editor_view = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.editor_view"))
)
# ํ
์คํธ ๋ด์ฉ ๊ฐ์ ธ์์ ์ ์ฅ
text_content = editor_view.text
text_filename = f"content_{idx + 1}.txt"
with open(text_filename, "w", encoding="utf-8") as file:
file.write(text_content)
print(f"Saved text content to {text_filename}.")
# ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ๋ฐ ์ ์ฅ
image_elements = editor_view.find_elements(By.TAG_NAME, "img")
for img_idx, img in enumerate(image_elements):
img_url = img.get_attribute("src")
if img_url:
img_data = requests.get(img_url).content
image_filename = f"content_{idx + 1}_image_{img_idx + 1}.jpg"
with open(image_filename, "wb") as img_file:
img_file.write(img_data)
print(f"Saved image to {image_filename}.")
# ์๋ ํ์ด์ง๋ก ๋์๊ฐ๊ธฐ
driver.back()
# ์๋ฆฝ์ ๋ณด ์กฐํ ํ์ด์ง๋ก ์ฌ์ง์
(JavaScript ์ฌ์ฉ)
driver.execute_script(script)
gallery_list = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.gallery_list ul.list"))
)
# ์ฌ๋์ฒ๋ผ ๋ณด์ด๊ฒ ๋๊ธฐ
time.sleep(random.uniform(1, 3))
except Exception as e:
print(f"Error processing link {idx + 1}: {e}")
break
except Exception as e:
print(f"Error finding gallery_list or list items: {e}")
# ๋ธ๋ผ์ฐ์ ์ข
๋ฃ
driver.quit()
์ฌ์ค ์์ ์ฝ๋๊ฐ ์ค์ ์ ์ธ ๋ด์ฉ์ด๋ค. ์ฐฌ์ฐฌํ ์ดํด๋ณด๊ฒ ๋ค...!
gallery_list = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.gallery_list ul.list"))
)
print("gallery_list found.")
webDriverWait์ ํตํด์ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ๊ณ css_selector์ ํตํด ํด๋น html ๋ด์ class์ด๋ฆ์ด galley_list์ธ div ํ๊ทธ ์์ list๋ผ๋ class ์ด๋ฆ์ ๊ฐ์ง list ํ๊ทธ๊ฐ ์๋์ง ์ฐพ์์ค๋ค.
์ด์ ๋ฐ๋ณต๋ฌธ ๋ด์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ๋ค.
๋ฐ๋ณต๋ฌธ ๋ด์์๋ ๊ฐ๊ฐ์ ์ฌ์ ์ ํด๋นํ๋ ํ์ด์ง์ ์ ์ํ ํ
ํด๋น ์ฌ์ ์ ํ ์คํธ์ ์ด๋ฏธ์ง ํ์ผ์ ๋ก์ปฌ์ ์ ์ฅํ๋ ๋ด์ฉ์ด๋ค.
# ํ์ฌ li > a ์์๋ค ๋ก๋
li_elements = gallery_list.find_elements(By.CSS_SELECTOR, "li > a")
# a ํ๊ทธ ํด๋ฆญํ์ฌ ์ ํ์ด์ง๋ก ์ด๋
a_tag = li_elements[idx]
driver.execute_script("arguments[0].click();", a_tag)
# ์ ํ์ด์ง๊ฐ ๋ก๋๋ ๋๊น์ง ๋๊ธฐ
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
# <div class="editor_view">์์ ํ
์คํธ ๋ฐ ์ด๋ฏธ์ง URL ๊ฐ์ ธ์ค๊ธฐ
editor_view = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.editor_view"))
)
์์ ๊ฐ์ด ๊ฐ๊ฐ์ ํ๊ทธ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ์ฒซ ๋จ๊ณ์ด๊ณ
# ํ
์คํธ ๋ด์ฉ ๊ฐ์ ธ์์ ์ ์ฅ
text_content = editor_view.text
text_filename = f"content_{idx + 1}.txt"
with open(text_filename, "w", encoding="utf-8") as file:
file.write(text_content)
print(f"Saved text content to {text_filename}.")
# ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ๋ฐ ์ ์ฅ
image_elements = editor_view.find_elements(By.TAG_NAME, "img")
for img_idx, img in enumerate(image_elements):
img_url = img.get_attribute("src")
if img_url:
img_data = requests.get(img_url).content
image_filename = f"content_{idx + 1}_image_{img_idx + 1}.jpg"
with open(image_filename, "wb") as img_file:
img_file.write(img_data)
print(f"Saved image to {image_filename}.")
ํด๋น ํ๊ทธ์ text, img๋ฅผ ์ ์ฅํด์ค๋ค.
text์ ๊ฒฝ์ฐ์๋ editor_view.text์ ๊ฐ์ด ๋ณ๋ค๋ฅธ ๊ณผ์ ์์ด text๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๋ค๋ง ์ฐ๋ฆฌ๋ ํ๊ตญ์ด๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ธ์ฝ๋ฉ ๊ณผ์ ์์ utf-8๋ก ์ค์ ํด์ผ ๊ธ์๊ฐ ์ ๊นจ์ง ์ ์๋ค.
ํ์ด์ฌ ๋ด์ฅ ํจ์์ธ open์ ์ด์ฉํ๋ฉด txt ํ์ผ์ ์ ์ฅํ ์ ์๋ค.
with as file์ ์ด์ฉํ๋ฉด open ํ closeํด์ผ ํ๋ ์๊ณ ๋ฅผ ๋ ์ ์์ด์ ์ด๋ ๊ฒ ์์ฑํ๋ ๊ฒ ํธํ๋ค.
with open(text_filename, "w", encoding="utf-8") as file:
file.write(text_content)
์ด๊ฑฐ๋ฅผ with ~ as file์ ์ฌ์ฉํ๊ณ ์ถ์ง ์์ผ๋ฉด
file = open(text_filename, "w", encoding="utf-8")
file.write(text_content)
file.close
๋ก ์์ฑํ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก "w"๋ write, "r"๋ read์ฌ์ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ write๋ฅผ ํ๊ณ ์ถ์ด์ open์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก w๋ฅผ ์์ฑํด์ค ๊ฒ์ด๋ค.
์ด๋ฏธ์ง์ ๊ฒฝ์ฐ์๋ ํ ์คํธ์ ๋ฌ๋ฆฌ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
img ํ๊ทธ -> img ํ๊ทธ ์์ src ์์ ๊ฐ์ง๊ณ ์ค๊ธฐ -> src ์์๊ฐ ์์ผ๋ฉด, ๊ฐ์ง๊ณ ์์ ์ ์ฅ.
์ฌ๊ธฐ์ open์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก wb๋ฅผ ์์ฑํ๋๋ฐ ์ด๋ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๋ก ์ฐ๊ธฐ๋ฅผ ํด์ฃผ๊ธฐ ์ํจ์ด๋ค.
์ด๋ฏธ์ง ๊ฐ์ฒด๋ฅผ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ๋ค๋ฃจ๊ธฐ ์ํด์๋ pickle ๋ชจ๋์ ์ฌ์ฉํ๊ฒ ๋๋ค.
๊ทธ ๋ค์์๋ ํด๋น ํ์ด์ง์์ ์์ ์ ์๋ฃํ์์ผ๋ฏ๋ก ๋ค์ ์ง์ ์ฌ์ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๋ค.
์ดํ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์์ค๋ค.
๋ง์ฝ์ google colab์์ ํด๋น ์์ ์ ์งํํ๊ฒ ๋ ๊ฒฝ์ฐ์๋, head-less ๋ชจ๋๋ฅผ ๊ผญ ์ ์ฉํด์ผ ์ฝ๋๊ฐ ์๋๊ฐ๋ฅํ๋ค.
๐ฅ selenium์ผ๋ก ํฌ๋กค๋งํ ํ์ผ์ google drive์ ์ ์ฅํด๋ณด์
ํ์ฌ๊น์ง๋ ๋ก์ปฌ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ณ ํ์ผ๋ค google drive์ ์ ์ฅํ๋ ์์ ์ด ํ์ํ๋ค.
์ด๋๋ google drive api๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
https://console.cloud.google.com
ํด๋น ํ์ด์ง์ ์ ์ํด์ค๋ค.
๋๋ ์ด๋ฏธ storage๋ฅผ ๋ง๋ค์ด๋ ์ํ๋ผ ์ด๋ฐ ํ์ด์ง๊ฐ ๋จ๋๋ฐ ์ฒ์์ธ ๊ฒฝ์ฐ์๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ผ๊ณ ํ๋ ๋ด์ฉ์ด ๋ฐ ๊ฑฐ๋ค.
์ด์จ๋ ์ฒ์๋ถํฐ ์์ํด๋ณด๋ฉด
"์ ํ๋ก์ ํธ"๋ฅผ ํด๋ฆญํด์ค๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์์ผ๋ก ํ๋ก์ ํธ ์ด๋ฆ์ ์ง์ ํ ์ ์๊ฒ ๋๋ค.
์กฐ์ง์ด ์์ผ๋ฉด ์์ฑ์ด ์๋๋๋ฐ ๋๋ ํ๊ต ์ด๋ฉ์ผ์ด๋ผ ํ๊ต๋ฅผ ์กฐ์ง์ผ๋ก ์ ํํด์ฃผ์๋ค.
๋ฉ๋ด๋ฐ > API ๋ฐ ์๋น์ค > ์ฌ์ฉ ์ค์ ๋ API ๋ฐ ์๋น์ค๋ฅผ ํด๋ฆญํ๋ค.
์ด๋ฐ ํ๋ฉด์ด ๋์ค๋๋ฐ ์ด๋ "+ API ๋ฐ ์ฌ๋น์ค ์ฌ์ฉ ์ค์ "์ ๋๋ฅธ๋ค.
ํด๋น ํ๋ฉด์ด ๋์ค๋๋ฐ ๊ฒ์์ฐฝ์ google drive api๋ฅผ ๊ฒ์ํ๋ค.
์ฌ๊ธฐ์ ์ ์ผ ์๋จ์ ๋์ค๋ Google Drive API๋ฅผ ์ ํํ๋ค.
์ฌ์ฉ ๋ฒํผ์ ๋๋ฌ์ค๋ค.
์ค๋ฅธ์ชฝ ์๋จ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ๋ฅผ ์ ํํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ณ ๋ค์์ ๋๋ฌ์ค๋ค.
๊ทธ๋ฌ๋ฉด ์์ ๊ฐ์ ์ฐฝ์ด ๋์ค๊ณ ์ด ์ฐฝ์์ service ์์ด๋๋ง ์ ์ด์ฃผ๋ฉด ๋๋ค.
์ด์ OAuth ๋์ ํ๋ฉด์ ๋ค์ด๊ฐ์
User Type์ ์ ํํด์ค๋ค. ์กฐ์ง ๋ด ์ฌ์ฉ์๋ง ์ฌ์ฉํ ๊ฑฐ๋ฉด ๋ด๋ถ๋ฅผ ํด๋ ๋๊ณ ์ธ๋ถ ์ฌ์ฉ์๋ ํ์ฉํ ๊ฑฐ๋ฉด ์ธ๋ถ๋ฅผ ์ ํํด๋ ๋๋ค. ๋๋ ์ผ๋จ ์ธ๋ถ๋ฅผ ์ ํํด์ฃผ์๋ค.
์ฑ ์ด๋ฆ์ด๋ ์ฌ์ฉ์ ์ง์ ์ด๋ฉ์ผ์ ์ ์ด์ฃผ์๋ค. ์ด๊ฑด ์์๋ผ ์ฑ ์ด๋ฆ์ ์๋ฌด๋ ๊ฒ๋ ์ง์๋๋ฐ ์ด๋ ๊ฒ ์ง์ผ๋ฉด ์๋๋ค!!!
์คํฌ๋กค์ ๋ด๋ ค ๊ฐ๋ฐ์ ์ฐ๋ฝ์ฒ ์ ๋ณด ์ ๋ ฅ ํ ์ ์ฅ ํ ๊ณ์์ ๋๋ฅธ๋ค.
๋๋จธ์ง๋ ๊ทธ๋ฅ ์ ์ฅ ํ ๊ณ์ ๋๋ฌ์ฃผ๋ฉด
์๋ฃ๋๋ค!!
์ด์ ์ฌ๊ธฐ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ก ๋์๊ฐ ์์ ์ ์๋ ๋ค์ด๋ก๋ ์์ด์ฝ์ ๋๋ฅธ๋ค.
์ฌ๊ธฐ์ JSON ๋ค์ด๋ก๋๋ฅผ ํ๋ฉด ๋๋ค.
ํด๋น JSON์ ์ด๋ฆ์ credentials.json์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค!
๋ชจ์์ดํฌ ์ฒ๋ฆฌ๋ ์ด๋ฉ์ด ๋ถ๋ถ์ ๋๋ฌ์ค๋ค.
์ฌ๊ธฐ์ ํค ์ถ๊ฐ > ์ ํค ๋ง๋ค๊ธฐ
JSON ์ ํ ํ ๋ง๋ค๊ธฐ๋ฅผ ๋๋ฅด๋ฉด json์ด ๋ค์ด๋ก๋ ๋๊ณ ํด๋น ํ์ผ ์ด๋ฆ์ service_accout.json์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
๊ธฐ์กด์ ํฌ๋กค๋ง ํ์ด์ฌ ํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ ์์ ๋ค์ด๋ก๋ํ credential.json๊ณผ service_accout.json์ ๋ฃ์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ google drive์์ ํด๋๋ฅผ ํ๋ ์์ฑ ํ
์ค๋ฅธ์ชฝ์ ์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ๋๋ฌ
์์ ๋ง๋ค์๋ ์๋น์ค ๊ณ์ ์ ์ด๋ฉ์ผ์ ํธ์ง์๋ก ์ถ๊ฐํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ํด๋์ ์ฃผ์ https://drive.google.com/drive/folders/~~~~~ ์์ ๋ฌผ๊ฒฐ ๋ถ๋ถ์ ํด๋น๋๋ ๋ถ๋ถ์ ๋ณต์ฌํ๋ค.
๊ธฐ์กด ํ์ด์ฌ ํ์ผ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
# ์๋น์ค ๊ณ์ ํค ํ์ผ ๊ฒฝ๋ก
SERVICE_ACCOUNT_FILE = 'service_account.json'
# Google Drive API ์ธ์ฆ (์๋น์ค ๊ณ์ )
def authenticate_google_drive():
credentials = Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,
scopes=['https://www.googleapis.com/auth/drive']
)
return build('drive', 'v3', credentials=credentials)
# Google Drive ๊ณต์ ํด๋ ID
FOLDER_ID = '์๊น ๋ณต์ฌํ ๋ถ๋ถ ๋ฃ๊ธฐ!!'
# ํ์ผ ์
๋ก๋ ํจ์
def upload_to_drive(service, file_name, file_data, mime_type):
file_metadata = {
'name': file_name,
'parents': [FOLDER_ID]
}
media = MediaIoBaseUpload(io.BytesIO(file_data), mimetype=mime_type)
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f"Uploaded {file_name} to shared folder with ID: {file.get('id')}")
# Google Drive API ์ธ์ฆ
drive_service = authenticate_google_drive()
๊ทธ๋ฆฌ๊ณ ์ ์ฅ๋๋ ๋ถ๋ถ์์๋ ๊ธฐ์กด์ ์ฝ๋ file.write ๋์ ์๋์ ๊ฐ์ด ์์ฑํด์ค๋ค.
upload_to_drive(drive_service, text_file_name, text_data, "text/plain")
๊ทธ๋ฌ๋ฉด ์ฝ๋ ์คํ ์ google drive์ ์์์ ์ฌ๋ผ๊ฐ๋ ๊ฑธ ๋ณผ ์ ์๋ค!
๐ฅ ์ ์ฒด ์ฝ๋
import os
import requests
import random
import time
import io
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseUpload
from google.oauth2.service_account import Credentials
# ์๋น์ค ๊ณ์ ํค ํ์ผ ๊ฒฝ๋ก
SERVICE_ACCOUNT_FILE = 'service_account.json'
# Google Drive API ์ธ์ฆ (์๋น์ค ๊ณ์ )
def authenticate_google_drive():
credentials = Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,
scopes=['https://www.googleapis.com/auth/drive']
)
return build('drive', 'v3', credentials=credentials)
# Google Drive ๊ณต์ ํด๋ ID
FOLDER_ID = ''
# ํ์ผ ์
๋ก๋ ํจ์
def upload_to_drive(service, file_name, file_data, mime_type):
file_metadata = {
'name': file_name,
'parents': [FOLDER_ID]
}
media = MediaIoBaseUpload(io.BytesIO(file_data), mimetype=mime_type)
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f"Uploaded {file_name} to shared folder with ID: {file.get('id')}")
# WebDriver ์ค์
driver = webdriver.Chrome()
# ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
driver.get("https://jaripon.ncrc.or.kr/home/kor/main.do")
# ๊ฒฝ๊ณ ์ฐฝ ์ฒ๋ฆฌ
try:
WebDriverWait(driver, 5).until(EC.alert_is_present())
alert = driver.switch_to.alert
alert.accept()
except Exception:
pass
# JavaScript๋ก ํ์ด์ง ์ด๋
script = "fn_menu_move('/home/kor/support/projectMng/index.do', '3');"
driver.execute_script(script)
# Google Drive API ์ธ์ฆ
drive_service = authenticate_google_drive()
try:
gallery_list = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.gallery_list ul.list"))
)
for idx in range(10):
try:
li_elements = gallery_list.find_elements(By.CSS_SELECTOR, "li > a")
a_tag = li_elements[idx]
driver.execute_script("arguments[0].click();", a_tag)
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
editor_view = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.editor_view"))
)
# ํ
์คํธ ์
๋ก๋
text_content = editor_view.text
if text_content:
text_data = text_content.encode('utf-8')
text_file_name = f"content_{idx + 1}.txt"
upload_to_drive(drive_service, text_file_name, text_data, "text/plain")
# ์ด๋ฏธ์ง ์
๋ก๋
image_elements = editor_view.find_elements(By.TAG_NAME, "img")
for img_idx, img in enumerate(image_elements):
img_url = img.get_attribute("src")
if img_url:
img_data = requests.get(img_url).content
image_file_name = f"content_{idx + 1}_image_{img_idx + 1}.jpg"
upload_to_drive(drive_service, image_file_name, img_data, "image/jpeg")
driver.back()
driver.execute_script(script)
gallery_list = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.gallery_list ul.list"))
)
time.sleep(random.uniform(1, 3))
except Exception as e:
print(f"Error processing link {idx + 1}: {e}")
break
except Exception as e:
print(f"Error finding gallery_list or list items: {e}")
driver.quit()
๐ฅ github์ ์ฌ๋ฆด ๋๋ json ํ์ผ์ .gitignore์ ์ถ๊ฐํ๋ ๊ฑธ ์์ง ๋ง์!
'project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Market] ํ์ ๊ฐ์ ์ ์ค๋ณต๋ ์์ด๋ ์ฒดํฌ์ ๋น๋ฐ๋ฒํธ ํ์ธ ๊ตฌํ (0) | 2024.11.18 |
---|