๋ค์ด๋ฒ ์ด๋ฏธ์ง ํฌ๋กค๋งํ๊ธฐ
๋๊ธฐ
1. ์ข์ ๋ก๋ผ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด๋ฏธ์ง ํ์ผ๋ค์ด ๋ง์์๋ก ์ข๋ค.
2. ๊ฒฝํ์ ์ด๋ฏธ์ง ํ๋ฌํฐ๋ ๊ตฌ๊ธ๋ณด๋ค ๋ค์ด๋ฒ๊ฐ ๋ ์ข์๋ค - ๋ฌผ๋ก ๊ตฌ๊ธ ์ด๋ฏธ์ง ํฌ๋กค๋ง ์ฝ๋๋ ๊ณต์ ํ ์์
3. ๋ค์ด๋ฒ๋ ๊ตฌ๊ธ์ ๋นํด ํฌ๋กค๋ง์ ๊ด๋ํ๋ค. ๊ทธ๋์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค - ๊ตฌ๊ธ์ undetected_chromedriver ๋ฑ์ ์ฌ์ฉํด์ผํ๋ค.
์ฌ์ฉ๋ฒ
1. 2023๋ 6์ 19์ผ ํ์ฌ ์๋ ์ฝ๋๋ ์ ๋์๊ฐ๋ค. ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ฃผ์์ ๋ง์ด ๋ฌ์๋์๋ค.
2. ์ ๋ฆฌ๋์์ด๋ urllib๋ฑ์ ๋ชจ๋ ์ค์น๊ฐ ์ฐ์ ์ด๋ค.
pip install selenium
3. ์คํ ํ ํฌ๋กฌ์ฐฝ์ด ๋จ๊ณ ์ฐฝ์ด ์ต๋ํ ๋๋ค.
4. ์๋์ผ๋ก ์คํฌ๋กค๋๋ฉฐ ์ด๋ฏธ์ง ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค. ์ด๋๋ ์ฐฝ์ ๋ด๋ฆฌ์ง๋ง๊ณ ์คํฌ๋กค์ด ๋๊น์ง ๋ด๋ ค๊ฐ ๋ ์ด์ ๊ฐ์ ธ์ฌ ์ด๋ฏธ์ง๊ฐ ์์๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ์. ์ด๋ฏธ์ง ๋ชฉ๋ก์ ๋ค ๊ฐ์ ธ์จ ํ ์๋์ผ๋ก ์คํฌ๋กค์ด ๋งจ์๋ก ์ฌ๋ผ๊ฐ๋ค. ์ด ๋ค์๋ถํฐ๋ ์ฐฝ์ ๋ด๋ ค๋ ๋๋ค.
5. ๊ฐ์ ธ์ค๊ธธ ์ํ๋ ์ด๋ฏธ์ง ์ด๋ฆ์ ์๋ ์ฝ๋์ item_list ์์ ๋ฃ๋๋ค. ์ฃผ์ #1๋ฒ
6. ํด๋ ์ด๋ฆ์ ์ฃผ์#2๋ฒ์ ๋ฃ๋๋ค. ์๋ ์ฝ๋์ฒ๋ผ naver๋ก ํ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๋ data\naver\ ์์ ์ ์ฅ๋๋ค. ํด๋น ํด๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ง ์์๋ ์์์ ๋ง๋ค๊ณ ์ ์ฅํ๋ค.
7. ์์ธ ์ด๋ฏธ์ง์ xpath๋ฅผ ๋ฃ๋๋ค. ์ฃผ์#3๋ฒ. ํฌ๋กค๋ง์ ํด๋ณด๋ xpath๊ฐ ์~์ฃผ ๊ฐ๋ ๋ฐ๋๋๊ฐ ์๋ค. ์๋ง ๊ทธ๋๋ก ๋๋ฌ๋ ํฐ ๋ฌธ์ ์์ ๊ฒ์ด๋ค.
์ต์ ํด๋์ค์ xPath๋ก ์ฌ์ค์ ํจ - 24.07.26
'''
* ๋ค์ด๋ฒ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ (24.07.26)
'''
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import urllib
import time, datetime
item_list = [ "๋๋ค๋ฆฌ"] # 1๋ฒ
FOLDER = 'naver' # 2๋ฒ
IMG_XPATH = '/html/body/div[4]/div/div/div[1]/div[2]/div[1]/img'
def main():
start = check_start() # ์๊ฐ ์ธก์ ์์
driver = webdriver.Chrome()
for searchItem in item_list:
saveDir = makeFolder(searchItem)
url = makeUrl(searchItem)# ๊ฒ์ํ url ๊ฐ์ ธ์์
driver.get(url)# ์ด๋ฏธ์ง ๊ฒ์์ผ๋ก ๊ฐ์
maximizeWindow(driver)# ์ฐฝ์ต๋ํ
scrollToEnd(driver)
forbiddenCount = saveImgs(driver, saveDir, start)# ๋ชจ๋ ์์ธ ์ด๋ฏธ์ง src๋ค์ ๊ฐ์ ธ์จ๋ค
sec = check_time(start)
print(f'์คํจ์{str(forbiddenCount)}, {sec}, {datetime.datetime.now().time()}')
time.sleep(10)
driver.quit()
# ์ด๋ฏธ์ง ๊ฒ์ url ๋ง๋ค๊ธฐ
def makeUrl(searchItem):
url = 'https://search.naver.com/search.naver'
params ={
'where' : 'image',
'sm' : 'tab_jum',
'query' : searchItem
}
url = url + '?' + urllib.parse.urlencode(params)
return url
# ํด๋ ์์ฑ
def makeFolder(searchItem):
saveDir = os.path.join(os.getcwd(), 'data', f'{FOLDER}_{searchItem}')
try:
if not(os.path.isdir(saveDir)): # ํด๋น ํด๋๊ฐ ์๋ค๋ฉด
os.makedirs(os.path.join(saveDir)) # ๋ง๋ค์ด๋ผ
return saveDir
except OSError as e:
print(e+'ํด๋ ์์ฑ ์คํจ')
# ์ฐฝ ์ต๋ํ
def maximizeWindow(driver):
driver.maximize_window()
# ๋ชจ๋ ์ด๋ฏธ์ง ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ฌดํ ์คํฌ๋กค ๋ค์ด
def scrollToEnd(driver):
prev_height = driver.execute_script('return document.body.scrollHeight')
print(f'prev_height: {prev_height}')
while True:
time.sleep(1) #๋ค์ด๋ฒ๋ sleep์์ด ์ด๋ํ ๊ฒฝ์ฐ ๋ฌดํ๋ก๋ฉ์ ๊ฑธ๋ฆฐ๋ค.
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(3)
cur_height = driver.execute_script('return document.body.scrollHeight')
print(f'cur_height: {cur_height}')
if cur_height == prev_height:
print('๋์ด๊ฐ ๊ฐ์์ง')
break
prev_height = cur_height
# ํ์ด์ง๋ฅผ ๋ชจ๋ ๋ก๋ฉํ ํ์๋ ์ต์๋จ์ผ๋ก ๋ค์ ์ฌ๋ผ๊ฐ๊ธฐ
driver.execute_script('window.scrollTo(0, 0)')
# ๋ชจ๋ ์ด๋ฏธ์ง๋ค์ ์ ์ฅํ๋ค
def saveImgs(driver, saveDir, start):
time.sleep(1)
forbiddenCount = 0
imgs = driver.find_elements(By.CSS_SELECTOR, '._fe_image_tab_content_thumbnail_image')
print('imgs')
print(imgs)
srcList = []
img_count = len(imgs)
print(f'์ ์ฒด ์ด๋ฏธ์ง์ : {img_count}')
# ํ๋์ฉ ํด๋ฆญํด๊ฐ๋ฉฐ ์ ์ฅ
for imgNum, img in enumerate(imgs): # imgNum์ ์ด๋ฏธ์ง๋ฒํธ๊ฐ 0๋ถํฐ ๋ค์ด๊ฐ๋ค
try:
img.click()
time.sleep(3)
# ์๋์ xPath๋ ์์ฃผ ๋ฐ๋๋ ๊ฒ ๊ฐ๋ค. ๋๋จธ์ง๋ ๊ณ ์ ์ธ๊ฑฐ ๊ฐ์ผ๋ ์ด๊ฒ๋ง ๊ฐ๋ ํ์ธํด์ฃผ์
bigImg = driver.find_element(By.XPATH, IMG_XPATH)
src = bigImg.get_attribute('src')
urllib.request.urlretrieve(src, saveDir + '/' + str(imgNum) + '.jpg')
sec = check_time(start)
print(f'{imgNum+1}/{img_count} saved {sec}')
except Exception as e:
print(e)
forbiddenCount += 1# ์ ์ฅ ์คํจํ ๊ฐ์. forbidden์ด๋ ํ์ผ์๋ฌ๋ ๊ฝค ๋ง๋ค
continue
return forbiddenCount
# ์๊ฐ ์ธก์
def check_start():
start_time = time.time()
print("Start! now.." + str(start_time))
return start_time
def check_time(start):
end = time.time()
during = end - start
sec = str(datetime.timedelta(seconds=during)).split('.')[0]
return sec
main()
์ด์ ์ฝ๋๋ฅผ ์คํํด๋ณด์. ์ ์คํ๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์ด๋ฒ๋ ์ต๋ 500๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.
'๊ทธ ๋ฐ์ AI > ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Crawling] ip์ฐํํด ํฌ๋กค๋งํ๊ธฐ ver. ํจ์ฝ (1) | 2023.07.05 |
---|---|
[Crawling] ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ ver. Headless (0) | 2023.06.21 |
[Crawling] ๊ตฌ๊ธ ๋ก๊ทธ์ธํ๊ณ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ - ๋ก๋ผ ์ด๋ฏธ์ง ์์ง (0) | 2023.06.20 |
Extracting text from epub with python - ํ์ด์ฌ์ผ๋ก epub์์ ํ ์คํธ ๋ฝ๊ธฐ (0) | 2023.04.03 |
๊ธฐ์์ฒญ ์ง์ง ์ ๋ณด ํฌ๋กค๋ง (0) | 2017.12.01 |