웹크롤러를 이용한 Telegram Bot 미니미니프로젝트 만들기

Updated:

Telegram Bot with Web Crawler

이번 시간에는 python web crawler를 이용하여 웹페이지 상품정보를 가져와서 Telegram Bot과 연동하여 상품정보를 보여주는 미니 프로젝트로 웹크롤링에 대해 공부해보겠습니다.

개요

Seleniumwebdriver라는 API를 통해 브라우저를 제어할 수 있습니다. 또한 BeautifulSoup이란 라이브러리를 사용합니다. BeautifulSoup은 HTML, XML의 형식의 데이터를 다룰 때 사용합니다. 저는 런칭샵이란 사이트를 크롤링해보겠습니다.

런칭샵을 크롤링해서 python-telegram-bot모듈로 telegram bot과 커뮤니케이션할 수 있도록 합니다.

1. requirements

우선 프로젝트에 필요한 python 모듈을 설치해줍니다.

pip install selenium
pip install bs4
pip install python-telegram-bot

2. 상품정보 가져오기

우선, 크롤링하기 앞서 런칭샵이란 사이트에서 어떤 제품을 팔고 있는지 살펴봅시다.

all_goods

페이지 밑에 전체상품을 보여주고 있습니다. F12 버튼을 눌러서 개발자도구를 통해 웹페이지 소스파일을 볼 수 있습니다.

page_source

전체상품 페이지에서 상품 정보, 가격, 상품 정보를 간략히 보여주고 있습니다.

all_goods_xpath

전체 상품은 div태그의 class명으로 module_list_product_default extend_five extend_thumbnail_wide란 이름을 갖고 있습니다. 이 부분에서 오른쪽 마우스 클릭, Copy에 Copy XPath를 눌러줍니다.

그럼 //*[@id="content"]/form/div[2]/div 라는 XPath 위치 정보를 갖고 있는 것을 알 수 있습니다. 그리고 그 안에 <li>태그로 각 상품의 정보를 담고 있는 것을 알 수 있습니다.

이제 python 코드를 작성해 보겠습니다. 먼저 모든 상품정보를 담을 수 있는 클래스 생성해 보겠습니다.

상품정보 클래스에는 다음과 같은 정보를 넣습니다.

  • 상품명
  • 할인 가격
  • 원 가격
  • 할인률
  • 제품 상세 링크

그리고 getter 메서드를 생성해줍니다.

#-*- coding: utf-8 -*-
# goods.py

class Goods:
    # 상품정보 클래스
    def __init__(self,
                 goods_name,
                 discounted_price,
                 original_price,
                 discount_rate,
                 goods_link):
        self._goods_name = goods_name
        self._discounted_price = discounted_price
        self._original_price = original_ice
        self._discount_rate = discount_rate
        self._goods_link = goods_link
        
    def getGoodsName(self):
        return self._goods_name
    
    def getDiscountedPrice(self):
        return self._discounted_price
    
    def getOriginalPrice(self):
        return self._original_price
    
    def getDiscountRate(self):
        return self._discount_rate
    
    def getGoodsLink(self):
        return self._goods_link
    
    def __str__(self):
        return "************\n상품명: {}\n할인된 가격: {}\n원   가: {}\n할인률: {}\n상품 링크: {}\n************\n".format(
            self._goods_name,
            self._discounted_price,
            self._original_price,
            self._discount_rate,
            self._goods_link
        )

상품정보 클래스 생성 후, 전체상품을 크롤링하는 함수를 작성합니다. selenium의 driver를 인자로 받습니다. 아까 복사해둔 XPath를 driverfind_element_by_xpath인자로 넣어줍니다. BeautifulSoup으로 HTML 을 parsing해줍니다. 이제 전체 상품정보의 각 상품의 간략한 정보를 가져옵니다. 전체 상품은 <li>로 구성되어 있기 때문에 select함수를 사용하여 <li>태그가 붙은 모든 정보를 가져옵니다. 이제 각 상품의 세세한 정보를 가져올 수 있게 합니다.

#-*- coding:utf-8 -*-
# goods.py

from bs4 import BeautifulSoup

def goodsALL(driver):
	url = 'https://smartstore.naver.com'
    goods_xpath = driver.find_element_by_xpath('//*[@id="content"]/form/div[2]/div')
    soup = BeautifulSoup(goods_xpath.get_attribute('innerHTML'), 'html.parser')
    goods = soup.select('li')
    goods_list = []
    for a_tag in goods:
        link = a_tag.select('a.area_overview')[0].attrs['href']
        good_info = [info.text for in a_tag.select('strong')]
        good_info.append(url + link)
        good = Goods(*good_info)
        goods_list.append(good)
        
    return goods_list

for문 안에 good_info라는 변수에 정보를 담고 Goods 객체를 생성합니다. 그리고 모든 Goods객체를 list형태로 묶어서 반환합니다.

3. 상세 상품 보기

상품 Link를 통해서 상품의 자세한 정보를 크롤링해보겠습니다.

goods_info_detail

상품 정보는 다음과 같이 옵션이란 곳에 SelectBox로 구성되어 있습니다.

goods_info_source

상품의 정보를 확인해보면 SelectBox 안의 정보를 확인할 수 없습니다. javascript로 되어 있기 때문에 Selenium을 통해 크롤링합니다. 그리고 우선 제품선택 후, 두 번째 옵션인 사이즈 정보를 볼 수 있습니다.

goods_info_option_detail

오타 등 언제든 말씀해주십시오. 글 읽어 주셔서 감사합니다.

Comments