안녕하세요, 여러분! 오늘은 프로그래밍과 데이터 수집에 관심 있는 분들을 위해 흥미롭고 유익한 주제를 가져왔습니다. 바로 Selenium과 Scrapy를 이용해 네이버 쇼핑에서 제품명을 크롤링하는 방법을 소개해드리려고 합니다. 이 글을 통해 웹 크롤링의 기초부터 고급 기술까지 배우실 수 있을 거예요.
왜 Selenium과 Scrapy를 함께 사용할까요?
웹 크롤링을 할 때, 종종 동적으로 로드되는 콘텐츠를 마주하게 됩니다. 이러한 동적 콘텐츠는 일반적인 HTML 파싱으로는 접근하기 어려운데, 이때 Selenium이 큰 도움이 됩니다. Selenium은 실제 브라우저를 제어하여 JavaScript로 렌더링된 콘텐츠를 포함한 모든 페이지 요소에 접근할 수 있게 해줍니다. 반면 Scrapy는 빠르고 효율적인 크롤링을 가능하게 해주는 프레임워크로, 데이터 수집과 저장에 최적화되어 있습니다.
이 두 가지 도구를 결합하면, 동적 콘텐츠를 처리하면서도 대량의 데이터를 효율적으로 수집할 수 있습니다.
준비물
- Python 설치
- Selenium 및 Scrapy 라이브러리 설치
- 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
마무리
이번 포스트에서는 Selenium과 Scrapy를 결합하여 네이버 쇼핑에서 제품명을 크롤링하는 방법을 알아보았습니다. 이 두 가지 도구의 강점을 결합하여 더 강력하고 유연한 크롤러를 만들 수 있습니다. 이 방법을 응용하면 다양한 웹사이트에서 원하는 데이터를 효율적으로 수집할 수 있을 것입니다.
여러분도 직접 따라 해보시고, 필요한 데이터를 손쉽게 수집해보세요. 그럼 다음에 더 흥미로운 주제로 찾아뵙겠습니다! 😊
실행결과
'Develop' 카테고리의 다른 글
Selenium 실행을 위한 ChromeDriver 설치 가이드 (0) | 2024.07.08 |
---|---|
Stable Diffusion: Automatic 1111 설치 및 활용 가이드 (0) | 2024.07.08 |
쿠팡 웹사이트 크롤링하기 - 제품명, 가격, 및 링크 추출하기 (2) | 2024.07.03 |
YOLOv8을 이용한 객체 감지와 MP4 파일로 저장하기 (1) | 2024.07.02 |
부산광역시 아파트 매매 현황 - 데이터 통찰과 시각화 (0) | 2024.06.30 |