Language/Python

[Python] selenium - 크롤링 (2) actions을 이용한 스크롤링

도토리즈 2023. 6. 21. 22:19

actions 을 이용한 keys.PAGE_DOWN을 이용한

스크롤이 있는 페이지 데이터 크롤링 !

URL : https://shopping.naver.com/living/homeliving/home

 네이버 쇼핑은 무한 스크롤이 있는 웹 페이지라서 크롤링 하게 되면 전체 요소가 나타나지 않음 

따라서 스크롤링(PAGE DOWN) 하면서 데이터 정보 가져오기 ! 

from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service as ChromeService
from bs4 import BeautifulSoup
import time


@api_view(['POST'])
def test(request) : 

    options = webdriver.ChromeOptions()
    options.add_experimental_option("detach", True)
    path  = 'C:\\chromedriver\\chromedriver.exe'
    service = ChromeService(executable_path=path)
    driver = webdriver.Chrome(service=  service , options=options)

    url = "https://shopping.naver.com/living/homeliving/home"

    driver.get(url)
    driver.maximize_window()
	
    # load 되는 시간까지 sleep 3초  
    time.sleep(3)
    
    #스크롤 20번으로 조정 
    scroll_time = 20
    title_list=  []
    actions = ActionChains(driver)
    for i in range(0,scroll_time) : 
        names  = driver.find_elements(By.CSS_SELECTOR, 'p.e1bUyeKcqU')
        for name in names : 
            value = name.text 
            # title_list에 포함하지 않는 value만 append해줌 (중복 방지)
            if value not in title_list :
                title_list.append(value)
                
        actions.send_keys(Keys.PAGE_DOWN)
        actions.perform()
        # no elements 방지를 위한 sleep 
        time.sleep(3)

    print(title_list)
    return Response({"title" : title_list})

전 ) 

후 )

스크롤 20번 내리면서 상품명 가져옴