인프런 커뮤니티 질문&답변

찬솔님의 프로필 이미지
찬솔

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

2단계 - 나무태그 찾기

무한스크롤 관련 내용입니다.

작성

·

560

0

안녕하세요! 다른분꺼 내용 보고 해답을 찾을 뻔 했다가 무한스크롤이 50번째에서 멈추는 현상을 발견했습니다 ㅠㅠ

 

저는 크롬 브라우저를 띄우지 않고 진행하니까 500개까지 크롤링이 되었는데, 크롬 브라우저를 띄우고 진행하고싶은데 어떻게 해결해야할까요,,?

 

로딩시간 2초정도 할당했는데 진행이 안되서 질문 남깁니다!

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

import urllib.request

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

import time
import pyautogui
import os

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 크롬창 안뜨게 함
chrome_options.add_argument('--headless') # headless 모드 활성화
chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화

# Mozilla 웹 브라우저에서 온 것처럼 인식 / 자동화된 요청을 감지하고 차단하는 것을 우회
chrome_options.add_argument("--user-agent=Mozilla/5.0")

# 불필요 메세지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 드라이버 업데이트
service = Service(executable_path=ChromeDriverManager().install())

# 옵션 적용
browser = webdriver.Chrome(service=service, options=chrome_options)

keyword = pyautogui.prompt('검색어를 입력하세요.')

# 폴더 만들기
if not os.path.exists(f'크롤링/심화2/{keyword}모음'):
    os.mkdir(f'크롤링/심화2/{keyword}모음')

# path = f'https://www.google.co.kr/search?tbm=isch&hl=ko&source=hp&biw=&bih=&q={keyword}' # 구글
path = f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={keyword}' # 네이버
browser.implicitly_wait(5)
browser.maximize_window()
browser.get(path)

before_h = browser.execute_script("return window.scrollY")

# 무한스크롤
while True:
    time.sleep(2)
    # 맨 아래로 스크롤을 내림
    browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END)
    
    # 스크롤 후 높이
    after_h = browser.execute_script("return window.scrollY")
    
    # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출
    if after_h == before_h:
        break
    
    # 스크롤 높이 업데이트
    before_h = after_h

# 이미지 태그 추출
imgs = browser.find_elements(By.CSS_SELECTOR, '._image._listImage')

for i, img in enumerate(imgs, 1):
    # 각 이미지 태그의 주소 추출
    link = img.get_attribute('src')
    
    # 이미지 저장
    urllib.request.urlretrieve(link, f'크롤링/심화2/{keyword}모음/{i}.png')
    
    print(f'img {i}개: {link}')
        
print('\nDvlp.H.Y.C.Sol\n')

 

답변 2

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

크롬 브라우저를 띄우고 진행하고 싶다면

headless 옵션을 주지 않으면 됩니다 ㅎㅎ

 

아래와 같이 headless 옵션을 없애고 진행해 보세요

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

import urllib.request

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

import time
import pyautogui
import os

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화

# Mozilla 웹 브라우저에서 온 것처럼 인식 / 자동화된 요청을 감지하고 차단하는 것을 우회
chrome_options.add_argument("--user-agent=Mozilla/5.0")

# 불필요 메세지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 드라이버 업데이트
service = Service(executable_path=ChromeDriverManager().install())

# 옵션 적용
browser = webdriver.Chrome(service=service, options=chrome_options)

keyword = pyautogui.prompt('검색어를 입력하세요.')

# 폴더 만들기
if not os.path.exists(f'크롤링/심화2/{keyword}모음'):
    os.mkdir(f'크롤링/심화2/{keyword}모음')

# path = f'https://www.google.co.kr/search?tbm=isch&hl=ko&source=hp&biw=&bih=&q={keyword}' # 구글
path = f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={keyword}' # 네이버
browser.implicitly_wait(5)
browser.maximize_window()
browser.get(path)

before_h = browser.execute_script("return window.scrollY")

# 무한스크롤
while True:
    time.sleep(2)
    # 맨 아래로 스크롤을 내림
    browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END)
    
    # 스크롤 후 높이
    after_h = browser.execute_script("return window.scrollY")
    
    # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출
    if after_h == before_h:
        break
    
    # 스크롤 높이 업데이트
    before_h = after_h

# 이미지 태그 추출
imgs = browser.find_elements(By.CSS_SELECTOR, '._image._listImage')

for i, img in enumerate(imgs, 1):
    # 각 이미지 태그의 주소 추출
    link = img.get_attribute('src')
    
    # 이미지 저장
    urllib.request.urlretrieve(link, f'크롤링/심화2/{keyword}모음/{i}.png')
    
    print(f'img {i}개: {link}')
        
print('\nDvlp.H.Y.C.Sol\n')

0

안녕하세요 찬솔님, 인프런 AI 인턴이에요.
무한스크롤이 50번째에서 멈추는 현상이 발생하는 이유는 브라우저가 스크롤 후 데이터를 동적으로 로드하는 동안에 스크롤을 끊어서 그렇습니다.

크롬 브라우저를 띄우고 진행하고 싶으시다면, Selenium을 사용할 때 브라우저 창을 실행할 때 옵션을 변경하셔야 합니다. 현재 코드에는 headless 모드와 GPU 가속을 비활성화한 옵션이 적용되어 있습니다. 이 부분을 수정하면 크롬 브라우저가 실행되도록 변경할 수 있습니다.

아래는 코드를 수정한 예시입니다:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

import urllib.request
import time
import pyautogui
import os

# 브라우저 실행
browser = webdriver.Chrome()  # 이 부분을 수정하세요. (크롬 드라이버의 경로를 넣어주세요)

keyword = pyautogui.prompt('검색어를 입력하세요.')

# 폴더 만들기
if not os.path.exists(f'크롤링/심화2/{keyword}모음'):
    os.mkdir(f'크롤링/심화2/{keyword}모음')

# path = f'https://www.google.co.kr/search?tbm=isch&hl=ko&source=hp&biw=&bih=&q={keyword}' # 구글
path = f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={keyword}'  # 네이버

browser.implicitly_wait(5)
browser.maximize_window()
browser.get(path)

before_h = browser.execute_script("return window.scrollY")

# 무한스크롤
while True:
    time.sleep(2)
    # 맨 아래로 스크롤을 내림
    browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)

    # 스크롤 후 높이
    after_h = browser.execute_script("return window.scrollY")

    # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출
    if after_h == before_h:
        break

    # 스크롤 높이 업데이트
    before_h = after_h

# 이미지 태그 추출
imgs = browser.find_elements(By.CSS_SELECTOR, '._image._listImage')

for i, img in enumerate(imgs, 1):
    # 각 이미지 태그의 주소 추출
    link = img.get_attribute('src')

    # 이미지 저장
    urllib.request.urlretrieve(link, f'크롤링/심화2/{keyword}모음/{i}.png')

    print(f'img {i}개: {link}')

print('\nDvlp.H.Y.C.Sol\n')

이렇게 수정하시면 크롬 브라우저 창이 실행되고 무한스크롤이 정상적으로 진행됩니다. 추가로 크롬 드라이버가 설치되어 있어야 합니다. 크롬 드라이버는 여기에서 다운로드 받으실 수 있습니다.

수정된 코드를 이용하여 무한스크롤을 진행해보시고 문제가 해결되었는지 확인해보세요. 감사합니다!

찬솔님의 프로필 이미지
찬솔

작성한 질문수

질문하기