728x90

AWS 람다(Lambda)는 기본적인 라이브러리만 제공하고, 필요한 라이브러리를 import 하더라도 실행되지 않습니다. 따라서 머신러닝(Machine Learning)이나 크롤링 등을 개발하기 위해서는 추가적인 라이브러리 사용을 위해 필요한 라이브러리를 압축해서 올려서 사용해야 합니다.

웹 크롤링에 많이 사용되는 BeautifulSouprequests 라이브러리를 활용해서 API 서버를 구현해보겠습니다.

1. 디렉토리를 만들고 BeatifulSoup과 requests 라이브러리를 설치합니다.

설치된 파일은 아래 계층구조로 zip파일로 압축 해야 라이브러리를 인식할수 있습니다.

Python : python, python/lib/python3.7/site-packages(사이트 디렉토리)

mkdir python \
cd python

# 현재 폴더 위치에 설치하도록 -t 옵션을 붙입니다.
pip3 install bs4 -t .
ptp3 install requests -t .

# 상위 폴더에서 설치한 파일을 압축합니다.
cd ..
zip -r crawls.zip .

2. Lambda Layers 활용하여 공통으로 사용하는 라이브러리를 등록합니다.

Lambda Layers는 버전별로 수정이 불가능하고 만약 수정이 필요하다면 zip파일을 다시 올리고 새로운 리비전이 생성됩니다.

3. 함수 생성 및 Layer 추가

크롤링 함수를 생성합니다.

Layer에 라이브러리를 추가합니다.

4. 코드 입력

삼성전자의 PBR 값을 구하는 코드를 작성해보겠습니다.

import json
import requests
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    # TODO implement
    fs_url = 'http://comp.fnguide.com/svo2/asp/SVD_Finance.asp?pGB=5&cID=&MenuYn=Y&ReportGB=D&NewMenuID=103&stkGb=701&gicode=A005930'
    fs_page = requests.get(fs_url)

    soup = BeautifulSoup(fs_page.text, "html.parser")

    corp_info_list = soup.find("div", {"id":"corp_group2"})

    print(corp_info_list.prettify())

    data = corp_info_list.select("dl")
    pbr = data[6].select("dd")[1].string

    json_data = {
        'pbr' : pbr
    }

    return {
        'statusCode': 200,
        'body' : json.dumps(json_data)
    }

작성한 코드를 테스트 하기 위한 이벤트를 구성합니다.

Lambda는 기본 128MB, 3초 Time-out입니다. 데이터 크롤링 위해 메모리와 Time-Out을 늘립니다.

5. 결과 확인

Reference

  1. https://beomi.github.io/2018/11/30/using-aws-lambda-layers-on-python3/
  2. https://medium.com/@rabter/aws-lambda-layer를-사용하는-방법-how-to-use-aws-lambda-layers-c206ba40d4cc
728x90
반응형

+ Recent posts