Selenium과 헤드리스 크롬을 AWS lambda에 넣어 보았습니다. (Win10 환경하의 주의점 등)

6839 단어 람다파이썬
Python으로 Web Scraper를 만들 때 대상 대상이 client-side javascript로 가져올 때 단순히 urlopen에서 원하는 정보를 얻을 수없는 경우가 많습니다. 그러므로 Selenium이나 API (있는 경우)에서 얻는 경우가 많다고 생각합니다.

반면에 정기적이고 경제적으로 무언가를 실행하려면 on-demand AWS lambda와 CloudEvent를 사용하는 것이 좋습니다.

그럼 시작

절차



환경 구축



Windows 환경에서 Amazon Linux를 운영 체제로 사용하는 AWS lambda를 사용하려면 Windows 10 Ubuntu 또는 기타 remote linux server의 도움이 필요합니다. 이번에는 더 경제적인 방법으로 Ubuntu on Windows 10을 선택했습니다.

구체적인 설치 방법은 아래를 참조하면 됩니다.

Windows 10에서 Linux 사용

그런 다음 파이썬을 넣어 둡니다.
sudo apt-get update
sudo apt-get install python3.6

다음



환경이 정돈되면 Ubuntu에서 다음 작업을 수행합니다.

※Windows에서 압축해도 후에 Lambda에서 에러 발생하므로 요주의.
  • 알기 쉬운 장소로 이동, 다음은 예
  •  # Cディスクに移動する
      cd /mnt/c/  
      mkdir /path/to/folder
      cd /path/to/folder
    

    그러면 File Explorer에서 즉시 생성하여 파일을 찾을 수 있습니다. (나중에 S3에 넣을 때가 방편이됩니다)

  • headless chrome 과 chromedriver 얻기
  • 여기서주의해야 할 것은 새 버전의 headless-chromium을 사용해도 해당 chromedriver가 아닌 경우 오류가 발생합니다. 내가 사용한 것은 다음 두 가지

  • htps : // 기주 b. 코 m / 아에 우 아 아에 / 세 r ゔ ぇ r ぇ s ch 로메 / ぇ あ せ s / 타 g / v1.0.0-37stable-headless-chromium-64.0.3282.167-amazonlinux-2017-03.zip

  • htps // ch 로메 d리ゔぇr. s 가시. ㅇㅜㅜㅜㅜ 이 m/그리고 x. HTML? Path = 2.37 /chromedriver_linux64.zip

  • 그런 다음 압축을 풀고 다음과 같이 권한 조정 (chmod 777)하고 궁극적으로 다음과 같이 chrome 폴더에 저장하고 하나의 ZIP 파일로 압축합니다.
  •   chrome.zip
      chrome
      ├── chromedriver
      └── headless-chromium
    
  • Ubuntu에 셀레늄 패키지의 ZIP 파일을 만듭니다.
  •   mkdir python-selenium
      cd python-selenium
    
      python3 -m pip install --system --target ./ selenium
      zip -r python-selenium.zip ../python-selenium
    
  • chrome.zip & python-selenium.zip를 S3에 넣고 Object URL을 메모하고 레이어를 만듭니다.
  • 마지막 샘플을 움직입니다.
  •   from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
    
      def lambda_handler(event, context):
          options = Options()
    
          # 自分の対応するファイルパスを入れる
          options.binary_location = '/opt/chrome/headless-chromium'
          options.add_argument('--headless')
          options.add_argument('--no-sandbox')
          options.add_argument('--single-process')
          options.add_argument('--disable-dev-shm-usage')
    
          # 自分の対応するファイルパスを入れる
          browser = webdriver.Chrome('/opt/chrome/chromedriver', chrome_options=options)
          browser.get('https://www.google.com')
          title = browser.title
          browser.close()
          browser.quit()
    
          return {"title": title}
    

    여기서 주의하는 것은, Basic setting of lambda function(기본 설정)을 Example을 움직이려면 메모리 소모가 256MB 이상, Duration이 약 10초 했습니다(512MB, timeout:20s 설정의 경우), 사전 로 조정하여 상황을 보는 것이 좋습니다.

    Q&A



    혹시 의문이 있는 분 있을지도 모르기 때문에, 몇몇 자신이 할 때 당황하고 있던 것을 씁니다.

    Q : 왜 chrome 폴더에 넣고 압축합니까?

    A : 특별히 필요하지 않지만 Lambda에 레이어를 추가 할 때 zip 파일에있는 것을 /opt 폴더에 붙입니다. 예를 들어, /opt/chrome/chromedriver & /opt/chrome/headless-chromium
    Q: 그림과 같이, Windows 가지고 있는 zip화의 사용은 안 됩니까?



    A:실제로 그것을 Layer에 업로드하면Message: 'chromedriver' executable may have wrong permissions 라는 에러 메세지가 나오므로, 조사한 바, 아무래도 권한이 잘 붙지 않는 것 같다. 따라서 우분투에서 파일의 권한을 조정하고 압축합시다.

    참고


  • [Python] Headless Chrome을 AWS Lambda로 이동
  • 사용 AWS Lambda 적 "루프 (Layer)"

  • 결론



    뭔가 오류가 발생해도 당황하지 않고 lambda test 실행 후 오류 보고서를 확인하는 것이 좋습니다. 의외로 문제점이 명확하게 쓰여 있다.

    좋은 웹페이지 즐겨찾기