[AWS] python과 awscli를 사용하여 간단한 웹스크래이핑을 해보자!


STUDY NOTE
개발을 하며 배우고 익힌 기술 / 개념을 남겨놓는 공간입니다.
잘못된 지식이나, 피드백은 언제나 환영입니다.

코딩 : ATOM
Amazon Management Console
AWS CLI (명령 줄 인터페이스)
Python 언어를 사용하여 코딩하고, AWS CLI로 코딩한 파일을 Amazon Management Console에 배포 후 테스트해보는 것을 목적으로 한다.
Python 코딩 및 실행
import sys,io,requests from bs4 import BeautifulSoup as bs //Atom 사용시 한글인코딩 sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8') //함수 def lambda_handler(event, context): link = requests.get('https://blog.naver.com/qwqqq12') html = bs(link.text, 'html.parser') result=html.find("title").text return{ 'statusCode':200, 'body':result }
나는 내 블로그의 title 부분을 긁어 오는 것을 목표로 구글에 돌아다니는 코드를 사용해보았다.
link에 입력된 주소는 블로그 주소이며, result에 입력된 'title'은 link 내의 title 부분을 긁어 온 다는 것이다.
이와 같은 코드를 blog.py라는 파일명으로 저장한 뒤, IDLE (Python 3.6 64-bit) 을 사용하여 코드를 실행시켜 보았다.
여기에서 requests나 bs4가 없다는 오류가 뜬다면 cmd에 접속하여 pip install requests 혹은 pip install bs4를 입력하여 install 하면 된다.
Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>>
IDLE 을 실행시키면 다음과 같은 코드가 나오며 Ctrl+O를 입력하여 위에서 코딩한. py 파일을 열어준다.
import sys,io,requests from bs4 import BeautifulSoup as bs //함수 def lambda_handler(event, context): link = requests.get('https://blog.naver.com/qwqqq12') html = bs(link.text, 'html.parser') result=html.find("title").text return{ 'statusCode':200, 'body':result } print(lambda_handler(1,2))
새 창이 뜨고 아까 입력한 코드가 뜨는데 return 은 모니터상에 표시되지 않으므로, 한눈에 보이길 원하여 제일 아래에 print() 함수를 추가하여 결괏값을 꺼내보았다.
* 실행은 F5
====================== RESTART: D:\awsclilambda\blog.py ====================== {'statusCode': 200, 'body': '느릿느릿 흘러가는 1상 : 네이버 블로그'} >>>
실행을 시키면 다음과 같은 코드가 나온다. :) !

AWS CLI를 사용하여 배포
코딩한. py 파일을. zip 파일로 압축을 해준 뒤에 배포를 시작한다.
//aws 계정입력 D:\awsclilambda> aws configure AWS Access Key ID [****************YWVF]: AWS Secret Access Key [****************vpKQ]: Default region name [ap-northeast-2]: Default output format [None]: //aws lambda에 올라간 function list 확인 D:\awsclilambda> aws lambda list-functions //압축한 zip파일을 aws lambda에 배포 D:\awsclilambda> aws lambda create-function --function-name blog --role "arn:aws:iam::************:role/ service-role/test" --handler blog.lambda_handler --runtime python3.7 --zip-file fileb://.\blog.zip { "FunctionName": "blog", "FunctionArn": "arn:aws:lambda:ap-northeast-2:937872287266:function:blog", "Runtime": "python3.7", "Role": "arn:aws:iam::937872287266:role/service-role/test", "Handler": "blog.lambda_handler", "CodeSize": 368, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2019-05-22T01:33:26.141+0000", "CodeSha256": "NHqFci70W0SWx2/ZXFkukrlkFusYecOJCtqJUtc92sk=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "4f53a254-67ce-4291-8dd6-ce17a1650556" }
aws configure
AWS Access Key ID : 액세스 키 ID
AWS Secret Access Key : 액세스 키 PW
Default region name [ap-northeast-2]: 리전
Default output format [None]: 데이터 유형
aws lambda create-function --function-name function 이름 --role "지정할 룰 ARN" --handler 함수 이름. lambda_handler --runtime python3.7 --zip-file fileb://.파일명. zip
위와 같은 단계를 지나게 되면 Lambda Management Console에서 배포한 함수를 볼 수가 있다.

Amazon Management Console 을 사용하여 테스트
테스트를 실행해보면 Unable to import module 'blog': No module named 'requests'라는 errorMessage가 뜨게 된다.
requests라는 import된 module을 못 찾는다는 뜻인데, import 파일을 Layers에 추가하면 해결되는 오류이다.
먼저 계층 카테고리로 들어간 후 계층 생성 버튼을 클릭한다.
requests와 BeautifulSoup가 들어가 있는 zip 파일을 업로드시켜준 뒤 생성 버튼으로 계층을 생성한다.
다시 돌아와 Designer 부분에서 Layers의 계층 추가를 선택한다.
나는 미리 만들어 두었던 계층을 선택했다.
선택 후 추가
저장한 뒤 테스트를 해보면, 위와 같이 성공적으로 테스트가 마무리된 것을 확인할 수 있다.
여러분의 댓글과 공감은 직장 노예의 엔도르핀이 됩니다 :)

Instagram @ turtle__ju
Facebook @ https://www.facebook.com/100005591914690

댓글

가장 많이 본 글