* ๋ก๊ทธ์ธ์ ํ๊ณ ํฌ๋กค๋ง์ ํ๋ ์ด์
- ๊ตฌ๊ธ์ ๊ฒฝ์ฐ ๋ก๊ทธ์ธํ๊ณ ๋์ค๋ ์ด๋ฏธ์ง์ ๋ก๊ทธ์ธ์ ํ์ง ์๊ณ ๋์ค๋ ์ด๋ฏธ์ง ๋ชฉ๋ก์ด ๋ค๋ฅผ๋๊ฐ ๋ง๋ค.
- ์ฑ์ธ์ธ์ฆ์ด ํ์ํ ์ด๋ฏธ์ง๋ค์ ๋ก๊ทธ์ธ์ ํด์ผ๋ง ๊ฐ์ ธ์ฌ์ ์๋ค.
* ์ฌ์ฉ๋ฒ
- ์ ์์ ์ผ๋ก ํฌ๋กค๋ง๋๋์ง ํ์ธ์๋ฃ [23.06.20]
- ๋ชจ๋ ์ค์น - pip install undetected_chromedriver selenium
- ์ฃผ์ 1๋ฒ์ ์ด๋ฏธ์ง๋ฅผ ์ํ๋ ๊ฒ์์ด ๋ชฉ๋ก ์ ๋ ฅ
- ์ฃผ์ 2๋ฒ์ ํด๋์ด๋ฆ ์ ๋ ฅ. ์ด๋ฏธ์ง๋ data\google\ ์๋ ์ ์ฅ๋จ
- ์ฃผ์ 3๋ฒ์ ์์ธ์ด๋ฏธ์ง์ xPath ์ ๋ ฅ. ๊ตฌ๊ธ์ ๊ฒฝ์ฐ ์์ฃผ ๋ฐ๋๋ ๊ฒ ๊ฐ๋ค.
- ์ฃผ์ 4๋ฒ์ ๊ตฌ๊ธ ID์ ๋ ฅ
- ์ฃผ์ 5๋ฒ์ ๊ตฌ๊ธ ๋น๋ฐ๋ฒํธ ์ ๋ ฅ. ์ดํ ์ถ๊ฐ๋ก ์ค๋งํธํฐ ์ธ์ฆํ๋ฉด์ด ๋ฐ ๊ฒฝ์ฐ์ ๋๋นํด 20์ด๊ฐ ๊ธฐ๋ค๋ฆฐ๋ค.
'''
* ๊ตฌ๊ธ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ (23.06.20)
'''
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import undetected_chromedriver as uc
import urllib
import time, datetime
ITEM_LIST = [ "Keith Thompson", "Zdzislaw Beksinski", "dariusz zawadzki"] # 1๋ฒ
FOLDER = 'google' # 2๋ฒ
IMG_XPATH = '//*[@id="Sva75c"]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div/div/div/div[3]/div[1]/a/img[1]' # 3๋ฒ
SIGNINURL = 'https://accounts.google.com/signin/v2/identifier?hl=ko&passive=true&continue=https%3A%2F%2Fwww.google.com%2F&ec=GAZAmgQ&flowName=GlifWebSignIn&flowEntry=ServiceLogin'
ID = 'xxxx@gmail.com' # 4๋ฒ
PASSWORD = 'xxxx' # 5๋ฒ
def main():
start = check_start() # ์๊ฐ ์ธก์ ์์
driver = uc.Chrome()# ๊ตฌ๊ธ๋ก๊ทธ์ธ์ ์ํ ๋ชจ๋์ ์ผ๊ณ
driver.get(SIGNINURL)
googleSignIn(driver)# ๊ตฌ๊ธ๋ก๊ทธ์ธํ๊ณ
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()
# ๊ตฌ๊ธ ๋ก๊ทธ์ธ
def googleSignIn(driver):
idBtn = driver.find_element(By.XPATH,'//*[@id="identifierId"]')# id ์
๋ ฅ์นธ
idBtn.send_keys(ID)
nextBtn = driver.find_element(By.XPATH,'//*[@id="identifierNext"]/div/button')
nextBtn.click()# ๋ค์ ๋ฒํผ ํด๋ฆญ
# ์๋ ์ฝ๋๋ ๋น๋ฐ๋ฒํธ ์์๊ฐ ํ๋ฉด์ ๋ํ๋ ๋๊ฐ์ง 10์ด๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ์ฝ๋์ด๋
# ๋น๋ฒ์ ๊ฒฝ์ฐ not interactive elem๋ผ์ ์๋ฌ๊ฐ ๋ฌ๋ค. ํ์ง๋ง ๋์๊ฐ๋ ์ฝ๋์ด๋ ๊ธฐ๋ค๋ฆผ์ด ํ์ํ ๋ ์ฐ์.
try:
passwordBtn = WebDriverWait(driver, timeout=10).until(EC.presence_of_element_located( (By.XPATH,'//*[@id="password"]/div[1]/div/div[1]/input') ))
time.sleep(4)
passwordBtn = driver.find_element(By.XPATH,'//*[@id="password"]/div[1]/div/div[1]/input')# ๋น๋ฐ๋ฒํธ ์
๋ ฅ์นธ
passwordBtn.send_keys(PASSWORD)
passwordNextBtn = driver.find_element(By.XPATH,'//*[@id="passwordNext"]/div/button')
passwordNextBtn.click()# ๋น๋ฐ๋ฒํธ ๋ค์ ๋ฒํผ
print('๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ฑ๊ณต')
# driver.implicitly_wait(10)
except OSError as e:
print(e)
time.sleep(20)# ํด๋ํฐ ๋ณธ์ธ ์ธ์ฆ๋ฑ์ ์๊ฐ์ด ์ถฉ๋ถํ ํ์ํ๋ค
# ๊ตฌ๊ธ ์ด๋ฏธ์ง ๊ฒ์ url ๋ง๋ค๊ธฐ
def makeUrl(searchItem):
url = 'https://www.google.com/search'
params ={# q์ tbm์ด ํ์
'q' : searchItem,
'tbm' : 'isch',
}
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, '.rg_i.Q4LuWd')
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()
* ์์ธ ์ด๋ฏธ์ง์ xPath ์์๋ด๋ ๋ฐฉ๋ฒ
- ํฌ๋กฌ์ ์ด๋ฏธ์ง ํด๋ฆญ ํ ๋จ๋ ์์ธ์ด๋ฏธ์ง ํ๋ฉด์์ ํด๋น elements์ xPath๋ฅผ ์๋์ ๊ฐ์ด ๋ณต์ฌํจ
๋ค์์๋ headless ํฌ๋กค๋ง์ ๋ํด ์ ๋ฆฌํ๊ฒ ๋ค
- headless ํฌ๋กค๋ง์ ํ๋ฉด์ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋์ฐ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์๋ํ๋ ๋ฐฉ์์ด๋ค.
'๊ทธ ๋ฐ์ AI > ๋ฐ์ดํฐ ์ค๋นํ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Crawling] ip์ฐํํด ํฌ๋กค๋งํ๊ธฐ ver. ํจ์ฝ (1) | 2023.07.05 |
---|---|
[Crawling] ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ ver. Headless (0) | 2023.06.21 |
[Crawling] ๋ค์ด๋ฒ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ - ๋ก๋ผ ์ด๋ฏธ์ง ์์ง (11) | 2023.06.19 |
Extracting text from epub with python - ํ์ด์ฌ์ผ๋ก epub์์ ํ ์คํธ ๋ฝ๊ธฐ (0) | 2023.04.03 |
๊ธฐ์์ฒญ ์ง์ง ์ ๋ณด ํฌ๋กค๋ง (0) | 2017.12.01 |