inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

2단계 - 나무태그 찾기

스크롤이 되지 않는 오류.

해결된 질문

1114

kys915

작성한 질문수 1

0

안녕하세요. 스타트코딩 선생님.

강의 재미있게 듣고 실습하고 있습니다.

deprecated 경고문 제외하고는 큰 문제 없이 실행되어 50개의 결과는 가져옵니다.

그런데 좀 특이한 몇 가지 문제가 있습니다.

 

① 크롬이 불필요하게 2개 창으로 실행됩니다. 창 하나는 주소표시줄에 data; 라고 쓰여있는, 아무 동작도 하지 않는 텅 빈 화면을 보여주고, 그 다음에 열리는 크롬창은 네이버 이미지 검색 결과 화면이 우선은 잘 출력됩니다.

② 두 번째로 열리는 크롬창에서 검색 결과 화면까지는 나오고 주소까지 크롤링 되는데, 스크롤이 되지 않습니다. 그냥 화면에 보이는 이미지의 주소 결과 딱 50개만 크롤링 되는 것 같아요.

 

어지간해서는 대부분 구글링으로 해결했는데, 이 부분은 찾기가 어려워 직접 여쭤봅니다.

조언 부탁드립니다.

 

 

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

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

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

# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)


# 웹페이지 해당 주소 이동
url = "https://search.naver.com/search.naver?where=image&sm=tab_jum&query=BTS"

browser = webdriver.Chrome("c:/chromedriver.exe")
browser.implicitly_wait(5)
browser.maximize_window()
browser.get(url)

# 무한 스크롤 처리

# 스크롤 전 높이
before_h = browser.execute_script("return window.scrollY")
                                 
# 무한 스크롤
while True:
    # 맨 아래로 스크롤을 내린다.
    browser.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)

    # 스크롤 사이 페이지 로딩 시간
    time.sleep(2)

    # 스크롤 후 높이
    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):
    # 각 이미지 태그의 주소
    img_src = img.get_attribute("src")
    print(i, img_src)

python 웹-크롤링

답변 1

0

스타트코딩

안녕하세요! 수강생님

 

① 크롬이 불필요하게 2개 창으로 실행됩니다. 창 하나는 주소표시줄에 data; 라고 쓰여있는, 아무 동작도 하지 않는 텅 빈 화면을 보여주고, 그 다음에 열리는 크롬창은 네이버 이미지 검색 결과 화면이 우선은 잘 출력됩니다.

-> 크롬 드라이버를 두번 호출하였기 때문입니다.

 

driver = webdriver.Chrome(service=service, options=chrome_options) # 여기서 한번

browser = webdriver.Chrome("c:/chromedriver.exe") # 여기서 또 한번

 

driver = webdriver.Chrome(service=service, options=chrome_options)

-> 크롬 드라이버 매니저를 이용해서 자동으로 다운받는 방식

 

browser = webdriver.Chrome("c:/chromedriver.exe")

-> 컴퓨터에 다운로드 된 크롬 드라이버를 이용하는 방식

두 가지 중 하나만 사용해 주세요 :)

 

② 두 번째로 열리는 크롬창에서 검색 결과 화면까지는 나오고 주소까지 크롤링 되는데, 스크롤이 되지 않습니다. 그냥 화면에 보이는 이미지의 주소 결과 딱 50개만 크롤링 되는 것 같아요.

-> 제가 같은 코드로 테스트 해본 결과 스크롤이 잘 동작합니다. 500개 출력 되네요. 다시 한번 테스트 해 보시겠어요?

 

 

 

4

kys915

감사합니다. 선생님. 조언 덕에 해결하였습니다.

남은 부분도 열심히 공부하겠습니다. 감사합니다.

 

혹 저와 같은 문제를 겪으시는 분들이 계실까 하여, 제가 해결한 부분을 언급하겠습니다.

 

① 우선 크롬 드라이버는 로컬이 아닌 자동 다운 방식만 남겨두었습니다.

service = Service(executable_path=ChromeDriverManager().install())
browser = webdriver.Chrome(service=service, options=chrome_options)

 

② 또한 무한 스크롤은 여러 방법으로 테스트 해 본 결과, 웹 브라우저와 인터넷 속도 및 이미지의 로딩 속도 등에 따라 어느정도 유휴시간이 필요했습니다. 그래서 저는 웹 페이지 로딩 때 time.sleep 을 먼저 주고, 이미지가 표시된 후에 END 키를 통해 스크롤 다운을 후행하도록 조치하여 해결했습니다. 여러 요인에 의해 웹 브라우저의 반응이 조금 늦는 경우라면 time.sleep 을 스크롤 수행보다 앞쪽에 배치하는 방법이 더 안정적일 것 같습니다.

# 무한 스크롤 시작
while True:

    # 스크롤 직전 페이지 로딩 시간 주기
    time.sleep(2)

    # END 키를 통해 스크롤을 내린다.
    browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)

셀레니움 환경설정 오류

0

42

2

네이버 로그인 관련

0

233

2

안녕하세요 셀레니움에 대해서 질문

0

81

1

크롤링 연습사이트 문의

0

93

2

선택자 질문

0

71

2

'특정 요소가 나타날 때까지 스크롤' 부분 에러

0

76

2

자동 로그인 질문

0

84

2

44강 제목, 링크

0

99

1

원하는 값이 없을 때

0

88

2

크롤링한 링크가 엑셀로 들어가면 작동이 안되요

0

224

2

셀레니움 PDF자료는 받을 수 있나요

0

100

2

글목록 추출하기

0

96

2

메일 자동화 로그인 중복방지문자해결 오류 및 명시적 대기 질문

0

86

2

강의 노트가 어디에 있는건가요?

0

80

2

강의 커리큘럼 질문

0

95

1

조건문 else 사용하지 않는 이유

0

73

2

셀레니움으로 접근할 수 없는 경우

0

95

2

웹페이지 변경

0

70

2

자바스크립트로 태그 선택 시 질문입니다.

1

62

2

수료증은 어떻게 받나요?

0

116

2

class명을 활용하여 선택자를 만들지 않는 경우..?

0

59

2

드라이버가 안 열려요

0

78

2

이거 해결방법 아시는 분?

0

121

2

네이버 지식인 크롤링..

0

200

2