On the journey of

[AWS 사전공인교육] 6-1. Lambda-Selenium으로 크롤링하기 본문

Experiences & Study/AWS

[AWS 사전공인교육] 6-1. Lambda-Selenium으로 크롤링하기

dlrpskdi 2023. 10. 20. 03:57

크롤링의 기초 코드는 예전에 다룬 적이 있다 :) https://nowolver.tistory.com/173

 

[AWS 사전공인교육] 10-1.Crawling 기본코드 정리

사실 AWS 사전공인교육이 아니더라도 크롤링은 데이터 수집의 가장 대표적인 방법론으로 언급되는 만큼, 내가 보기 위해서라도 정리할 필요가 있다고 생각해 노션에 올려만 뒀던 것들과 결합해

nowolver.tistory.com


이번에는 단순히 프로그램 깔자마자 이렇게 입력하세요! 가 아니라, lambda에서 실행 가능한 Selenium 등의 버전을 맞춰서 크롤링을 진행해보고자 한다. 그러나 현실적으로는 이 방법을 사용했을 때 특정 사이트는 Timeout/크롤링, 접속 자체를 막아두는 경우가 꽤 되며, click 등 기타 사용자의 동작이 인식되지 않는 문제도 있기에 BeautifulSoup (BS4)을 활용하여 진행하거나, 굳이 selenium을 쓰겠다면 Cloud9 환경에서 진행하는 것을 권장 :) 본 교육의 실습 환경은 아래와 같았다. 

 

실행 환경 : python3.7
Selenium : 3.13.0
  1. 우선 아래의 python library 압축해둔 파일을 다운로드한다 (AWS 측에서 공유해주신 파일이므로 개념 있게 쓰기!) https://drive.google.com/file/d/1m1Ui9LFOoXX0P-TBaxCxqvfZGzTUb-Ff/view?usp=sharing
 

layer.zip

 

drive.google.com

2. AWS 의 Lambda 에서 계층(Layer)을 생성

업로드 버튼을 누르고 위의 구글드라이브에서 다운로드 받은 파일을 선택해서 업로드하되,  여기에서 설정한 python 버전과 이후에 만들 람다함수의 python 버전과 일치해야 한다. Test 결과 python3.7까지는 정상적으로 실행된다

   3. 람다 함수 생성

람다 함수 생성 시 python 버전의 위에서 생성한 계층의 python 버전으로 설정한다.

 4. 람다함수에 계층 추가

: 람다함수가 생성되면 페이지 최하단에 계층이라고 있는데, 여기서 [Add a layer] 를 클릭합니다.

위에서 추가한 계층을 선택하고 추가 버튼을 눌러준다.

5. lambda 함수 작성

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import os



def lambda_handler(event, context):
    # TODO implement
    print("Starting google.com")
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--window-size=1280x1696')
    chrome_options.add_argument('--user-data-dir=/tmp/user-data')
    chrome_options.add_argument('--hide-scrollbars')
    chrome_options.add_argument('--enable-logging')
    chrome_options.add_argument('--log-level=0')
    chrome_options.add_argument('--v=99')
    chrome_options.add_argument('--single-process')
    chrome_options.add_argument('--data-path=/tmp/data-path')
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_argument('--homedir=/tmp')
    chrome_options.add_argument('--disk-cache-dir=/tmp/cache-dir')
    chrome_options.add_argument('user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36')
    chrome_options.binary_location = "/opt/python/bin/headless-chromium"

    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path='/opt/python/bin/chromedriver')
    

    # 여기서부터 코딩 시작하면 됩니다.
    page_data = ''
    
    driver.get('https://www.google.com')
    # 검색어 입력
    search_box = driver.find_element_by_name("q")
    if search_box:
        search_box.send_keys("Hello, Selenium")
        search_box.send_keys(Keys.RETURN)

        page_data = driver.page_source
            
    driver.close()
    return page_data

크롤링은 시간이 오래 걸리니 구성에서 실행 제한시간을 설정한다.

(크롬 로딩만 1분 걸리는데 참을 인에 익숙하다면 굳이 설정하지 않아도 된다. 그러나 나는 설정할 것..)

3초 → 15분으로 설정

 

6. 테스트 구성

테스트 버튼을 누르면 나오는 구성을 입력합니다.

7. 배포 및 실행

Deploy 후 테스트 버튼을 눌러서 실행! 간단한 예제로,  결과는 아래와 같다 (아이디는 가렸다)