본문 바로가기

Develop

Selenium과 Scrapy를 이용해 네이버 쇼핑 크롤링하기

 

안녕하세요, 여러분! 오늘은 프로그래밍과 데이터 수집에 관심 있는 분들을 위해 흥미롭고 유익한 주제를 가져왔습니다. 바로 SeleniumScrapy를 이용해 네이버 쇼핑에서 제품명을 크롤링하는 방법을 소개해드리려고 합니다. 이 글을 통해 웹 크롤링의 기초부터 고급 기술까지 배우실 수 있을 거예요.

왜 Selenium과 Scrapy를 함께 사용할까요?

웹 크롤링을 할 때, 종종 동적으로 로드되는 콘텐츠를 마주하게 됩니다. 이러한 동적 콘텐츠는 일반적인 HTML 파싱으로는 접근하기 어려운데, 이때 Selenium이 큰 도움이 됩니다. Selenium은 실제 브라우저를 제어하여 JavaScript로 렌더링된 콘텐츠를 포함한 모든 페이지 요소에 접근할 수 있게 해줍니다. 반면 Scrapy는 빠르고 효율적인 크롤링을 가능하게 해주는 프레임워크로, 데이터 수집과 저장에 최적화되어 있습니다.

이 두 가지 도구를 결합하면, 동적 콘텐츠를 처리하면서도 대량의 데이터를 효율적으로 수집할 수 있습니다.

준비물

  1. Python 설치
  2. Selenium 및 Scrapy 라이브러리 설치
  3. ChromeDriver 다운로드 및 설정

먼저 필요한 라이브러리를 설치합니다:

pip install selenium scrapy webdriver_manager

 

생성

(crawl) ➜  scrapy startproject mycrawl
New Scrapy project 'mycrawl', using template directory '/home/hm/.pyenv/versions/3.10.4/envs/crawl/lib/python3.10/site-packages/scrapy/templates/project', created in:
    /home/hm/work/hmcrawl/project/mycrawl

You can start your first spider with:
    cd mycrawl
    scrapy genspider example example.com

(crawl) ➜  cd mycrawl
(crawl) ➜  mycrawl scrapy genspider naver_shopping shopping.naver.com
Created spider 'naver_shopping' using template 'basic' in module:
  mycrawl.spiders.naver_shopping

 

프로젝트 구조

프로젝트는 다음과 같은 디렉토리 구조를 가집니다:

 

(crawl) ➜  mycrawl tree
├── mycrawl
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── __pycache__
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       ├── naver_shopping.py
│       ├── __pycache__
│       └── spider.py
├── products.json (크롤링 결과 파일)
├── README.md
├── requirements.txt
└── scrapy.cfg

 

스파이더 작성

이제 스파이더를 작성해보겠습니다. spiders 디렉토리에 naver_spider.py 파일을 생성합니다.

 

import time
import scrapy
from scrapy_selenium import SeleniumRequest
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class NaverShoppingSpider(scrapy.Spider):
    name = "naver_shopping"

    allowed_domains = ["shopping.naver.com"]

    def start_requests(self):
        url = "https://shopping.naver.com/home"
        yield SeleniumRequest(url=url, callback=self.parse)

    def parse(self, response):
        driver = response.meta['driver']

        # 검색어 입력
        search_input = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//input[contains(@class, '_searchInput_search_text_')]"))
        )
        search_input.send_keys("노트북")

        # 엔터키 입력
        search_input.send_keys(Keys.ENTER)


        # 페이지 로딩 대기
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'basicList_list_basis__')]"))
        )

        # 스크롤 다운 (더 많은 결과 로딩)
        for _ in range(0, 5):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(0.5)

        # 상품 정보 추출
        products = driver.find_elements(By.XPATH, "//div[contains(@class, 'product_item__')]")
        ret = []

        for product in products:
            title = product.find_element(By.XPATH, ".//a[contains(@class, 'product_link__')]").text
            price = product.find_element(By.XPATH, ".//span[contains(@class, 'price_num__')]").text
            # product_compare = product.find_element(By.XPATH, ".//span[contains(@class, 'product_compare__')]").text

            item = {
                'title': title,
                'price': price,
                # 'product_compare': product_compare
            }
            yield item
            ret.append(item)

 

설정 파일 업데이트

settings.py 파일을 업데이트하여 필요한 설정을 추가합니다.

 

# settings.py

BOT_NAME = 'naver_shopping'

SPIDER_MODULES = ['naver_shopping.spiders']
NEWSPIDER_MODULE = 'naver_shopping.spiders'

ROBOTSTXT_OBEY = True

CONCURRENT_REQUESTS = 1
DOWNLOAD_DELAY = 2

COOKIES_ENABLED = False

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
}

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
}

 

크롤링 실행

이제 모든 준비가 끝났습니다. 크롤러를 실행하여 데이터를 수집해보겠습니다.

scrapy crawl naver_shopping -o products.json
 

위 명령어를 실행하면 products.json 파일에 크롤링한 제품명이 저장됩니다.

 

코드

혹시라도 위 내용대로 작동하지 않는 경우가 생기면, github 에서 전체파일을 다운로드 받을 수 있습니다. 개선사항 알려주시면 수정하겠습니다.~

 

https://github.com/harry81/mycrawl

 

GitHub - harry81/mycrawl

Contribute to harry81/mycrawl development by creating an account on GitHub.

github.com

 

마무리

이번 포스트에서는 Selenium과 Scrapy를 결합하여 네이버 쇼핑에서 제품명을 크롤링하는 방법을 알아보았습니다. 이 두 가지 도구의 강점을 결합하여 더 강력하고 유연한 크롤러를 만들 수 있습니다. 이 방법을 응용하면 다양한 웹사이트에서 원하는 데이터를 효율적으로 수집할 수 있을 것입니다.

여러분도 직접 따라 해보시고, 필요한 데이터를 손쉽게 수집해보세요. 그럼 다음에 더 흥미로운 주제로 찾아뵙겠습니다! 😊

 

실행결과

https://youtu.be/Z6UAz6GaMbc

 

 

 
반응형