본문 바로가기

AWS Lambda ƛ/Lambda & Python

AWS Lambda를 활용하여 크롤링 봇 만들기

파이참에서 bs4 라이브러리의 BeautifulSoup 을 통해 구글의 메인 페이지의 a 태그값들을 모두 가져온다.

import urllib.request
from bs4 import BeautifulSoup

url = "https://www.google.com"
soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
a_tags = soup.find_all('a')
request_list = []
for i in a_tags:
    request_list.append((i.get_text()))
print(request_list)

그렇다면 파이참에서 실행하는것과 같이 AWS 람다에서도 실행이 가능할까?

AWS 람다에서 실행하기 위해서는 파이참에서 사용한 라이브러리인 bs4를 추가로 업로드 해줘야 한다.

pip3를 통해 해당 라이브러리인 bs4 를 특정 경로에 다운받는다.

일단 라이브러리를 다운받을 폴더를 생성한다.

CMD 화면에서 D:드라이브로 이동한다. 자꾸 이동 명령어를 까먹으니... 그냥 D:만 하면 이동 한다.

D:

해당 명령어로 bs4 라이브러리를 다운받은 후 아래와 같은 화면이 출력 된다.

pip3 install bs4 -t .
D:\python_library>pip3 install bs4 -t .
Collecting bs4
  Using cached bs4-0.0.1.tar.gz (1.1 kB)
Collecting beautifulsoup4
  Using cached beautifulsoup4-4.11.1-py3-none-any.whl (128 kB)
Collecting soupsieve>1.2
  Using cached soupsieve-2.3.2.post1-py3-none-any.whl (37 kB)
Using legacy 'setup.py install' for bs4, since package 'wheel' is not installed.
Installing collected packages: soupsieve, beautifulsoup4, bs4
    Running setup.py install for bs4 ... done
Successfully installed beautifulsoup4-4.11.1 bs4-0.0.1 soupsieve-2.3.2.post1
WARNING: You are using pip version 21.2.4; however, version 22.0.4 is available.
You should consider upgrading via the 'C:\Users\hist\AppData\Local\Programs\Python\Python310\python.exe -m pip install --upgrade pip' command.

다운받은 경로로 이동하면 아래와 같이 다운받은 파일들을 확인 할 수 있다.

다운받은 파일을 아래의 명령어를 활용하여 압축을 한다.

zip -r bs4.zip .

일단 zip 파일이 있는지 확인을 해보면 아래와 같이 'zip' 은(는) 내부 또는 외부 명령, 실행 할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라는 메세지가 출력 된다.

이는 해당 라이브러리가 현재 PC에 존재하지 않기 때문에 발생한 문제라고 볼 수 있다.

 

zip과 unzip 라이브러리를 다운받기 위해 아래의 경로로 이동하여 다운로드를 진행한다.

zip과 unzip은 윈도우의 기본명령어인줄 알았는데 아니었나봅니다.

따로 zip, unzip 파일을 다운받아야 합니다. 다음의 사이트를 접속합니다.

http://stahlworks.com/dev/?tool=zipunzip

위의 사이트에서 zip, unzip 파일을 다운받습니다. 다운받은 파일을 c:\windows\system32 디렉토리로 복사합니다.

복사 후, zip 명령어를 입력하니 아까와는 다른 화면을 볼수 있었습니다.

zip이나 zip --help 명령어를 치면 zip명령어의 옵션들을 확인 할 수 있습니다.

여러가지 옵션들이 있는데 제가 사용하는 옵션을 소개하겠습니다.

 

압축률 : 압축률에 따라 1~9사이의 숫자를 옵션으로 사용, 높을수록 압축률이 좋음

v : 진행상황 출력

m : 압축 대상 파일들을 압축파일로 이동

r : 하위 디렉토리의 폴더 파일들까지 모두 묶음

 

압축을 실행한다.

D:\python_library>zip -r bs4.zip .

AWS 람다에 Zip 파일인 라이브러리 파일을 업로드 한다.

압축한 bs4 파일을 람다 함수에 업로드 한다.

업로드 되면 해당 업로드 파일의 내용이 왼쪽 목록에 표시 된다.

여기서 주의할 점은 신규 라이브러리로 업로드 할 경우 기존에 작성되어 있던 코드는 삭제되고 새롭게 코드를 작성해야 한다.

이전에 bs4 라이브러리를 추가하면서 기존에 작성한 코드가 삭제 되었기 때문에 main 함수가 필요하다.

Java에서 처럼 main 클래스의 main 함수가 존재해야 실행이 되게 때문에 main 클래스를 작성해 보자. 해당 Lambda 코드에서 main 함수처럼 동작하는 함수는 lambda_handler 함수 이기 때문에 해당 내용을 작성해 줘야 한다.

+ 버튼을 클릭하여 파일을 생성하고 아래의 캡쳐 화면처럼 lambda_function.py라는 파일을 생성한다.

그리고 아래 처럼 코드를 작성한다.

람다 핸들러는 2개의 파라미터 값을 받게 되어 있다. (event, context); 이다.

import json
import urllib.request
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    url = "https://www.google.com"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
    a_tags = soup.find_all("a")
    result_list = []
    for i in a_tags:
        result_list.append(i.get_text())
    return {
        'statusCode': 200,
        'body': json.dumps(result_list)
    }

해당 코드를 아래와 같이 AWS Lambda  코드에서 보면 아래와 같다.

해당 코드를 실행 후 API Gateway 엔드포인트 URL을 호출해보면 아래와 같이 Google 메인 페이지의 a 태그 내용을 크롤링 하여 화면에 뿌려주는 모습을 볼 수 있다.

람다 코드를 작성해 놓으면 접속 할때마다 크롤링 된 데이터를 받아 볼 수 있다.