작성
·
436
2
안녕하세요 강사님? 강사님께서 너무 질 좋은 수업을 제공해주셔서 정말 많은 도움을 받고 있습니다.
제가 구글 이미지 크롤링을 하는데, 제 나름대로 keyword, number 입력과 같은 여러 개를 추가했습니다. 그리고 강사님께서 알려주신 것처럼 했는데, 다운받아지는 처음 이미지만 큰 이미지이고 다른거는 다 작은 이미지더라구요. 코드에 어느 부분이 잘못되었는지 확인해주실 수 있으신가요?
그리고 강사님께서 이미지를 추출하실 때 img.n3VNCb로 클래스를 사용하시고 큰 이미지와 작은 이미지를 구분하기 위해서 리스트를 사용하셨는데, 지금 구글에서 이미지의 클래스를 확인해보니 'img.n3VNCb.KAlRDb'로 바뀐?것 같더라구요. 이거랑 같은 클래스를 가진 사진들은 모두 큰 사진밖에 없더라구요. 그래서 이걸 활용하고, target=driver.find_element(By.CSS_SELECTOR, 'img.n3VNCb.KAIRDb')로 했는데 그때는 이미지가 아에 다운받아지지 않더라구요. 이 두 문제를 해결해 주실 수 있으신가요?
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pyautogui
import os
import urllib.request
keyword=pyautogui.prompt('검색어를 입력하세요')
number=int(pyautogui.prompt('몇 번째 이미지까지 크롤링할까요?'))
num=0
if not os.path.exists(f'{keyword}.google'):
os.mkdir(f'{keyword}.google')
service=Service(executable_path=ChromeDriverManager().install())
driver=webdriver.Chrome(service=service)
response=driver.get(f'https://www.google.com/search?q={keyword}&sxsrf=ALiCzsadE49SRlwdOzINREC1wSxMZD0kiw:1661318376125&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjjoaud3d75AhUXmVYBHUXqBUMQ_AUoAXoECAIQAw&biw=767&bih=712&dpr=1.25&safe=active&ssui=on#imgrc=hIwGHHtQdIeMRM')
driver.maximize_window
driver.implicitly_wait(5)
before_h=driver.execute_script('return window.scrollY')
while True:
driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
time.sleep(1)
after_h=driver.execute_script('return window.scrollY')
if before_h==after_h:
break
before_h=after_h
imgs=driver.find_elements(By.CSS_SELECTOR, 'img.rg_i.Q4LuWd')
for i, img in enumerate(imgs, 1):
if num==number:
break
# 클릭하다보면 element click intercepted 에러
#javascript로 클릭을 직접 하도록 만들기.
driver.execute_script('arguments[0].click();',img)
if i==1:
target=driver.find_elements(By.CSS_SELECTOR, 'img.n3VNCb')[0]
else:
target=driver.find_elements(By.CSS_SELECTOR, 'img.n3VNCb')[1]
img_src=target.get_attribute('src')
#403:Forbidden 에러 해결
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozila/5.0')]
urllib.request.install_opener(opener)
try:
urllib.request.urlretrieve(img_src, f'{keyword}.google/{i}.png')
except:
pass
num+=1
답변 3
0
질문 하나가 해결되지 않아서 다시 질문드려요. 지금 구글에 이미지를 검색해서 클래스를 추출하면 n3VNCb.KAlRDb가 나오더라구요.
그리고 그 클래스를 추출하면 큰 이미지 하나만 있어서, find_element를 사용했습니다.
그런데 img_src=target.get_attribute['src']에서 에러가 발생했습니다.
'method' object is not subscriptable 라고 뜨네요. 왜 오류가 발생하는 것인가요?
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
import urllib.request
import time
import os
import pyautogui
keyword=pyautogui.prompt('검색어를 입력하세요')
number=pyautogui.prompt('몇 페이지까지 크롤링할까요?')
num=0
if not os.path.exists(f'{keyword}.pre'):
os.mkdir(f'{keyword}.pre')
service=Service(executable_path=ChromeDriverManager().install())
driver=webdriver.Chrome(service=service)
url=f'https://www.google.com/search?q={keyword}&sxsrf=ALiCzsYWdTh8-pf-RbVUKlr6vcRh_RrRHQ:1661388994496&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiY4eam5OD5AhXVE4gKHeWbABoQ_AUoAXoECAIQAw&safe=active&ssui=on'
driver.get(url)
driver.maximize_window
driver.implicitly_wait(1)
before_h=driver.execute_script('return window.scrollY')
while True:
driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
after_h=driver.execute_script('return window.scrollY')
if before_h==after_h:
break
before_h=after_h
imgs=driver.find_elements(By.CSS_SELECTOR, 'img.rg_i.Q4LuWd')
for i, img in enumerate(imgs, 1):
if number==num:
break
driver.execute_script('arguments[0].click();', img)
target=driver.find_element(By.CSS_SELECTOR, 'img.n3VNCb.KAlRDb')
time.sleep(1)
img_src=target.get_attribute['src']
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozila/5.0')]
urllib.request.install_opener(opener)
try:urllib.request.urlretrieve(img_src, f'{keyword}.pre/{i}.png')
except:
pass
num+=1
0
0
안녕하세요!!
해당 오류는 테스트 해본 결과
이미지를 클릭하고 로딩할 시간을 주지 않아서 발생하는 오류 입니다.
time.sleep(2) 정도 기다린 후 이미지를 저장하시면 정상적으로 큰 이미지가 다운로드 됩니다.
안녕하세요. () 와 [] 를 구분하고 사용하셔야 합니다 ^^
객체.메소드()
객체.딕셔너리[]
get_attribute('src') 로 바꾸어 주셔야 합니다.