강의

멘토링

로드맵

Inflearn brand logo image

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

김정호님의 프로필 이미지
김정호

작성한 질문수

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

셀레니움으로 데이터 받아오기 (feat. 독특한 스크롤 이벤트)

네이버쇼핑 크롤링 예제 관련

작성

·

90

0

네이버 쇼핑 크롤링예제 부분에서 그냥 requests로 한번 접속해보고 그 다음에 셀레니움으로 접속해봤는데 둘다 접속 제한 페이지만 나옵니다.ㅜㅜ. 여러번 시도 한것도 아닌데 지금 시점 네이버쇼핑이 원래 빡시게 막아 놓은건가가요? 방법이 없나요?

답변 2

0

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

얼마전에 업데이트가 있었어요 😂
최근 네이버 쇼핑이 셀레니움쪽의 자동화를 완전히 막아놓은 상태입니다.

일반 브라우저에서도 URL로 접근시 봇방지 문자가 뜨네요..

김정호님의 프로필 이미지
김정호
질문자

네이버는 막혀서

다음으로 실습해봤습니다.

다음은 딱히 안막는 같은데

네이버와 달리 일반상품과 광고상품으로 구분은 없어서

마지막 페이지까지 크롤링해봤습니다.

(13페이지까지 있는 품목으로)

결과는 나오는거 같은데 혹시 잘못된 부분이나 부족한 부분있으면 답장 부탁드립니다^^;;

 

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

import time

from bs4 import BeautifulSoup

# 크롬 드라이버 생성
driver = webdriver.Chrome()

for page in range(1, 20):

    url = f"https://shoppinghow.kakao.com/search/%ED%97%88%EB%8B%AD%20FIT%20%EC%A0%80%EC%97%BC/page:{page}&view_type:list&image_filter_cnt:77"

    driver.get(url)

    # 스크롤전 높이 측정
    last_height = driver.execute_script("return document.body.scrollHeight")

    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

        # 대기 시간이 없으면 1번만 스크롤한다. 중요!!!!!!
        time.sleep(1)
        # 스크롤 후 높이
        after_height = driver.execute_script("return document.body.scrollHeight")
        # 비교
        if last_height == after_height:
            print(after_height)
            break

        # 스크롤 전 높이 업데이트
        last_height = after_height

    html = driver.page_source
    soup = BeautifulSoup(html,'html.parser')

    items = soup.select(".wrap_prod_top")
    i = 1
    for item in items:

        name = item.select_one(".wrap_cont > strong > a").text
        link = "https://shoppinghow.kakao.com/" + item.select_one(".wrap_cont > strong > a").attrs['href']
        price = item.select_one("span.num_price.lowest").text.replace("최저가","")


        print(page,i,name,price,link)
        i += 1

    # 맨뒤 버튼 확인
    last_page_btn = soup.select_one("#searchContent > div.cont_result > div.wrap_prod_list > div > span > a.ico_comm3.btn_next")

    if last_page_btn is None:
        break     
    print(page,i,name,price,link)

 

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

수집되는거 테스트하고 코드확인해봤습니다.

for i in range(1, 10000):
이런식으로 완전 큰 숫자 넣어주면 좋을 듯해요


나머지는 아주 깔끔한데요?? ㅎㅎ
바로 다른 사이트로가서 응용하는 모습 너무 보기 좋습니다 👏🏻👏🏻👏🏻

0

안녕하세요, 인프런 AI 인턴입니다.

김정호님께서 네이버 쇼핑 크롤링을 시도하는 중에 접속 제한 페이지가 나타나는 상황을 겪고 계신 것 같네요. 네이버와 같은 대형 웹사이트는 비정상적인 접속을 방지하기 위해 다양한 크롤링 방지 기술, 혹은 봇 탐지 시스템을 적용합니다. 이러한 조치는 사이트의 로딩 속도를 유지하고 부하를 줄이기 위해 필수적이죠.

현재 네이버 쇼핑에서 크롤링을 하기 위한 몇 가지 팁을 드리자면:

  1. 느린 요청: 크롤링 시 지나치게 빠른 요청은 자동화 도구로 감지될 수 있습니다. 따라서 time.sleep() 등을 사용하여 요청 간 간격을 조정해 주세요.

  2. 유저 에이전트(User-Agent) 설정: HTTP 요청 시 브라우저에서 보내는 것과 유사한 User-Agent 헤더를 포함시켜 보세요. 이를 통해 브라우저에서 요청하는 것처럼 보이게 할 수 있습니다.

  3. IP 변경: 동일한 IP에서 많은 요청이 감지되면 차단될 수 있습니다. 이런 경우 VPN이나 프록시를 사용해 IP를 변경해 보는 것도 방법입니다.

  4. 헤드리스 브라우저: 셀레니움을 사용할 때, 헤드리스 모드를 사용하여 브라우저가 실제로 열리지 않고도 크롤링할 수 있습니다. 다만 이 또한 탐지될 가능성이 있으니 주의가 필요합니다.

  5. 셀레니움 외 다른 라이브러리 사용: 경우에 따라 BeautifulSoup과 같은 라이브러리를 병행하여 사용할 수 있는데, 네이버 쇼핑의 경우 Javascript로 렌더링되므로 셀레니움이나 다른 헤드리스 브라우저가 더 적합할 수 있습니다.

참고로, 유사한 질문이 게시판에 다수 있습니다:

저는 김정호님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김정호님의 프로필 이미지
김정호

작성한 질문수

질문하기