Dcoker + python/selenium에서 자동차 가게의 웹 페이지의 전체 화면 스크린 샷을 가져옵니다.

소개



WEB 페이지의 전체 화면 스크린 샷을 손쉽게 찍고 싶어지고 시험해 보았습니다.

docker/docker-compose는 별도로 설치하십시오.

등장인물


  • python3 실행 용 컨테이너 ※ 요청 실행 용
  • selenium HUB 용 컨테이너 ※ python3의 요청 수락
  • selenium Chrome 용 컨테이너

  • 실행 준비



    클라이언트 PC에 준비할 파일



    다음 파일을 준비합니다.
    - Dockerfile
    - docker-compose.yml
    - get-sc-website.py(※후술)

    Dockerfile (python3 실행 용 컨테이너)



    Docker 호스트 ⇄ python3 실행 컨테이너에서 파일을 교환 할 수 있도록하십시오.

    Dockerfile
    FROM python:3
    RUN pip install --upgrade pip && pip install selenium
    ADD . /opt
    WORKDIR /opt
    

    docker-compose (python / selenium 용)



    selenium은 단일 노드에서 시작됩니다.
    Firefox/Opera의 selenium 노드를 원하면 추가하십시오.

    docker-compose.yml
    version: '3'
    services:
      python3:
        restart: always
        build:
         context: .
         dockerfile: ./Dockerfile
        container_name: 'python3'
        working_dir: '/root/'
        tty: true
        volumes:
          - ./opt:/root/opt
    
      chrome:
        image: selenium/node-chrome:4.0.0-beta-1-20210215
        volumes:
          - /dev/shm:/dev/shm
        depends_on:
          - selenium-hub
        environment:
          - SE_EVENT_BUS_HOST=selenium-hub
          - SE_EVENT_BUS_PUBLISH_PORT=4442
          - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
        ports:
          - "6900:5900"
    
      selenium-hub:
        image: selenium/hub:4.0.0-beta-1-20210215
        container_name: selenium-hub
        ports:
          - "4442:4442"
          - "4443:4443"
          - "4444:4444"
    

    docker compose로 시작


    docker pull python:3
    docker compose up -d
    

    파이썬 파일 준비



    python3 실행 컨테이너에 배치합니다. 대상 WEB 페이지는 샘플입니다.

    get-sc-website.py
    import os
    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.common.exceptions import WebDriverException
    
    def screenshot(driver, filename):
      w = driver.execute_script('return document.body.scrollWidth')
      h = driver.execute_script('return document.body.scrollHeight')
      driver.set_window_size(w, h)
      driver.save_screenshot(filename)
    
    if __name__ == '__main__':
      ## set capabilities
      capabilities = DesiredCapabilities.CHROME.copy()
    
      driver = webdriver.Remote(
        ## set selenium server
        command_executor='http://selenium-hub:4444',
        desired_capabilities=capabilities
      )
      website = ['https://toyota.jp/',
                 'https://www.suzuki.co.jp/']
      ## get website
      try:
        ## increments of website[]
        i=0
        for filename in website:
          print(website[i])
          driver.get(website[i])
          filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), website[i].replace('/','').replace(':','')+".png")
          ## get screenshot
          screenshot(driver, filename)
          i+=1
        driver.quit()
      except WebDriverException:
        print('cannot get webpage')
    

    docker에서 python 실행



    파이썬 용 컨테이너에 배치하고 스크레이프 실행


    mv ./get-sc-website.py ./opt
    docker exec -it python3 python opt/get-sc-website.py
    

    실행 결과



    잠시 기다리면 ./opt 폴더에 <사이트 URL.png>로 이미지가 출력됩니다.
    (selenium은 실행 속도가 느립니다)


    끝에



    web의 URL을 바꾸면, 응용할 수 있으므로, 꼭 한번 시험해 봐 주세요!
  • 주의점
    selenium4.0이 된 후 요청 URL이 변경되었습니다.
  • 2.X/3.X) command_executor='http://localhost:4444/wd/hub'
    4.X) command_executor='http://localhost:4444/'
    

    좋은 웹페이지 즐겨찾기