Запуск Selenium на AWS Lambda - PullRequest
0 голосов
/ 22 октября 2019

Я знаю, что это часто задаваемый вопрос, я проверил много ответов и попробовал все, но все еще не могу найти решение.

Я пытаюсь запустить Selenium с Python 3.6 на AWS Lambda и создалпакет развертывания с использованием Docker. Я выполнил следующие действия для Docker:

sudo docker run -v $(pwd):/outputs --name linked_in -d amazonlinux:latest tail -f /dev/null
sudo docker exec -i -t linked_in /bin/bash /outputs/buildPack_py.sh

Вот так выглядит мой buildPack_py.sh файл:


python_install (){

  wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
  tar xJf Python-3.6.0.tar.xz
  cd Python-3.6.0

  ./configure
  make -j 5
  make install -j 5
  export PATH=/usr/local/bin/:$PATH
  cd ..
  rm Python-3.6.0.tar.xz
  rm -rf Python-3.6.0
}

dev_install () {
  yum -y update
  yum -y upgrade
  yum install -y \
  wget \
  curl \
  apt-get \
  gcc \
  gcc-c++ \
  findutils \
  zlib-devel \
  zip \
  xz \
  tar \
  make \
  openssl-devel \
  unzip \
  atlas atlas-devel lapack-devel blas-devel
#  curl https://intoli.com/install-google-chrome.sh | bash
#  mv /usr/bin/google-chrome /usr/bin/google-chrome-stable
  wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
  unzip chromedriver_linux64.zip
  curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
    unzip headless-chromium.zip -d bin/
}

install_packages () {
  cd /home/
    rm -rf env
  pip3 install virtualenv
  python3 -m virtualenv env --python=python3
  source env/bin/activate
  pip install datetime
  pip install requests
  pip install math
  pip install lxml
  pip install selenium
  pip install beautifulsoup4
  deactivate
}


gather_pack () {
  # packing
  cd /home/
    source env/bin/activate

  rm -rf lambdapack5
  mkdir lambdapack5
  cd lambdapack5

  cp -R /home/env/lib/python3.6/site-packages/* .
  cp -R /home/env/lib64/python3.6/site-packages/* .
  cp /outputs/linkedinScraper.py /home/lambdapack5/
  cp /chromedriver /home/lambdapack5/chromedriver
  cp /bin/headless-chromium /home/lambdapack5/headless-chromium
    echo "original size $(du -sh /home/lambdapack5 | cut -f1)"

  # cleaning libs
  rm -rf external
  #    find . -type d -name "tests" -exec rm -rf {} +

  # cleaning
  find -name "*.so" ! -name "_imaging.cpython-36m-x86_64-linux-gnu.so" | xargs strip
  #    find -name "*.so.*" | xargs strip
  find . -name test -type d -print0|xargs -0 rm -rf --
    rm -r pip
  rm -r pip-*
    rm -r wheel
  rm -r wheel-*
    rm easy_install.py
  find . -name \*.pyc -delete
  # find . -name \*.txt -delete
  echo "stripped size $(du -sh /home/lambdapack5 | cut -f1)"

  # compressing
  zip -FS -r9 /outputs/linkedinApi.zip * > /dev/null
  echo "compressed size $(du -sh /outputs/linkedinApi.zip | cut -f1)"
}

main () {
  dev_install
  python_install
  install_packages
  gather_pack
}

main

Я использую следующие версии:

chromedriver : 2,35 serverless-chromium : 1.0.0-37

Ошибка, которую я получаю после загрузки zip-файла в Lambda:

selenium.common.exceptions.WebDriverException: Сообщение: неизвестная ошибка: Не удалось запустить Chrome: аварийный выход

При просмотре других сообщений я обнаружил, что упомянутые выше версии хорошо работают вместе. Я также видел упоминание о Xvfb, но действительно ли это необходимо, если я использую браузер без головы.

Это часть кода Selenium:

    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument("--no-sandbox")
    options.add_argument('--disable-gpu')
    options.add_argument('--window-size=1280x1696')
    options.add_argument('--user-data-dir=/tmp/')
    options.add_argument('--hide-scrollbars')
    options.add_argument('--enable-logging')
    options.add_argument('--log-level=0')
    options.add_argument('--v=99')
    options.add_argument('--single-process')
    options.add_argument('--data-path=/tmp/')
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--homedir=/tmp/')
    options.add_argument('--disk-cache-dir=/tmp/')
    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')
    options.binary_location = "headless-chromium"
    driver = webdriver.Chrome(executable_path=os.path.abspath("chromedriver"),options=options)

Любая помощь очень ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...