이전 글에 이어 이번에는 Pool을 이용하여 multiprocessing를 이용하고, 여러개의 크롬 창에서 이미지들을 동시다발적으로 검색하는 방법에 대해 고안해보았다.
이전 글 : yobbicorgi.tistory.com/29
이전에는 Spyder상에서 직접 실행시킨 것과는 다르게 Anaconda Prompt상에서 실행하도록 할 것이다.
또한, 텍스트 파일에 검색하고자 하는 키워드들을 입력하고, 해당 텍스트 파일을 읽어들여 키워드로 검색하도록 하며, 한번에 최대 4개의 크롬 창을 띄워 검색하고 다운로드 하고자 한다.
즉, 이전과 달라진 점
1. Anaconda Prompt상에서 직접 실행
2. 텍스트파일에 검색어들을 입력하여 여러 단어 검색
3. 한번에 최대 4개의 크롬창을 이용
1. 필요 모듈 import
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import os
import urllib.request
from multiprocessing import Pool
import pandas as pd
이전 방법과 크게 다르지 않으나 multiproccesing을 위한 Pool과 텍스트파일을 이용하기 위한 pandas가 추가되었다.
2. 키워드 호출
key=pd.read_csv('./keyword.txt',encoding='cp949',names=['keyword'])
keyword=[]
[keyword.append(key['keyword'][x]) for x in range(len(key))]
keyword라는 텍스트 파일에 나는 다음과 같은 8개의 키워드를 입력하였으며, 이를 각각 검색어로 이용할 것이다.
주걱
도마
칼
가위
접시
컵
그릇
세제
3. 폴더 형성 및 이미지 다운로드
def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print ('Error: Creating directory. ' + directory)
def image_download(keyword):
createFolder('./'+keyword+'_low resolution')
chromedriver = 'C://chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(3)
print(keyword, '검색')
driver.get('https://www.google.co.kr/imghp?hl=ko')
Keyword=driver.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
Keyword.send_keys(keyword)
driver.find_element_by_xpath('//*[@id="sbtc"]/button').click()
print(keyword+' 스크롤 중 .............')
elem = driver.find_element_by_tag_name("body")
for i in range(60):
elem.send_keys(Keys.PAGE_DOWN)
time.sleep(0.1)
try:
driver.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div[1]/div[4]/div[2]/input').click()
for i in range(60):
elem.send_keys(Keys.PAGE_DOWN)
time.sleep(0.1)
except:
pass
links=[]
images = driver.find_elements_by_css_selector("img.rg_i.Q4LuWd")
for image in images:
if image.get_attribute('src')!=None:
links.append(image.get_attribute('src'))
print(keyword+' 찾은 이미지 개수:',len(links))
time.sleep(2)
for k,i in enumerate(links):
url = i
start = time.time()
urllib.request.urlretrieve(url, "./"+keyword+"_low resolution/"+keyword+"_"+str(k)+".jpg")
print(str(k+1)+'/'+str(len(links))+' '+keyword+' 다운로드 중....... Download time : '+str(time.time() - start)[:5]+' 초')
print(keyword+' ---다운로드 완료---')
driver.close()
이미지 다운로드 방법은 이전 게시글의 방법과 같으며 def를 적용하여 image_download라는 함수로 적용해주었다.
4. Multiprocessing 적용
if __name__=='__main__':
pool = Pool(processes=4)
pool.map(image_download, keyword)
processes=4로 설정하여 한번에 최대 4개 창을 동시에 활용할 수 있도록 적용하였다.
나는 해당 py파일을 img_down_low_fast.py로 저장하였다.
5. 실행
Anaconda Prompt상에서 py 파일이 존재하는 경로로 이동하여 img_down_low_fast.py 파일을 실행시켜 준다,
python img_down_low_fast.py
해당 키워드들의 폴더가 잘 생성되었고, 이미지들도 각 폴더 안에 잘 저장되었다.
마지막으로 다음 영상에서는 현재 다운로드된 이미지들의 낮은 해상도를 극복하고자, 속도는 조금 느리지만 원본 이미지의 링크를 가져와 저장하고, 그 후 이미지들을 다운로드 받는 방법을 고안해보고자 한다.
#작동 영상
#full code
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import os
import urllib.request
from multiprocessing import Pool
import pandas as pd
key=pd.read_csv('./keyword.txt',encoding='cp949',names=['keyword'])
keyword=[]
[keyword.append(key['keyword'][x]) for x in range(len(key))]
def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print ('Error: Creating directory. ' + directory)
def image_download(keyword):
createFolder('./'+keyword+'_low resolution')
chromedriver = 'C://chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(3)
print(keyword, '검색')
driver.get('https://www.google.co.kr/imghp?hl=ko')
Keyword=driver.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
Keyword.send_keys(keyword)
driver.find_element_by_xpath('//*[@id="sbtc"]/button').click()
print(keyword+' 스크롤 중 .............')
elem = driver.find_element_by_tag_name("body")
for i in range(60):
elem.send_keys(Keys.PAGE_DOWN)
time.sleep(0.1)
try:
driver.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div[1]/div[4]/div[2]/input').click()
for i in range(60):
elem.send_keys(Keys.PAGE_DOWN)
time.sleep(0.1)
except:
pass
links=[]
images = driver.find_elements_by_css_selector("img.rg_i.Q4LuWd")
for image in images:
if image.get_attribute('src')!=None:
links.append(image.get_attribute('src'))
print(keyword+' 찾은 이미지 개수:',len(links))
time.sleep(2)
for k,i in enumerate(links):
url = i
start = time.time()
urllib.request.urlretrieve(url, "./"+keyword+"_low resolution/"+keyword+"_"+str(k)+".jpg")
print(str(k+1)+'/'+str(len(links))+' '+keyword+' 다운로드 중....... Download time : '+str(time.time() - start)[:5]+' 초')
print(keyword+' ---다운로드 완료---')
driver.close()
# =============================================================================
# 실행
# =============================================================================
if __name__=='__main__':
pool = Pool(processes=4)
pool.map(image_download, keyword)
'Python > Selenium & 크롤링' 카테고리의 다른 글
[python] 실시간 주식 종목, 현재가, 차트 카카오톡 메세지로 나에게 보내기 (1) | 2021.06.19 |
---|---|
[python] 3/3__Selenium을 이용한 구글 검색 이미지 크롤링 하기 (10) | 2021.05.11 |
[python] 1/3__Selenium을 이용한 구글 검색 이미지 크롤링 하기 (2) | 2021.05.06 |
[python] Selenium을 이용한 티스토리 로그인 & 게시글 자동 작성 (8) | 2021.05.01 |
댓글