【问题标题】:How to set up a python application with selenium in a docker container如何在 docker 容器中使用 selenium 设置 python 应用程序
【发布时间】:2019-05-05 20:31:54
【问题描述】:

我目前正在做一个项目,在 python 中构建一个网络爬虫,然后将其 dockerize 以便应用程序可以在任何机器上运行。我已经构建了 python 应用程序,使用 selenium 加载我正在抓取的网页。我不确定如何在 docker 中上传项目以及 web 驱动程序(如 geckodriver),以便它可以运行。我是否需要使用应用程序创建一个容器,并将其链接到另一个 selenium 容器?感谢您的帮助!

我的代码从我编译的文本文件中获取邮政编码列表,并使用这些代码在地图上的特定位置进行抓取。抓取数据后,它将数据附加到 csv 文件中。我需要它能够运行应用程序,然后将 csv 文件输出到主机。

编辑:我以前从未使用过 docker,但对它的工作原理进行了一些研究。请ELI5

【问题讨论】:

    标签: python-3.x selenium docker


    【解决方案1】:

    首先,您需要一个安装了所有软件包的 Docker 映像。让我们为此创建一个 Dockerfile。

    FROM ubuntu:bionic
    
    RUN apt-get update && apt-get install -y \
        python3 python3-pip \
        fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 \
        libnspr4 libnss3 lsb-release xdg-utils libxss1 libdbus-glib-1-2 \
        curl unzip wget \
        xvfb
    
    
    # install geckodriver and firefox
    
    RUN GECKODRIVER_VERSION=`curl https://github.com/mozilla/geckodriver/releases/latest | grep -Po 'v[0-9]+.[0-9]+.[0-9]+'` && \
        wget https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-linux64.tar.gz && \
        tar -zxf geckodriver-$GECKODRIVER_VERSION-linux64.tar.gz -C /usr/local/bin && \
        chmod +x /usr/local/bin/geckodriver && \
        rm geckodriver-$GECKODRIVER_VERSION-linux64.tar.gz
    
    RUN FIREFOX_SETUP=firefox-setup.tar.bz2 && \
        apt-get purge firefox && \
        wget -O $FIREFOX_SETUP "https://download.mozilla.org/?product=firefox-latest&os=linux64" && \
        tar xjf $FIREFOX_SETUP -C /opt/ && \
        ln -s /opt/firefox/firefox /usr/bin/firefox && \
        rm $FIREFOX_SETUP
    
    
    # install chromedriver and google-chrome
    
    RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
        wget https://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
        unzip chromedriver_linux64.zip -d /usr/bin && \
        chmod +x /usr/bin/chromedriver && \
        rm chromedriver_linux64.zip
    
    RUN CHROME_SETUP=google-chrome.deb && \
        wget -O $CHROME_SETUP "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" && \
        dpkg -i $CHROME_SETUP && \
        apt-get install -y -f && \
        rm $CHROME_SETUP
    
    
    # install phantomjs
    
    RUN wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 && \
        tar -jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 && \
        cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs && \
        rm phantomjs-2.1.1-linux-x86_64.tar.bz2
    
    
    RUN pip3 install selenium
    RUN pip3 install pyvirtualdisplay
    RUN pip3 install Selenium-Screenshot
    
    ENV LANG C.UTF-8
    ENV LC_ALL C.UTF-8
    ENV PYTHONUNBUFFERED=1
    
    ENV APP_HOME /usr/src/app
    WORKDIR /$APP_HOME
    
    COPY . $APP_HOME/
    
    CMD tail -f /dev/null
    CMD python3 example.py
    

    它最终会运行你的程序。就我而言,它是 example.py

    现在将 example.py 放在与 Dockerfile 相同的目录中。下面给出了 Firefox、Chrome 和 Phantom JS 的示例。

    import os
    import logging
    
    from pyvirtualdisplay import Display
    from selenium import webdriver
    
    logging.getLogger().setLevel(logging.INFO)
    
    BASE_URL = 'http://www.example.com/'
    
    
    def chrome_example():
        display = Display(visible=0, size=(800, 600))
        display.start()
        logging.info('Initialized virtual display..')
    
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--no-sandbox')
    
        chrome_options.add_experimental_option('prefs', {
            'download.default_directory': os.getcwd(),
            'download.prompt_for_download': False,
        })
        logging.info('Prepared chrome options..')
    
        browser = webdriver.Chrome(chrome_options=chrome_options)
        logging.info('Initialized chrome browser..')
    
        browser.get(BASE_URL)
        logging.info('Accessed %s ..', BASE_URL)
    
        logging.info('Page title: %s', browser.title)
    
        browser.quit()
        display.stop()
    
    
    def firefox_example():
        display = Display(visible=0, size=(800, 600))
        display.start()
        logging.info('Initialized virtual display..')
    
        firefox_profile = webdriver.FirefoxProfile()
        firefox_profile.set_preference('browser.download.folderList', 2)
        firefox_profile.set_preference('browser.download.manager.showWhenStarting', False)
        firefox_profile.set_preference('browser.download.dir', os.getcwd())
        firefox_profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv')
    
        logging.info('Prepared firefox profile..')
    
        browser = webdriver.Firefox(firefox_profile=firefox_profile)
        logging.info('Initialized firefox browser..')
    
        browser.get(BASE_URL)
        logging.info('Accessed %s ..', BASE_URL)
    
        logging.info('Page title: %s', browser.title)
    
        browser.quit()
        display.stop()
    
    
    def phantomjs_example():
        display = Display(visible=0, size=(800, 600))
        display.start()
        logging.info('Initialized virtual display..')
    
        browser = webdriver.PhantomJS()
        logging.info('Initialized phantomjs browser..')
    
        browser.get(BASE_URL)
        logging.info('Accessed %s ..', BASE_URL)
    
        logging.info('Page title: %s', browser.title)
    
        browser.quit()
        display.stop()
    
    
    
    
    if __name__ == '__main__':
        chrome_example()
        firefox_example()
        phantomjs_example()
    

    最后我们将创建 Docker-compose.yml 来简化事情。

    selenium:
        build: .
        ports:
            - 4000:4000
        volumes:
            - ./data/:/data/
        privileged: true
    

    通过以下命令构建并运行。

    docker-compose build && docker-compose up -d

    你也可以不使用 docker-compose 通过 docker 命令运行它

    docker build -t selenium_docker .
    docker run --privileged -p 4000:4000 -d -it selenium_docker 
    

    来源:

    https://github.com/dimmg/dockselpy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多